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

时间:2012-03-10 22:13:14

标签: antlr grammar antlr3 context-free-grammar

我在堆栈溢出中找到了与“多个替代品”相关的问题,但没有什么有用的。这是我在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)?时,警告消失。我也不明白这个原因。

1 个答案:

答案 0 :(得分:5)

  

Bhathiya写道:

     

有人可以解释一下这里发生了什么吗?谢谢。

让我们说你的意见是:

if (A) if (B) return 1 else return 2

你的语法含糊不清:解析器不“知道”如何解释这个。它可以通过两种方式实现(我添加了大括号来强调if块所属的else):

1

if (A) 
{
  if (B)
  {
    return 1
  }
  else
  {
    return 2
  }
}

enter image description here

2

if (A)
{
  if (B)
  {
    return 1
  }
}
else
{
  return 2
}

enter image description here

  

Bhathiya写道:

     

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

通过在ELSE之前添加谓词,你强迫解析器选择#1选项(并且解析器不会再发出警告,因为你明确告诉它在#2上选择#1替代) 。其结果与在那里放置谓词相同,但随后ANTLR会警告你,并提到它会忽略选项#2并且还会选择#1(消息:“As结果,对于该输入“)禁用了备选方案2。

现在,标题中的问题答案“如何删除警告'多个替代'?”,将使你的语法明确(或者只是将谓词留在那里,但是实现将永远不会有解析,如选项#2所示!)。您可以通过引入某种语句块分隔符来完成此操作,例如{}。或者像Python那样做:使缩进的空格数量区分ifelse所属的区域。这是你的选择。