我在堆栈溢出中找到了与“多个替代品”相关的问题,但没有什么有用的。这是我在antlr3中的g文件的一部分。
statement:
selection_stmt
| expression_stmt
| compound_stmt
| iteration_stmt
| return_stmt
;
selection_stmt:
IF OPENB expression CLOSB statement (ELSE statement)?
;
expression:
(var ASSIGN expression) => assignment
| simple_expression
;
我遇到的问题是我收到上述短语ELSE statement
的警告。
(200):决策可以使用多种替代方案匹配输入,例如“ELSE”:1,2结果,替代方案2是 已禁用该输入
有人可以解释一下这里发生了什么吗?谢谢。
P.S。
当我使用句法谓词((ELSE)=>ELSE statement)?
时,警告消失。我也不明白这个原因。
答案 0 :(得分:5)
Bhathiya写道:
有人可以解释一下这里发生了什么吗?谢谢。
让我们说你的意见是:
if (A) if (B) return 1 else return 2
你的语法含糊不清:解析器不“知道”如何解释这个。它可以通过两种方式实现(我添加了大括号来强调if
块所属的else
):
if (A)
{
if (B)
{
return 1
}
else
{
return 2
}
}
if (A)
{
if (B)
{
return 1
}
}
else
{
return 2
}
Bhathiya写道:
P.S。当我使用句法谓词
((ELSE)=>ELSE statement)?
时,警告消失。我也不明白这个原因。
通过在ELSE
之前添加谓词,你强迫解析器选择#1选项(并且解析器不会再发出警告,因为你明确告诉它在#2上选择#1替代) 。其结果与不在那里放置谓词相同,但随后ANTLR会警告你,并提到它会忽略选项#2并且还会选择#1(消息:“As结果,对于该输入“)禁用了备选方案2。
现在,标题中的问题答案“如何删除警告'多个替代'?”,将使你的语法明确(或者只是将谓词留在那里,但是实现将永远不会有解析,如选项#2所示!)。您可以通过引入某种语句块分隔符来完成此操作,例如{
和}
。或者像Python那样做:使缩进的空格数量区分if
和else
所属的区域。这是你的选择。