如何删除ANTLR3警告'多个替代品'

Bee*_*Bee 3 grammar antlr context-free-grammar antlr3

我在堆栈溢出中找到了与"多个替代"相关的问题,但没有什么有用的.这是我在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
    ;
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我收到上述短语的警告ELSE statement.

(200):决策可以使用多个备选方案匹配输入,例如"ELSE":1,2结果,对于该输入禁用了备选方案2

谁能解释一下这里发生了什么?谢谢.

PS当我使用句法谓词时((ELSE)=>ELSE statement)?,警告消失.我也不明白这个原因.

Bar*_*ers 5

Bhathiya写道:

谁能解释一下这里发生了什么?谢谢.

让我们说你的输入是:

if (A) if (B) return 1 else return 2
Run Code Online (Sandbox Code Playgroud)

你的语法含糊不清:解析器不"知道"如何解释这个.它可以通过两种方式做到这一点(我加了括号强调到ifelse块属于):

1

if (A) 
{
  if (B)
  {
    return 1
  }
  else
  {
    return 2
  }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

2

if (A)
{
  if (B)
  {
    return 1
  }
}
else
{
  return 2
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Bhathiya写道:

PS当我使用句法谓词时((ELSE)=>ELSE statement)?,警告消失.我也不明白这个原因.

通过之前添加谓词ELSE,您迫使解析器选择选项#1(并且解析器不再发出警告,因为您明确告诉它在#2上选择备选#1).这导致与不在那里放置谓词相同,但随后ANTLR将警告你,并提到它将忽略选项#2并且还将选择#1(消息:"因此,备选方案2被禁用对于那个输入").

现在,在标题中回答你的问题,"如何删除警告'多种选择'?" ,将使你的语法明确(或只是将谓词留在那里,但意识到永远不会有一个解析,如选项#2所示!).您可以通过引入某种形式的语句块分隔符,像这样做{}.还是像Python做的:使缩进空格的数量进行区分到if一个else属于.这是你的选择.