如何删除ANTLR3警告';多个备选方案';

如何删除ANTLR3警告';多个备选方案';,antlr,grammar,antlr3,context-free-grammar,Antlr,Grammar,Antlr3,Context Free Grammar,我在stackoverflow中发现了许多与“多个备选方案”相关的问题,但没有什么有用的。这是我在antlr3中的g文件的一部分 statement: selection_stmt | expression_stmt | compound_stmt | iteration_stmt | return_stmt ; selection_stmt: IF OPENB expression CLOSB statement (ELSE stat

我在stackoverflow中发现了许多与“多个备选方案”相关的问题,但没有什么有用的。这是我在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语句
给了我以下警告

(200):决策可以使用多个备选方案匹配输入,如“ELSE”:1、2因此,备选方案2被删除 已禁用该输入

有人能解释一下这里发生了什么吗?多谢各位

附言。 当我将语法谓词用作
((ELSE)=>ELSE语句)
时,警告消失。我也不明白为什么

Bhathiya写道:

有人能解释一下这里发生了什么吗?多谢各位

假设您的输入是:

if (A) if (B) return 1 else return 2
语法不明确:解析器不“知道”如何解释它。它可以通过两种方式实现(我添加了大括号以强调
if
else
块属于哪个
):

1.

2.

Bhathiya写道:

另外,当我使用语法谓词作为
((ELSE)=>ELSE语句)
时,警告消失。我也不明白为什么

通过在
ELSE
之前添加谓词,您强制解析器选择选项1(并且解析器不再发出警告,因为您明确告诉它选择替代选项1而不是选项2)。这与不在那里放置谓词的结果相同,但ANTLR将警告您,并提到它将忽略选项2,还将选择选项1(消息:“因此,该输入禁用了备选方案2”)


现在,标题“如何删除警告‘多个备选方案’?”中的问题的答案是使语法明确(或者只保留谓词,但要意识到永远不会有选项2中所示的解析!)。您可以通过引入某种语句块分隔符来实现这一点,如
{
}
。或者像Python那样做:使缩进空格的数量区分
if
else
所属。选择权在你

多谢各位。你的解释很好。我想要的是第一个选项。酷,那么你所需要的就是谓词。欢迎@Bhathiya。我这里还有几个问题()你能看一下吗?谢谢
if (A) 
{
  if (B)
  {
    return 1
  }
  else
  {
    return 2
  }
}
if (A)
{
  if (B)
  {
    return 1
  }
}
else
{
  return 2
}