ANTLR 直接递归文法规则

ANTLR direct recursive grammar rules

我正在尝试使用 ANTLR4 中的左递归语法规则。我的理解是,只要规则不是间接递归的,它就应该有效。第一个可行的替代方案应该是选择的路径。

那么为什么下面的语法编译不通过呢?据我所知,这似乎很简单。

grammar Hello;

stat: stat* '}'
      | ID
      ;

ID: [A-Za-z0-9]+;
WS: [ \t\r\n]+ -> skip;

ANTLR 不断出错...

error(119): Hello.g4::: The following sets of rules are mutually left-recursive [stat]

Antlr4 不解决一般情况下的递归问题。相反,它检测并处理四种特定的递归模式。检测到的模式对应于以下规则:

  • 二元运算符
  • 一元前缀运算符
  • 一元后缀运算符和
  • 三元运算符

当它检测到这样的模式时,antlr4 会在内部重写一个语法来解决它们,然后为重写的语法创建一个解析器。这允许它处理具有复杂运算符优先级层次结构的表达式,而不需要例如用户提供的语法中相应的表达式类型层次结构。

虽然不是完全通用,但 Antlr4 对这些模式的处理(加上在语法中注释运算符关联性的能力)确实完全涵盖了一个极其常见的用例。