ANTLR3:编译警告(200)“多个替代”

时间:2015-05-20 12:42:48

标签: compiler-warnings antlr3

我正在将antlrworks1.5与antlr3一起使用,并遇到以下警告/错误。我已经在这个问题上工作了几天,有人能给我一些暗示吗?提前谢谢。

最小化的语法文件是:

grammar p;

cs : '[' c ']';
c  : 'x' ('p' c)*;

AntLR报告以下警告:警告(200):决策可以使用多个替代方案匹配输入,例如“'p'”:1,2

TTP://i.stack.imgur.com/eg7cQ.png

http://i.stack.imgur.com/rnRvx.png

我想知道: (1)“匹配使用多个替代”的含义是什么?这是否意味着语法含糊不清?如果是,请问给我一些例子吗? (2)一般如何解决这个问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

语法确实含糊不清。要理解这一点,请通过转换为普通BNF替换Kleene星:

c ::= 'x' 
    | c 'p' c

现在这是左递归和右递归,因此派生可以在任一侧构建子树,从而为相同的单词创建不同的解析树。

直接来自EBNF,这是非常难以看到的。这里的区别在于解析树的深度不同,这取决于是否使用了重复:

       c                 c                           
      /|                /|\             
     / |               | | \
    / /|\              | |  \
   / / | \     vs.     | |   c           
  / /| | |             | |  /|\         
 | / c | c             | | | | c        
 | | | | |             | | | | |  
 x p x p x             x p x p x         

ANTLR对此的看法由SLL算法决定。处理重复时,必须决定是否 继续进行另一次迭代,或完成c制作的右侧。在任何一种情况下,都是前瞻性的 预期来自c的关注者的令牌 - 在第一种情况下,因为c位于重复部分的最后, 在第二种情况下,因为重复发生在c生产结束时。因此无法决定。

解决方案非常明显:确保有一种独特的方法来获得重复序列。在这种情况下,只需通过c : 'x' ('p' 'x')*;省略递归,或用选项c : 'x' ('p' c)?;替换Kleene星。