Parsing 如何在我的代码中解决bison reduce/reduce冲突?

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

我是野牛队的新手。。我已经为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 
;

问题是你提出的语法模棱两可。(我的意思是,第一种语法。建议的第二种解决方案是另一种语言。)

使用“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”标记,如上面的各种语言示例所示。(或者自己想一想:-)