这是来自此问题的“后续”:How to parse a parenthesized hierarchy root?(请注意,root
规则现在已更名为)。为什么在这个规则中会出现递归溢出?
在我ANTLR语法,我现在尝试了强制转换将支持:
cast : '(' type ')' atom -> ^(CAST type atom);
现在,我需要它的价值树的一部分。由于投射本身是原子,可以是层次结构的基础,并且可以在任何二元运算(因子,总和,比较)中使用,我认为它必须在(以前的root
)规则中进行。
cast : '(' type ')' atom -> ^(CAST type atom);
atom : cast | IDENTIFIER | SELF | literal | constructor | call | indexer | '('! value ')'!;
hierarchy : atom (SUB^ (IDENTIFIER | call | indexer))*;
factor : hierarchy ((MULT^ | DIV^ | MODULO^) hierarchy)*;
sum : factor ((PLUS^ | MINUS^) factor)*;
comparison : sum (comparison_operator^ sum)*;
value : comparison;
幸运的是,这一次似乎一切都足够LL(*)。然而,我得到一个无限递归从type
到type
:
type : name=IDENTIFIER (LESSER (generics+=type (SEPARATOR generics+=type)*) GREATER)? -> ^(TYPE $name ^(GENERICS $generics*));
[规则原子]备选1 [铸造]:匹配输入诸如PAREN_OPEN IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER后{LESSER,SEPARATOR}决定无法预测由于递归溢出而引起的下一步到类型从类型
此案例反映了诸如(x<x<x<x<x[</,]
之类的内容。
ANTLR的错误非常难以理解。我重新阅读了解释这个确切错误的章节,但我仍然不明白。我也不明白的是,在独立的基础上,规则永远不会触发任何无限递归警告。
我该如何解决?请你理解ANTLR,你能解释为什么现在触发吗?
1.4.3 Here:http://pastie.org/private/sbx5dqcofvcihboheg8vja – Lazlo