感谢Bilibili University的 致爱意,语法分析部分她的讲解视频提供了很大的帮助
- 绪论
- 形式语言概论
- 词法分析
- 语法分析
- 语义分析及中间代码生成
- 代码优化
- 符号表
绪论
编译程序的概念
程序:一系列指令或语句,用来描述计算机依次要执行的一系列工作。本质上是描述一定数据的处理过程
程序的层次结构:
结构:基本符号(字母,数组,符号等)、单词、表达式、语句、分程序、程序
程序设计语言:所有该语言的程序的全体
- 语法、语义、语用
- 语法:表示构成语言句子的各个记号之间的组合规律
是描述程序的结构,根据它可以产生正确的程序(词法规则,语法规则)。
语法规则和词法规则定义了程序的形式结构,定义语法单位的意义属于语义问题。- 词法规则:单词符号的形成规则(单词符号是语言中具有独立意义的最基本结构)
- 包括:常数、标识符、基本字、算符、界符(逗号、分号、括号、空白)
- 描述工具:有限自动机
- 语法规则:语法单位的形成规则
- 包括:表达式、语句、分程序、过程、函数、程序
- 描述工具:上下文无关文法
- 词法规则:单词符号的形成规则(单词符号是语言中具有独立意义的最基本结构)
- 语义:表示按照各种表示方法所表示的各个记号的特定含义
是语言成分的含义,由程序执行的效果来说明。各个记号和记号所表示的对象之间的关系。 - 语用:表示在各个记号所出现的行为中,它们的来源、使用和影响
编译程序:将程序翻译成汇编语言程序或机器语言程序(目标程序),然后再执行的翻译程序
编译过程
主要过程:
语法分析之后产生语法单位;目标代码之前都是四元式
词法分析:从左至右读取字符流的源程序,识别单词并表示成机内表示
语法分析:依据源程序的语法规则把源程序的单词序列组成语法短语
语义分析:分析由语法分析器给出的语法单位的语义
中间代码生成:源程序的内部表示(三元式、四元式、逆波兰表达式)
代码优化:对代码进行等价变换提高执行效率[运行速度、节省存储空间](机器有关、机器无关)
目标代码生成
符号表管理:每一步都会用到
前端:词法、语法、语义、中间代码生成,与机器无关的代码优化
后端:与机器有关的代码优化、目标代码生成
便于程序移植
遍
对源程序或源程序的中间表示从头到尾扫描一次
- 一遍可以由若干段组成
- 一个阶段也可以分若干遍来完成
形式语言自动机
形式语言:只在语法意义下的语言
字母表 ∑ \sum ∑:元素的非空有穷集合
符号:字母表中的元素
文法:描述语言的语法结构的形式规则或语法规则
作用:用有穷集合表示无穷句子
文法四元组: G ( V N , V T , P , S ) G(V_N,V_T,P,S) G(VN,VT,P,S),简记为 G [ S ] G[S] G[S]
V => W: V直接推导出W,W直接规约为V
句型 = { x ∣ S ⇒ ∗ x , 且 x ∈ V ∗ } \{x|S \stackrel{*}{\Rightarrow} x ,\ 且\ x\in V^* \} { x∣S⇒∗x, 且 x∈V∗},识别符号S也是句型
句子 = x , ( S ⇒ + x , 且 x ∈ V T ∗ ) x, (S \stackrel{+}{\Rightarrow} x ,\ 且\ x\in V_T^* ) x,(S⇒+x, 且 x∈VT∗), x x x仅由终结符号组成,句子也是句型
语言 L ( G ) = { x ∣ S ⇒ + x , 且 x ∈ V T ∗ } L(G) = \{x|S \stackrel{+}{\Rightarrow} x ,\ 且\ x\in V_T^* \} L(G)={ x∣S⇒+x, 且 x∈VT∗},文法G的一切句子的集合
文法的等价: L ( G 1 ) = L ( G 2 ) L(G_1) = L(G_2) L(G1)=L(G2)
文法的类型:对任一产生式 α → β \alpha \rightarrow \beta α→β,
- 0型文法: α ∈ ( V N ∪ V T ) + , β ∈ ( V N ∪ V T ) ∗ \alpha \in (V_N \cup V_T)^+,\ \ \beta \in (V_N \cup V_T)^* α∈(VN∪VT)+, β∈(VN∪VT)∗
- 1型文法(上下文相关): ∣ β ∣ ≥ ∣ α ∣ , S → ϵ 除 外 |\beta| \ge |\alpha|, \ \ S \rightarrow \epsilon除外 ∣β∣≥∣α∣, S→ϵ除外
- 2型文法(上下文无关): α ∈ V N , β ∈