编辑:我已将此问题添加为ANTLR的github:https://github.com/antlr/grammars-v4/issues/95。
我使用ANTLR版本4.3和C.g4从https://github.com/antlr/grammars-v4/blob/master/c/C.g4解析以下代码:
void bad()
{
foo(a);
}
语法将foo(a)
解释为declaration
,但它应该是postfixExpression
。我在这里粘贴了错误的解析树。
可以通过更改declaration
规则中statement
和blockItem
的顺序来正确解释它。这样做会打破别的吗?
答案 0 :(得分:2)
FOO的(a);是一个有效的声明,foo a;,以及表达式。 C11规格显示:
blockItem
: declaration
| statement
;
哪个ANTLR解释为解决声明的任何含糊之处。没有符号表信息,这个无法解决。 :(