我正在将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)一般如何解决这个问题?
非常感谢。
答案 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星。