如何在ANTLR4规则中修复相互左递归

时间:2013-08-26 19:11:04

标签: antlr

我正在尝试解析ANTLRWorks2中的一种语言:

grammar testLR;
pb: 'kind' '=' ID ';' pb
  | fd pb
  |
  ;
fd: ( 'instance' '=' ID ';' )*   
  ;
ID: ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$')*
  ;

然后ANTLRWork告诉我:“以下几组规则是相互左递归的[pb]”。我只是无法弄清楚如何解决问题。 欢迎任何建议。谢谢!

1 个答案:

答案 0 :(得分:3)

由于你的fd规则有一个*表示它可以是空的(* = 0或更多次) - 拥有一个空的fd意味着你的pb规则(第二行)将是一个pb:pb,这是不允许的解析器将永远循环。您可以通过不允许fd规则为空(将*更改为+)来修复此问题,但我不知道您的语法是否需要这样做。