0

在yacc程序中,我们如何编写使用c结构节点进行赋值操作的动作?

例子:-

stmt: stmt stmt ';'
    | exp ';'               {printtree();}
    | bool ';'              {...}
    | VAR ASSIGN exp ';'    {//How to store this value to VAR using node?}
    ...
    ;

exp: exp PLUS exp           {make_operator($1,'+',$3);// which stores a char '+' with  
                             left node to $1 and right node to $3 to the synatx tree
                            }
    | exp MINUS exp         {...}
    ...
    ;

如果有人可以为此提出解决方案,那将是非常有帮助的。

4

1 回答 1

1

答案是,由于您的 Yacc 解析器实际上并没有执行代码,而是生成了一个抽象语法树(正如make_operator在操作中使用函数所证明的PLUS那样,对赋值也做了同样的事情。它可能很简单:

stmt: stmt stmt ';'
    | exp ';'               {printtree();}
    | bool ';'              {...}
    | VAR ASSIGN exp ';'    {$$ = make_operator($1, '=', $3);}
    ...
    ;

生成代码以执行分配的实际工作将通过解析器构造的语法树的其他传递来完成。这些通行证必须做一些事情,例如确保VAR在给定范围内实际定义等等,具体取决于语言的规则:它是否具有正确的类型,是否可修改,......

分配的转换方案(至少是适合寄存器的简单标量变量)是:

  1. 生成代码以计算分配目标的地址,以便此代码将值留在新的临时寄存器中,调用它t1

  2. 生成代码以计算表达式的值,并将其留在另一个寄存器t2中。

  3. 生成mem[t1] := t2表示将 的值存储t2到 指向的内存位置的代码t1。(当然,这个中间代码并不是用文本来表示的mem[t1] := t2,而是一些指令数据结构。文本只是一个打印的符号,所以我们可以讨论它。)

于 2013-06-08T01:02:24.297 回答