【问题标题】:ANTLR3: compiling warning(200) "multiple alternatives"ANTLR3:编译警告(200)“多种选择”
【发布时间】:2015-05-20 12:42:48
【问题描述】:

我在使用 antlrworks1.5 和 antlr3 时遇到了以下警告/错误。我已经在这个问题上工作了几天,有人可以给我一些提示吗?提前谢谢你。

最小化的语法文件为:

grammar p;

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

AntLR 报告以下警告:warning(200):Decision can match input like "'p'" using multiple alternatives:1,2

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

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

我想知道: (1)'matched using multiple alternatives'是什么意思?这是否意味着语法有歧义?如果是,你能给我举个例子吗? (2) 一般如何解决这个问题?

非常感谢。

【问题讨论】:

    标签: compiler-warnings antlr3


    【解决方案1】:

    语法确实模棱两可。要理解这一点,请通过转换为普通 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')*; 来省略递归,要么将 Kleene 星号替换为选项 c : 'x' ('p' c)?;

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多