我在这里使用C语法:https://github.com/antlr/grammars-v4/tree/master/c来解析表达式int a2 = 5;
。 ANTLR版本是4.3。
" 5"这里匹配一大堆规则:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->
...大约10个-> primaryExpression->5
。
虽然最终解析是正确的,但这似乎是语法中的错误。有人可以建议修正或澄清吗?
答案 0 :(得分:4)
不,这不是错误。树的下方仅表示运算符的优先级越高。
规则被链接的事实可能是因为Terence从C11规范中编写了语法(它在语法的注释中这样说)。在官方规范中,规则可能就是这样写的。但是,您可以以更紧凑的方式重写语法。 ANTLR4允许直接递归规则,制定规则:
expr
: add
;
add
: mult (('+'|'-') mult)*
;
mult
: unary (('*'|'/') unary)*
;
unary
: '-' atom
| atom
;
atom
: '(' expr ')'
| NUMBER
;
相当于以下单一(ANTLR4)规则:
expr
: '-' expr
| expr ('*'|'/') expr // higher precedence than rules starting with `expr` defined below
| expr ('+'|'-') expr
| '(' expr ')'
| NUMBER
;
答案 1 :(得分:0)
语法可能设计不同,但结果不太深。
有关示例,请参阅https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L497。这在一个规则中将优先级结合在一起。我不确定是否可以为C
创建类似的规则(并且可读),但这可能是可能的。
这种规则(包括直接左递归)在以前版本的Antlr4中不可用,因此在这种规则不可用的时候可能已经创建了C
语法。