编译原理-7-语义分析和中间代码生成

第七章 语义分析和中间代码生成

请添加图片描述

静态语义检查包括:
请添加图片描述

许多编译程序采用中间语言,而不是直接翻译成目标语言,好处:
请添加图片描述

7.1 中间语言

请添加图片描述

7.1.1 后缀式

先将运算级别最低的运算符提出来往后放
请添加图片描述

7.1.2

请添加图片描述

7.1.3

  • 三地址码: x = y op z
  • 四元式: (op, arg1,arg2, result)
  • 三元式: 为避免把临时变量填入到符号表,可以通过计算这个临时变量的语句位置来引用这个临时变量,这样只需要三个域(𝑜𝑝, 𝑎𝑟𝑔1, 𝑎𝑟𝑔2)

请添加图片描述

  • 间接三元式: 为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将按运算的先后顺序列出有关三元式在三元式表中的位置。
    请添加图片描述

7.2 说明语句

7.2.1 过程中的说明语句

请添加图片描述
在这里插入图片描述

根据语法,像符号表中将符号信息填入的一个过程

7.2.2 保留作用域的信息

请添加图片描述

每个过程都有一个符号表,同时也连接着上层的符号表,当在进行过程中,如果在本过程符号表中找不到,则要到上层符号表中查找,如果一直到上层还找不到,程序出错。

请添加图片描述
每进行一个新的过程时,都要创建新的符号表。

  • M → ϵ M\rightarrow\epsilon Mϵ 语句中完成创建新表的一系列初始化工作,创建新表,这个新表是对应主函数,因此上层表为空,将新表压入 tblptr. 将0压入offset 栈
  • 每遇到一个变量 id 需要声明的时候,可以从 top(tblptr) 中找到当前的符号表,向其中加入变量 ,通过 top(offset) 得到当前表的offset,并修改offset。例如 a : int; 我们就要像当前的表中加入 a 类型为 int,offset + 4
  • 当遇到子过程的时候 N → ϵ N\rightarrow\epsilon Nϵ 也创建一个新表,但是要注意子过程的表是有指先前创建的表的指针的.
  • 当一个子过程调用结束,将子表加入上一级表的表项中

在这里插入图片描述

7.3 赋值语句的翻译

请添加图片描述

请添加图片描述

注意:-E1沒有用 ‘-’ 而是用 @ 来代替负号

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值