我有以下语法来解析像这样的表达式,
-> a
-> (a)
-> (a | b | c)
-> (a (b | (c | d)) )
-> (a (
b (
c x
| d (e | f)
)
)
)
term: WORD term?
| '(' term ('|' term)* ')'
;
WORD : ('a'..'z')+
;
现在我尝试对术语规则中的第一个语句进行小修改,从WORD term?
到WORD term*
但是antlr抱怨说它不是LL(*),任何想法如何解决这个问题没有诉诸全球回溯。
答案 0 :(得分:0)
以下适用于ANTLR 4.1:
term: WORD term* | '(' term ('|' term)* ')';
WORD: ('a'..'z')+;
您使用的是什么版本的ANTLR?
答案 1 :(得分:0)
可能是斯蒂芬已经假设的版本问题。 LL(*)解析器和状态机从ANTLR的版本3开始存在,之前只是LL(k)
但为什么要替换术语?与期限*,因为你有条款*含义与术语?使用先前的规则定义,因为它已经是递归的。
你创造的是一个带有术语*的无限条件序列,其中序列中的每个项目都可以再次递归地解析为无限的术语等等。
我认为这是ANTLR错误输出的原因。我现在无法检查,但我很确定。
答案 2 :(得分:0)
我能够修改我的语法并最终得到了这个似乎适用于我所有情况。
term: (word | options_list)+
;
word: WORD
;
options_list: '(' term ('|' term)* ')
;
WORD: ('a'..'z' | 'A'..''Z' | '_' | '0'..'9')+
;