Java 语法帮助[Antlr non LL(*)]
我有下面的语法来解析这样的表达式Java 语法帮助[Antlr non LL(*)],java,antlr,Java,Antlr,我有下面的语法来解析这样的表达式 -> a -> (a) -> (a | b | c) -> (a (b | (c | d)) ) -> (a ( b ( c x | d (e | f) ) ) ) 现在我试着对术语规则中的第一个语句做一个小小的修改,从单词term?对于WORD term*,但antlr抱怨说它不是LL*,你知道如何在不诉诸全局回溯的情况下解决这个问题吗。以下内容适用于我的antlr
-> a
-> (a)
-> (a | b | c)
-> (a (b | (c | d)) )
-> (a (
b (
c x
| d (e | f)
)
)
)
现在我试着对术语规则中的第一个语句做一个小小的修改,从单词term?对于WORD term*,但antlr抱怨说它不是LL*,你知道如何在不诉诸全局回溯的情况下解决这个问题吗。以下内容适用于我的antlr 4.1:
term: WORD term* | '(' term ('|' term)* ')';
WORD: ('a'..'z')+;
您使用的是什么版本的ANTLR?可能是一个版本问题,就像Stephen已经假设的那样。LL*解析器和状态机存在,因为ANTLR的版本3之前的所有版本都是LLk 但为什么要替换这个术语呢?因为你把term和term联系起来了?使用先前的规则定义,因为它已经是递归的 您创建的是一个带有term*的无限项序列,序列中的每一项都可以再次递归地解析为无穷多个项,依此类推
我认为这就是ANTLR错误输出的原因。我现在无法检查,但我非常确定。我可以修改语法,最后得到的结果似乎适用于我的所有案例
term: (word | options_list)+
;
word: WORD
;
options_list: '(' term ('|' term)* ')
;
WORD: ('a'..'z' | 'A'..''Z' | '_' | '0'..'9')+
;
我使用的是3.x,我认为ANTLR4隐式地处理非LL*和左递归。
term: (word | options_list)+
;
word: WORD
;
options_list: '(' term ('|' term)* ')
;
WORD: ('a'..'z' | 'A'..''Z' | '_' | '0'..'9')+
;