如何解决野牛减少/减少我的代码中的冲突?

时间:2018-05-12 08:15:16

标签: 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 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 
;

1 个答案:

答案 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的情况下有所不同。)

最简单的解决方案是使用一些融合的"否则如果"令牌,如上面的各种语言示例。 (或者想想你自己:-))