这是这个问题的“后续”:如何解析带括号的层次结构根?(知道root
规则现在已重命名atom
)。
在我的 ANTLR 语法中,我现在尝试添加对强制转换的支持:
cast : '(' type ')' atom -> ^(CAST type atom);
现在,我需要让它成为价值树的一部分。由于演员表本身是原子的,可以作为层次结构的基础,并且可以用于任何二元运算(因子、求和、比较),我认为它必须符合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
但是,我从to得到无限递归type
:
type : name=IDENTIFIER (LESSER (generics+=type (SEPARATOR generics+=type)*) GREATER)? -> ^(TYPE $name ^(GENERICS $generics*));
[rule atom ] Alternative 1 [ cast ]:在匹配输入后,例如 PAREN_OPEN IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER LESSER IDENTIFIER {LESSER, SEPARATOR} 决策无法预测接下来会发生什么,因为从类型到类型的递归溢出
这种情况反映了诸如(x<x<x<x<x[</,]
.
ANTLR 的错误非常难以理解。我重新阅读了解释这个确切错误的章节,但我仍然不明白。我也不明白的是,在独立的基础上,该type
规则从未触发任何无限递归警告。
我该如何解决?请根据我对 ANTLR 的理解,您能解释一下为什么它现在会触发吗?