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 对这些模式的处理(加上在语法中注释运算符关联性的能力)确实完全涵盖了一个极其常见的用例。
我正在尝试使用 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 对这些模式的处理(加上在语法中注释运算符关联性的能力)确实完全涵盖了一个极其常见的用例。