【问题标题】:if else statement in yacc double executionyacc双重执行中的if else语句
【发布时间】:2018-01-01 22:33:07
【问题描述】:

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

我试过了

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

但是 $4 和 $6 是同时执行的

知道

AffectationI 等于 Var=3

【问题讨论】:

  • 栈上对应于$4(例如)的值是在减少第一个AffectationI时创建的(这早于第二个减少)。如果您不希望这种情况发生,您需要重新考虑您的语义操作。可能您想构建一个解析树,而不是随时评估。
  • 知道怎么做吗?因为我们落后了,我们没有研究语义分析

标签: compilation bison yacc compiler-construction


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2021-06-17
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多