野牛中的三元操作员,避免双方计算

时间:2014-11-26 17:06:34

标签: c++ parsing bison ternary-operator

我的三元运算符语法中有这个规则:

 Int:
    Boolean  '?' Int ':' Int {if($1==1) $$=$3; else $$=$5;} 
  | ...

对于数字和表达式,这工作正常,但假设a为整数时我有这段代码:

a=5

1==1 ? a++ : a++
cout<<a;// now a==6 is the correct print but I got a==7

计算':'的两侧,但我只需要一方。 我怎么能在野牛中做到这一点?

1 个答案:

答案 0 :(得分:2)

我看到在保持一遍解释器方法的同时实现所需的唯一方法是拥有一个控制评估是否发生的全局标志(当该标志设置为false时,解析规则通过将每个动作包含在if中,你可以正常解析但不执行任何事情。三元运算符的规则然后可以调用中规则动作或根据设置此标记的特殊解析规则条件。


解决此问题的正确方法是不直接在解析器中执行程序。而是让解析器构建一个AST(或者你喜欢的其他一些中间表示),然后你可以在另一个阶段中执行该程序。

在那个阶段,您可以在评估条件后轻松决定要评估的分支。这个逻辑看起来像这样:

class TernaryOperator : public IntExpression {
    // ...
  public:
    int eval() {
      if(condition.eval()) {
        return then_branch.eval();
      } else {
        return else_branch.eval();
      }
    }
}

当然以上只是一个例子,可能更好地使用访客模式编写。