Parsing 如何在我的代码中解决bison reduce/reduce冲突?
我是野牛队的新手。。我已经为if,else if和else语句编写了语法规则。。不过我还是减少了冲突。。有人能帮忙吗?我已经尝试了我所发现的一切,但正如我所说,我是新来的,我不知道到底发生了什么 这是我的密码:Parsing 如何在我的代码中解决bison reduce/reduce冲突?,parsing,grammar,bison,conflict,shift-reduce-conflict,Parsing,Grammar,Bison,Conflict,Shift Reduce Conflict,我是野牛队的新手。。我已经为if,else if和else语句编写了语法规则。。不过我还是减少了冲突。。有人能帮忙吗?我已经尝试了我所发现的一切,但正如我所说,我是新来的,我不知道到底发生了什么 这是我的密码: ifinstr: KW_IF expr_decl KW_THEN statements elseifinstr elseinstr KW_END ; elseifinstr : %empty {$$ = "";} | elseifinstr KW_ELSE K
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
;
问题是你提出的语法模棱两可。(我的意思是,第一种语法。建议的第二种解决方案是另一种语言。) 使用“else-if”构造以减少“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
如果没有融合的“else-if”,这些表达将更加繁琐:
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和许多其他不要求终止“if”语句的语言相矛盾,因此表现出“悬空的else”移位减少冲突,这种移位总是有利于移位。在这些语言中,由于“else”子句只是附加到最近的不匹配的“if”子句,因此不需要提供特殊的“else-if”标记
现在,您正试图通过使用融合的“else-if”而不融合它来结合这两种方法,这只会导致显式括号试图修复的相同的悬空else问题。例如,考虑:
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
的情况下有所不同。)
最简单的解决方案是使用一些融合的“else-if”标记,如上面的各种语言示例所示。(或者自己想一想:-)