Antlr,规则,其结果可能与另一个相同

Antlr,规则,其结果可能与另一个相同,antlr,grammar,ll,tiger,Antlr,Grammar,Ll,Tiger,对于编译项目,我的小组和我正在使用Antlr定义语法。 我们目前对这些规则存在问题: expr: ... | lvalue expr3 expr2 | ID '('exprList')' expr2 |... ; lvalue: ID lvalue2; lvalue2: '.' ID lvalue2 | '[' expr ']' lvalue2 | ; 正如您所看到的,左值可能会导致ID,从而导致非-LL()语法。 所以我的问题是:我们如何修改语法,使之成为LL(),而

对于编译项目,我的小组和我正在使用Antlr定义语法。 我们目前对这些规则存在问题:

expr: ...
| lvalue expr3 expr2
|  ID '('exprList')' expr2
|... ;


lvalue: ID lvalue2;

lvalue2: '.' ID lvalue2
    | '[' expr ']' lvalue2
    | ;
正如您所看到的,左值可能会导致ID,从而导致非-LL()语法。 所以我的问题是:我们如何修改语法,使之成为LL(),而不允许额外的东西


提前谢谢你

实际上,您可以重构规则,但另一方面,您在这里使用的不是左递归构造,因此您的结论不再是LL(k)是不正确的。您所拥有的只是两个以相同标记开始的备选方案。如前所述,考虑到这一点是克服这种情况的一种方法。另一种方法是简单地增加lookahead,这允许解析器也检查以下标记,以决定采用哪个alt

您可以在语法选项中设置先行值:

options {
  k = 2;
}
或在特定规则中仅增加该规则的值:

expr options { k = 2; }: ...
| lvalue expr3 expr2
|  ID '('exprList')' expr2
|... ;

注意:ANTLR 4没有这种问题,因为它总是有无限的前瞻性。

您必须考虑它:
expr:ID(左值2 expr3 |'('exprList'))expr2哦,是的,现在看起来很明显。谢谢谢谢你的回答。Antlrworks向我显示了一个非LL(*)错误,所以我猜我的语法不是LL(k)。主要的问题是我们必须把它设为LL(1),所以我不能使用你的解决方案。