编译原理与技术大纲
第一章 引论
1.1 编译器概述
1.1.1 词法分析
它分析扫描构成源程序的字符流,按编程语言的词法规则把它们组成词法记号流。
对于一个词法单元,词法分析产生的记号是
<记号名,属性值>
1.1.2 语法分析
它按编程语言的语法规则检查词法分析出的记号流是否符合这些规则
1.1.3 语义分析
把各个由语法分析得出的语法单元意义搞清楚
编译的各个阶段:
一个语句的翻译:
1.1.4 解释器
直接执行源程序指定的运算
1.1.5 编译器
通过翻译生成目标程序
第二章 词法分析
2.1 串和语言
串:字母表上的串是该字母表符号的有穷序列
语言:表示字母表上的一个串集
2.2 正规式
正规式(又称正规表达式):是按照一组定义原则,由较简单的正规式构成的,每个正规式r表示一个语言L(r)。
正规集:用正规式能表示的语言
运算优先级:闭包运算>连接运算>选择运算
2.3 正规定义
可以对正规式命名,并用这些名字来引用相应的正规式
正规定义:
形式为
d1->r1
d2->r2
···
dn->rn
正规定义举例:
letter_->[A-Za-z_]
digit->0|1|···|9
id->letter_(letter_|digit)*
number->digit+(.digit+)?(E(+/-)?digit+)?
2.4 不确定的有限自动机
不确定的有限自动机(Nondeterministic Finite Automaton,NFA):
“不确定”是指,存在这样的状态,对于某个输入符号,它存在不止一种转换。
2.5 确定的有限自动机
确定的有限自动机(Deterministic Finite Automaton,DFA):
某个输入符号,只有一种转换
2.5.1 从NFA到DFA的变换
例题1:为(a|b)*a(a|b)构造DFA
先画出NFA
构造Dtran,总共四种不同的集合
然后根据Dtran画出DFA图
例题2:DFA,识别{0,1}上能被5整除的二进制数
第三章 语法分析
3.1 上下文无关文法的定义
形式地说,一个上下文无关文法G是一个四元组(VT,VN,S,P),其中:
(1)VT是一个非空有限集合,其元素称为终结符
(2)VN是一个非空优先集合,其元素称为非终结符
(3)S是一个非终结符,称为开始符号
(4)P是产生式的有限集合
3.2 下列符号通常用作终结符/非终结符
3.3 文法二义性
对于文法E->E+E|E*E|(E)|-E|id
3.4 消除左递归
存在推导A=>+Aα,称这个文法是左递归的
由形式为A->Aα的产生式引起的左递归称为直接左递归
左递归产生式A->Aα|β 可以用非左递归的
A->βA'
A'->αA'|ε
来代替
3.5 LL(1)文法
3.5.1 LL(1)定义
3.5.1 求First集
方法:求文法符号串具有终结符的产生式的左边
举例:FIRST(E) = FIRST(T) = FIRST(F) = {(,id} (这里要求到具有终结符的产生式)
FIRST(E') = {+,ε} (这里文法的产生式已经具有终结符,不必再往下求)
FIRST(T') = {*,ε} (同上)
3.5.2 求Follow集
方法:求包含Follow(X)的X的右边,与X的产生式无关;$一定存在于Follow集中;之前的文法符号串的Follow集一定存在于它的产生式中的Follow集;假如X右边没有终结符,则将X右边符号串的FIRST集加入进去
举例:FOLLOW(E) = FOLLOW(E') = {),$} (和E'无关,直接看产生式E的右边,结果是")",放入Follow集中,$必放)
FOLLOW(T) = FOLLOW(T') = {+,),$} (因为FIRST(E')含有ε和+,ε默认去掉,加入+到Follow(E)中)
FOLLOW(F) = {+,*,),$} (F右边没有终结符,则将FIRST(T')加入到FOLLOW(T)中)
3.6 LR分析器
3.6.1 LR(0)项目
3.6.2 项目集规范族
DFA的每个状态是原NFA的一个状态子集,也就是LR(0)项目集。这些项目集叫做文法的LR(0)项目集规范族