📜  赋值语句的编译器翻译

📅  最后修改于: 2020-12-06 07:27:32             🧑  作者: Mango

转让声明的翻译

在语法定向翻译中,赋值语句主要处理表达式。表达式的类型可以是实数,整数,数组和记录。

考虑语法

S  →    id := E
E    →  E1 + E2
E   →   E1 * E2
E   →   (E1)
E   →   id

以上语法的翻译方案如下:

Production rule Semantic actions
S → id :=E {p = look_up(id.name);
 If p ≠ nil then
 Emit (p = E.place)
 Else
 Error;
}
E → E1 + E2 {E.place = newtemp();
 Emit (E.place = E1.place ‘+’ E2.place)
}
E → E1 * E2 {E.place = newtemp();
 Emit (E.place = E1.place ‘*’ E2.place)
}
E → (E1) {E.place = E1.place}
E → id {p = look_up(id.name);
 If p ≠ nil then
 Emit (p = E.place)
 Else
 Error;
}
  • p返回符号表中id.name的条目。
  • Emit函数用于将三个地址代码附加到输出文件。否则它将报告错误。
  • newtemp()是用于生成新的临时变量的函数。
  • E.place持有E的值。