如何删除ANTLR3警告';多个备选方案';
我在stackoverflow中发现了许多与“多个备选方案”相关的问题,但没有什么有用的。这是我在antlr3中的g文件的一部分如何删除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
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
}