Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 语法帮助[Antlr non LL(*)]_Java_Antlr - Fatal编程技术网

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