简单C表达式的大型解析树

时间:2014-06-30 08:37:11

标签: antlr4

我在这里使用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

虽然最终解析是正确的,但这似乎是语法中的错误。有人可以建议修正或澄清吗?

Image of parse tree

2 个答案:

答案 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语法。