语法帮助[Antlr non LL(*)]

时间:2013-12-23 10:31:04

标签: java antlr

我有以下语法来解析像这样的表达式,

-> 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(*),任何想法如何解决这个问题没有诉诸全球回溯。

3 个答案:

答案 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')+
    ;