在语法定向翻译中, 赋值语句主要处理表达式。表达式的类型可以是实数, 整数, 数组和记录。
考虑语法
S → id := E
E → E1 + E2
E → E1 * E2
E → (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的值。
评论前必须登录!
注册