前记:第一次使用LaTeX编辑公式,这个东西不错~让我意识到了转义符号’\’的强大威力!
吐槽:本人使用清华大学出版社的《编译原理》第二版,这本书真TM抽象,各种乱七八糟的形式化定义一个接着一个,看得我吐血了。考前突击,花了四天时间硬是把这本书的核心部分啃下来了,写下了8千字的”小”结~
《编译原理》(清华出版社)教材链接
1 词法分析 lexical analysis
词法分析是编译的第一个阶段:主要是从左至右逐个字符地对字符流的源程序(比如.c 和 .cpp)进行扫描,产生一个个单词(token)序列。简而言之:读入源程序,输出单词符号。单词符号是一个程序设计语言的基本语法符号,一般分为以下5种:
- 关键词:for, while, if, else, double, int
- 标识符:自己声明的变量、类/对象
- 常 数 :”hello, world”, 12345
- 运算符: >, =, ==, +
- 界 符 : 逗号,分号,花括号
按理说,词法也是语法的一部分。不过编译器把词法分析从语法分析中独立出来,是因为有些好处:
- 使整个编译程序的结构更加简洁、清晰、条理化
- 编译程序的效率会改进
- 增强程序的可移植性
词法分析做的一些细节工作:滤掉程序中的注释和空白(空白即空格、换行符、制表符) ;记录读入字符行的行号(比如编译器会提示error在第几行); 完成预处理,比如C/C++的#defile
正规集有两种表示工具:正规文法(3型文法)和正则式,正规集是正规文法所定义的语言和正规式所表示的集合。两种表示方法是等价的,可以互相转换。正则式即正则表达式,它由递归定义:首先设字母表是 ∑ ,辅助字母表是 ∑′={ ∑ , ε , ∣ , ⋅ , ( , ) }
- ε 和 ∅ 都是 ∑ 上的正规式,它们表示的正规集分别为 { ε} 和 ∅
- 任何 a ∈∑ ,a 是 ∑ 上的一个正规式,它表示的正规集为 { a}
- 假定 e1和e2 都是 ∑ 上的正规式,它们表示的正规集分别为L( e1 )和L( e2 ),那么 (e1) , e1∣e2 , e1⋅e2 , e∗1 也都是正规式,它们表示的正规集分别为 L(e1) , L(e1)⋃L(e2) , L(e1)L(e2) , (L(e1))∗
- 仅由有限次使用上述三步而定义的表达式才是 ∑ 上的正规式,仅由这些正规式所表示的字集才是 ∑ 上的正规集。可以看出经过递归调用,正规集 L“越来越大”
有穷自动机是一种识别装置,可以准确的识别正规集。分为两类:NFA(Nondeterministic Finite Automata,不确定的有穷自动机) 和 DFA(Deterministic Finite Automata,确定的有穷自动机) ,它们都可以用五元组 M(K,∑,f,S,Z) 表示。K 表示状态的有穷集, ∑ 表示字母表,f 表示状态转移的方法,S 是初态,Z 是终态。NFA 和 DFA的差距主要体现在 f 上面:DFA的 f 是“确定的”函数,某一个状态,输入某个字符,可以确定转移到哪一个状态上面去;NFA 的 f 的状态转移是不确定的映射,某一个状态,输入某个字符,可能转移到很多个状态上面去,不确定到底转到哪一个状态去。S 也有一点区别,DFA的 S 是唯一的,NFA 的 S 可能有多个。
NFA通过子集法可以转换到DFA,子集法的要点是掌握两种运算:闭包运算和弧转换运算。这里必考大题:正则式 –> NFA –> DFA,主意事项:1.确定化的时候不重复,不遗漏;2.假设NFA中的终态是Z,Z可能出现在DFA的多个状态中,那么这些出现过Z的状态都是终态,所以DFA中的终态可能会有多个;3.在“填写表格”(确定化)的时候,别忘记闭包了(虽然一些题目没有涉及 ε ),DFA的初态就是NFA初态的闭包,后面是不断先弧转换再闭包;4.DFA的初态的前面,不要忘记 ⇒ 。可能会遇到DFA最小化的题目,此时采用分割法:首先分成终态和非终态两个状态两个子集,然后不断尝试分割这些子集,直到不能继续分割为止。
2 语法分析 grammar analysis
1 概念
一个程序设计语言是一个记号系统,它的完整定义应包括语法和语义两个方面。所谓语言的语法是指一组规则,用它可以形成和产生一个合适的程序。语法定义什么样的符号序列式合法的。
重要概念和定义:
- 字母表:元素的非空有穷集和。字母表中的元素称为符号,字母表又称符号表,一般用 ∑ 表示
- 符号串:由字母表中的符号所组成的任何有穷序列。
- 符号串集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上面的符号串集合
- 闭包: ∑∗ , ∑ 上的所有有穷串的集合 。 ∑∗=∑0⋃∑1⋃∑2...⋃∑n...
- 正闭包: ∑+ ,在 ∑∗ 中去除 ∑0 即可
- 规则,又称产生式,形如 α→β 的有序对,读作“定义为”
- 文法 G定义为四元组 (Vn,Vt,P