我是新来的野牛..我已经为if,else if和else语句写了一个语法规则..虽然我减少了减少冲突..有人可以帮忙吗?我已经尝试了我发现的所有内容,但正如我告诉我的新内容,我并不清楚究竟会发生什么......
这是我的代码:
ifinstr: KW_IF expr_decl KW_THEN statements elseifinstr elseinstr KW_END
;
elseifinstr : %empty {$$ = "";}
| elseifinstr KW_ELSE KW_IF expr_decl KW_THEN statement
;
elseinstr : %empty {$$ = "";}
| KW_ELSE statement
;
我也试过这个解决方案,但却改变了冲突/减少冲突:
ifinstr: KW_IF expr_decl KW_THEN statements elseifinstr KW_END
;
elseifinstr : %empty {$$ = "";}
| elseifinstr KW_ELSE KW_IF expr_decl KW_THEN statement
| KW_ELSE statement
;
答案 0 :(得分:0)
问题是你提出的语法含糊不清。 (我的意思是第一个语法。建议的第二个解决方案是另一种语言。)
使用"否则如果"构建以减少" if ... end"的嵌套括号使用特殊标记:
Ruby Python VB Shell
---------------- ------------------- ----------------- --------------------
if n > 0 if n > 0: If n > 0 Then if ((n>0)); then
puts "Greater" print ("Greater") Print "Greater" echo Greater
elsif n == 0 elif n == 0: ElseIf n = 0 Then elif ((n==0)); then
puts "Equal" print ("Equal") Print "Equal" echo Equal
else else: Else else
puts "Less" print ("Less") Print "Less" echo Less
end End fi
没有融合的"否则如果",这些表达式会更麻烦:
Ruby Python VB Shell
---------------- ------------------- ----------------- --------------------
if n > 0 if n > 0: If n > 0 Then if ((n>0)); then
puts "Greater" print ("Greater") Print "Greater" echo Greater
else else: Else else
if n == 0 if n == 0: If n = 0 Then if ((n==0)); then
puts "Equal" print ("Equal") Print "Equal" echo Equal
else else: Else else
puts "Less" print ("Less") Print "Less" echo Less
end end End fi
end End fi
这会受到C,Java和许多其他语言的限制,这些语言不需要"如果"陈述被终止,因此展示了“晃来晃去的其他”#34;转移 - 减少冲突,总是有利于转变。在那些语言中,因为" else"条款简单地附加到最接近的不匹配的" if"条款,没有必要提供特殊的" else-if"令牌。
现在,您正试图通过使用融合的" else-if"来结合这两种方法。没有融合它,这只会导致明显的包围试图解决的同样悬挂的其他问题。例如,考虑一下:
if C1 then S1 else if C2 then S2 else if C3 then S3 else S4 end S5 end
现在,这代表以下两个中的哪一个?
if C1 then if C1 then
S1 S1
else if C2 then else
S2 if C2 then
else S2
if C3 then else if C3 then
S3 S3
else else
S4 S4
end end
S5 S5
end end
(有更多时间我可能会找到一个更简单的例子。上述两种解释在执行S5
的情况下有所不同。)
最简单的解决方案是使用一些融合的"否则如果"令牌,如上面的各种语言示例。 (或者想想你自己:-))