if if语句在yacc中双重执行

时间:2018-01-01 22:33:07

标签: compilation bison yacc compiler-construction

我们如何在yacc中实现if else?

我试过这个

|IF log THEN AffectationI ELSE AffectationI {if ($2) $$=$4; else $$=$6;}

但$ 4和$ 6都同时执行

知道

  

AffectationI等于Var = 3

1 个答案:

答案 0 :(得分:1)

yacc生成一个解析器,而不是一般的程序评估器,所以如果你想要执行你正在解析的程序,你需要实现一些能够做到这一点的程序。最简单的方法是让你的解析器生成一个不评估任何东西的树,然后有一个单独的evaulator,通过遍历它来“执行”树中的代码。这样你就可以很容易地跳过不应该执行的树的部分 - 或者反复遍历可以多次评估的树的部分,比如循环。

或者,您可以拥有一个全局“条件”标志,用于控制是否应该执行某些操作,并在操作中对其进行操作。使用这种方法,if语句变为:

statement:
    IF expression
        { $$ = condition_flag; // save the previous condition
          if (condition_flag) condition_flag = $2; }
    THEN statement_list
        { if ($3) condition_flag = !condition_flag; }
    ELSE statement_list
        { condition_flag = $3; } // restore previous condition