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)?,警告消失.我也不明白这个原因.
Bhathiya写道:
谁能解释一下这里发生了什么?谢谢.
让我们说你的输入是:
if (A) if (B) return 1 else return 2
Run Code Online (Sandbox Code Playgroud)
你的语法含糊不清:解析器不"知道"如何解释这个.它可以通过两种方式做到这一点(我加了括号强调到if该else块属于):
if (A)
{
if (B)
{
return 1
}
else
{
return 2
}
}
Run Code Online (Sandbox Code Playgroud)
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属于.这是你的选择.