在语法定向翻译中, 赋值语句主要处理表达式。表达式的类型可以是实数, 整数, 数组和记录。
考虑语法
S→id := EE→E1 + E2E→E1 * E2E→(E1)E→id
【赋值语句的翻译】以上语法的翻译方案如下:
生产规则 | 语义动作 |
---|---|
S→id:= E | {p = look_up(id.name); 如果p≠nil, 则发射(p = E.place)其他错误; } |
E→E1 + E2 | {E.place = newtemp(); 发射(E.place = E1.place’ +’ E2.place)} |
E→E1 * E2 | {E.place = newtemp(); 发射(E.place = E1.place’ *’ E2.place)} |
E→(E1) | {E.place = E1.place} |
E→ID | {p = look_up(id.name); 如果p≠nil, 则发射(p = E.place)其他错误; } |
- p返回符号表中id.name的条目。
- Emit功能用于将三个地址代码附加到输出文件。否则它将报告错误。
- newtemp()是用于生成新的临时变量的函数。
- E.place持有E的值。