一、语义分析器
作用:紧接在词法分析和语法分析之后,编译程序要做的工作是进行静态语义检查和翻译。
静态语义检查:
- 类型检查。操作数于操作符类型一致
- 控制流检查。控制转移到合理位置
- 一致性检查。变量只能声明一次,同一case语句的标号不能相同,枚举类型的元素不能相同等
- 变量作用域分析
- 等等
翻译:
翻译成中间代码
二、中间代码的语言形式
1、逆波兰式(又称:后缀表达式)
方法:把运算量(操作数)写在前面,把算符写在后面。
2、图表示法(DAG 和 AST)
- DAG:有向无环图
- AST:抽象语法树
二者区别:公共表达式表现不同;DAG通过多个父节点表示,AST通过重复子树表示。
3、三地址代码(三元式、四元式、间接三元式)
三地址:2个操作数地址 + 1个操作结果地址
具体存储实现:四元式、三元式、间接三元式
- 四元式:[op, 操作数1地址,操作数2地址,操作数结果存储地址 | 跳转op的下一个地址]
- 三元式:标号【op,操作数1地址,操作数2地址]
一条三地址语句,一行。
- 间接三元式:【间接代码表】、地址标号【op,操作数1地址,操作数2地址]
一个操作,一行。在使用间接代码表表示三地址代码执行顺序。
三、语义分析中各种语句的处理
1、声明语句
不生成可执行代码,只涉及符号表的操作。
2、赋值语句翻译
包括:在符号表查找名字,存取数组和记入的元素。
会生成中间代码,可用AST、三地址码形式表示
简单赋值语句:
数组:
3、布尔表达式翻译
布尔表达式:优先级(高->低):not、and、or
关系表达式:
a < b 等价于 if a<b then 1 else 0
例子:
4、控制语句翻译
If语句:
while语句:
在例如:
--------------------------------------------------本文结束------------------------------------------------------------------
博主说:
各位看官,你们好!
到这篇文章为止,编译原理中关于编译器概述、文法、词法分析、语法分析和语义分析的相关理论知识就结束了!
对于剩下的优化器和目标代码生成器,我就不再写了(因为,我也不会。😂😂😂)。对于编译器的实现有兴趣的小伙伴们,可以另外找文章阅读。
感谢看官们,垂爱这篇文章。🙇♂️🙇♂️🙇♂️。
任意门:
编译原理------语法分析器(一) 自上而下的推导(LL1文法)-CSDN博客