0

考虑以下语法规则:

forstmt: for openparentheses nexpr semicolon expr semicolon nexpr closeparentheses stmt {}

nexpr: expr { }
    | %empty { }

expr: .
      .
      .
      // something huge
      .
      .
      .

它是如下 for 循环的解析器规则(通常的 C 类 for 循环):

for(i=0; i<10; i++){
    Print("hello world");
}

我必须为这个 C 生成 IR,比如 for 循环(forstmt)。
IR forexpr已经写好了。
关键是 lastnexpr的 IR 应该在stmt.
我知道中间规则动作,我认为我可以使用堆栈以某种方式解决这个问题,但我的想法并没有得出任何结论。
究竟有没有办法阻止野牛最后生成 IRnexpr并使其在stmt?
换句话说,如何使最后的所有动作都nexprstmt?
有没有人遇到过这样的问题?

4

2 回答 2

2

通常,您在内存中生成 IR(内部表示),因此您可以在解析程序后对其进行操作,这使您可以分析整个程序并按照您认为合适的方式重新排序。因此,生成 IR 的顺序无关紧要。

如果您尝试在解析操作时直接在操作中生成代码,则需要进行设置以使其正常工作,通常是通过分支来实现。所以你可能会做类似的事情:

forexpr:
    FOR '(' expr ';' {
        $$.l1 = create_label();   // creates a unique label
        output_label($$.l1);  // the label is at this point in the code
    } expr ';' {
        $$.l1 = create_label();
        $$.l2 = create_label();
        $$.l3 = create_lable();
        output_jump_if_true($6, $$.l1);  // conditional branch
        output_jump($$.l2);              // unconditional branch
        output_label($$.l3);
    } expr ')' {
        output_jump($5.l1);
        output_label($8.l1);
    } stmt {
        output_jump($8.l3);
        output_label($8.l2);
    }

不用说,这是非常不理想的。

于 2022-02-06T00:52:48.940 回答
0

必须手工完成!
野牛没有,甚至不应该有任何东西!
我的解决方案是如何在代码生成器中保存生成的 IR 并在 for 循环之后释放它stmt

于 2022-02-05T22:44:32.097 回答