我正在通过修改 C 语法并尝试自己感兴趣的事情来学习 ANTLR。我入手的C语法来自:http://www.antlr.org/grammar/1153358328744/C.g
现在我想将 postfix_expression
转换为其相应的 AST,但不知道任何与转换形式 xx (aa|bb|cc)* yy
相关的内容
...
unary_expression
: postfix_expression
| unary_operator^ unary_expression
;
postfix_expression
: primary_expression
( '[' expression ']'
| '(' ')'
| '(' argument_expression_list ')'
| '.' ID
)*
;
unary_operator
: '+'
| '-'
| '~'
| '!'
;
...
你能帮我解决这个问题吗?您可以在语法中的 postfix_expression
部分添加一些 ^
和/或 !
符号。
最佳答案
我会选择这样的东西:
grammar T;
options {
output=AST;
}
tokens {
ROOT;
MEMBER;
INDEX;
CALL;
}
parse
: unary_expression EOF -> ^(ROOT unary_expression)
;
unary_expression
: postfix_expression
| unary_operator unary_expression -> ^(unary_operator unary_expression)
;
postfix_expression
: primary_expression tail* -> ^(primary_expression tail*)
;
tail
: '[' expression ']' -> ^(INDEX expression)
| '(' argument_expression_list? ')' -> ^(CALL argument_expression_list?)
| '.' ID -> ^(MEMBER ID)
;
primary_expression
: ID
| '(' expression ')' -> expression
;
argument_expression_list
: expression (',' expression)* -> expression+
;
unary_operator
: '+'
| '-'
| '~'
| '!'
;
expression
: NUMBER
| ID
;
NUMBER : '0'..'9'+;
ID : ('a'..'z' | 'A'..'Z')+;
它将解析输入:
a.b.c(foo,42)[123]
进入以下 AST:
使从左到右计算表达式变得容易。
关于c - 如何将 ANTLR C 语法中的 postfix_expression 转换为 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701411/