Compilation yacc双重执行中的if-else语句

Compilation yacc双重执行中的if-else语句,compilation,bison,yacc,compiler-construction,Compilation,Bison,Yacc,Compiler Construction,我们如何在yacc中实现if-else 我试过这个 |IF log THEN AffectationI ELSE AffectationI {if ($2) $$=$4; else $$=$6;} 但是$4和$6都是同时执行的 知道 affectation i等于Var=3 yacc生成的是一个解析器,而不是一个通用的程序求值器,因此,如果您想执行正在解析的程序,您需要实现一些可以做到这一点的东西。最简单的方法是让解析器生成一棵树,而不是对任何内容求值,然后让一个单独的求值器通过遍历树来“执行

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

我试过这个

|IF log THEN AffectationI ELSE AffectationI {if ($2) $$=$4; else $$=$6;}
但是$4和$6都是同时执行的

知道

affectation i
等于Var=3


yacc生成的是一个解析器,而不是一个通用的程序求值器,因此,如果您想执行正在解析的程序,您需要实现一些可以做到这一点的东西。最简单的方法是让解析器生成一棵树,而不是对任何内容求值,然后让一个单独的求值器通过遍历树来“执行”树中的代码。这样,您可以轻松跳过树中不应该执行的部分,或者重复遍历树中可以多次计算的部分,如循环

或者,您可以使用一个全局“条件”标志来控制是否应该执行某些事情,并在您的操作中对其进行操作。使用此方法,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

堆栈上对应于
$4
(例如)的值是在第一个
影响减少时创建的(在第二个
减少之前很久)。如果你不想发生这种情况,你需要重新考虑你的语义行为。可能你想建立一个解析树,而不是边计算边做。你知道怎么做吗?因为我们落后了,我们没有研究语义分析