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

静态语义检查包括:

许多编译程序采用中间语言,而不是直接翻译成目标语言,好处:

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

7.3 赋值语句的翻译


注意:-E1沒有用 ‘-’ 而是用 @ 来代替负号
本文详细介绍了编译程序的静态语义检查,包括中间语言的使用,如后缀式和三地址码。静态语义检查涉及符号表管理,每个过程拥有独立的符号表,且连接上层表。赋值语句的翻译中,注意符号的表示。此外,还讨论了如何处理子过程的符号表和作用域信息。
1426

被折叠的 条评论
为什么被折叠?



