第七章 语义分析和中间代码生成
静态语义检查包括:
许多编译程序采用中间语言,而不是直接翻译成目标语言,好处:
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沒有用 ‘-’ 而是用 @ 来代替负号