我们如何在yacc中实现if else?
我试过这个
|IF log THEN AffectationI ELSE AffectationI {if ($2) $$=$4; else $$=$6;}
但$ 4和$ 6都同时执行
知道
AffectationI
等于Var = 3
答案 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