我试图在ANTLR4中使用左递归语法规则。我的理解是,只要规则不是间接递归的,它就应该有效。第一个可行的替代方案应该是选择的路径。
那么为什么下面的语法不能编译呢?据我所知,这似乎相当直接。
grammar Hello;
stat: stat* '}'
| ID
;
ID: [A-Za-z0-9]+;
WS: [ \t\r\n]+ -> skip;
ANTLR一直错误地用...
错误(119):Hello.g4 :::以下几组规则是相互左递归的[stat]
答案 0 :(得分:1)
Antlr4不解决一般情况下的递归问题。相反,它检测并处理四种特定的递归模式。检测到的模式对应于以下规则:
当它检测到这样的模式时,antlr4在内部重写语法以解决它们,然后为重写的语法创建一个解析器。这允许它处理具有复杂运算符优先级层次结构的表达式,而不需要例如用户提供的语法中相应的表达式类型层次结构。
虽然并非完全一般,但Antlr4对这些模式的处理(以及在语法中注释运算符关联性的能力)确实完全涵盖了一个非常常见的用例。