编译原理笔记
正规文法和正规式
正规式即正则表达式
正规文法为左线性或右线性文法
词法分析
源程序 -> 前端 -> 中间表示 -> 后端 -> 目标程序
前端
源程序 -> 词法分析器 -> 记号 -> 语法分析器 -> 抽象语法树 -> 语义分析器 -> 中间表示
词法分析器的任务
任务:字符流到记号流
字符流:和被编译的语言密切相关(ASCII,Unicode,or…)
记号流:编译器内部定义的数据结构,编码所识别出的词法单元
词法分析器的实现方法
-
手工编码实现法
相对复杂、且容易出错,但是是非常流行的实现方法(现在的编译器如GCC和LLVM就是手工编码) -
词法分析器的生成器
快速、代码量少,但是难以控制细节
正则表达式
给定字符集 ∑ = c 1 , c 2 , . . . , c n \sum={c_1,c_2,...,c_n} ∑=c1,c2,...,cn
归纳定义:
1. 空串 ϵ \epsilon ϵ 是正则表达式
2. 对于任意 c ∈ ∑ c\in\sum c∈∑, c是正则表达式
3. 如果M和N是正则表达式,则以下也是正则表达式
选择 M ∣ N = { M , N } M | N= \{M, N\} M∣N={
M,N}
连接 M N = { m n ∣ m ∈ M , n ∈ N } MN = \{mn | m\in M,n \in N \} MN={
mn∣m∈M,n∈N}
闭包 M ∗ = { ϵ , M , M M , M M M , . . . } M*=\{\epsilon , M , MM, MMM, ...\} M∗={
ϵ,M,MM,MMM,...}
有限状态自动机
自动机={待补充}
字符串分为 可被自动机接受的字符串 和 不可被自动机接受的字符串
可被自动机接受:可达到结束状态
不可被自动机接受:不可达到结束状态
确定的有限状态自动机:对任意字符,最多有一个状态可以转移
不确定的有限状态自动机:对任意的字符,有多于一个状态可以转移
正则表达式到非确定有限状态自动机
词法分析器自动生成的过程:
R E ( 正 则 表 达 式 ) → T h o m p s o n 算 法 N F A → 子 集 构 造 算 法 D F A → H o p c r o f t 最 小 化 算 法 词 法 分 析 器 代 码 RE(正则表达式) \xrightarrow[]{Thompson算法} NFA \xrightarrow[]{子集构造算法} DFA \xrightarrow[]{Hopcroft最小化算法} 词法分析器代码 RE(正则表达式)Thompson算法NFA子集构造算法