如何通过生成多个操作数来避免转移/减少冲突

时间:2015-09-20 21:14:36

标签: c++ bison

对于定义图形的简单语言,我有以下冲突规则:

  rm_arcs: RM ARC VARNAME VARNAME ref_exp ref_exp 
    {
      $$ = new RmArcNodes($3, $4, $5, $6); 
    }
  | RM ARC VARNAME ref_exp ref_exp 
    {
      $$ = new RmArcNodes($3, $4, $5); 
    }

哪些野牛队表示会导致3次转移/减少冲突。

ref_exp规则定义如下:

ref_exp : STRCONST
          {
            auto symbol = string_table($1);
            $$ = new StringExp(symbol);
          }
        | INTCONST
          {
             auto symbol = id_table($1);
             $$ = new IntExp(symbol);
          }
        | VARNAME
          {
            auto varname = var_tbl($1);
            if (varname == nullptr)
              {
                stringstream s;
                s << "var name " << $1 << " not found";
                $$ = new ErrorExp(s.str());
              }
            else
              $$ = varname;
          }
;

是否有任何简单的方法可以重写语法以消除这些冲突而无需修改语言?

此致

1 个答案:

答案 0 :(得分:4)

你应该能够通过简单地向Bison解释你想要的东西来做到这一点。添加ref_exp_without_varname作品(实施明显)。

然后改变

rm_arcs: RM ARC VARNAME VARNAME ref_exp ref_exp 
   | RM ARC VARNAME ref_exp ref_exp 

rm_arcs: RM ARC VARNAME ref_exp_without_varname ref_exp
       | RM ARC VARNAME VARNAME ref_exp
       | RM ARC VARNAME VARNAME ref_exp ref_exp

我认为这应该是相同的,但没有冲突,因为我明确消除了第4条的歧义。