针对期末考试的……有问题欢迎指出,毕竟我的水平连及格都难
编译的过程 词法分析-语法分析-语义分析及中间代码生成-中间代码优化-目标代码生成
编译程序
能够把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标程序),而后者与前者在逻辑上等价,这种程序称为编译程序。
词法分析的任务
输入源程序,对构成程序的字符串进行扫描和分解,识别出一个个的单词符号。 把需要存放的单词放到符号表中,如变量名,标号,常量等。
单词符号
构成语言的最小单元。如基本字 if,标识符,常数123,算符 +和界符 ;
词法单元
由一个词法单元名和一个可选的属性值组成。词法单元名是一个表示某种词法单位的抽象符号,比如一个特定的关键字,或者代表一个标识符的输入字符序列。词法单元名字是由语法分析器处理的输入符号。
模式:描述了一个词法单元的词素可能具有的形式。
词素: 源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。
语法分析的任务
在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。
中间代码
是一种含义明确、便于处理的记号系统,并独立于硬件系统。
优化的主要方面有:公共子表达式的提取、循环优化、删除无用代码等等
别人总结的一些概念
乐乐的总结
挺全的概念小结
DFA转正则表达式
将状态按 1、2、…、n 的顺序依次标号
先求任意状态 i 到 j(i 可以等于 j,即自身到自身),不经过其它状态的路径对应的正则表达式
求状态 i 到 j,最高只经过状态 1 的路径对应的正则表达式
求状态 i 到 j,最高只经过状态 2 的路径对应的正则表达式
依此类推……
求状态 i 到 j,最高只经过状态 n 的路径对应的正则表达式,即经过所有状态的路径对应的正则表达式
正则表达式转自动机
分解情况,这个比较简单,直接看也能看出来。如果遇上复杂的,就把复杂的部分单独列出来看然后再合在一起。
ab*a(ba)*
例题二
a(b|c)*转成NFA 简书截图
例题二
r=(a|b)*abb
正则表达式转换成NFA
可列状态表也可不列
我主要使用的是划分的方法
将所有状态先划分为两个集合,终极符集和非终极符集
再对集合进一步划分,例如:
终极符集中,每一个状态过边的集合内的每一个元素可指向的状态是终极状态还是非终极状态,可将集合内继续进行划分
最终划分就是极小化的最终结果
划分内的每一个集合是极小化自动机的状态结点
划分 П0=({4},{0,1,2,3})
G={0,1,2,3} 中
f(1,a)=4 f(3,a)=4 指向终态
f(0,a)=1 f(2,a)=1 指向非终态
划分可以进行更改
П1=({4},{0,2},{1,3})
G={0,2}中
f(0,b)=2 f(2,b)=4 0指向非终态,2指向终态
划分可以进行修改
П2=({4},{0},{2},{1,3})
G={1,3}中
f(1,b)=2 f(3,b)=2 均指向非终态,且均为2
故划分不修改
П=({4},{0,2},{1,3})
因此最终会有四个状态结点,图可以进行更改,删去3状态,将1状态换成{1,3}状态,图就不画了。
例题二
划分 П0=({0,1},{2,3})
G={0,1} 中
f(0,a)=0 f(1,a)=0
f(0,b)=1 f(0,b)=2 指向终态
划分可以进行更改
П1=({0},{1},{2,3})
G={2,3}中
f(2,a)=2 f(2,b)=3 指向终态
f(3,a)=2 f(3,b)=3 指向终态
划分不用修改
П=({0},{1},{2,3})
子集构造法
先求闭包,再求move
闭包T0=ε-closure(0)求的是在0状态,通过0-n次ε能到达的状态的集合
Ti+1=move(Ti,a)求的是Ti的集合中的状态通过一次a能到达的状态的集合
(不一定是Ti+1也可能是之前的Tk,求出的集合可能相等)
每次求一个Ti之后求一次move,move需要是边的所有值
最后通过Ti之间的关系求出转换后的图
例题一
NFA转DFA例题一
例题二
关于SLR和其他的一些知识点,可以看文章
语法分析3
语法分析4
句型:从开始符号按文法能推出来的语句
短语:由开始符号能推出含非终结符A的句型,A能推出β,则β是句型的短语
直接短语: 能由非终结符仅经过一步推导得出的短语
句柄:最左直接短语
已知文法G[E]:
E→T | E+T
T→F | T*F
F→i | (E)
给出句型(T+i)*i+F的所有短语、所有简单短语以及句柄
最左(右)推导:总是选择每个句型的最左(右)非终结符进行推导。
规范规约:每次都把句柄替换成相应产生式的左部,即最左规约。
对于简单问题(不用考虑优先级等问题)的自下而上语法分析有以下方法:
例题一
文法为E→E+T|T T→T*F|F F→(E)|i ,证明 E + T * F 是该文法的句型,指出这个句型的所有短语,直接短语和句柄。
解:E→E+T→E + T * F,所以是该文法的句型,
短语:E + T * F、T * F
直接短语:T * F
句柄:T * F
例题二
来源:编译原理——第五章自下而上语法分析
文法:
S→a|^|(T) T→T,S|S
(1)给出(a,(a,a))、(((a,a),^,(a)),a)的最左最右推导
(a,(a,a))
最左推导 S→(T)→(T,S)→(S,S)→(a,S)→(a,(T))→(a,(T,S))→(a,(S,S))→(a,(a,a))
最右推导 S→(T)→(T,S)→(T,(T))→(T,(T,S))→(T,(T,a))→(T,(S,a))→(T,(a,a))→(S,(a,a))→(a,(a,a))
(((a,a),^,(a)),a)
最左推导 S→(T)→(T,S)→(S,S)→((T),S)→((T,S),S)→((T,S,S),S)→(((T),S,S),S)→(((T,S),S,S),S)→(((S,S),S,S),S)→(((S,S), ^ ,S),S) →(((a,a), ^ ,(T)),S)→(((a,a), ^ ,(S)),S)→(((a,a), ^ ,(a)),S)→(((a,a), ^ ,(a)),a)
(2)写出规范规约及每一步的句柄
first集,follow集,predict集
例题一
文法:
S->MH|a
H ->LSo| ε
K ->dML| ε
L ->eHf
M->K|bLM
判断 G 是否为 LL(1) 文法,如果是,构造 LL(1) 分析表。
预测分析表看出没有多重入口,所以是LL(1)文法
例题二
E ->TE’
E’->+E| ε
T ->FT’
T’ ->T| ε
F-> PF’
F’-> *F’| ε
P->(E)|a|b|^
(1)计算这个文法的每个非终结符的 FIRST 集和 FOLLOW 集。
(2) 证明这个方法是 LL(1) 的。
(3) 构造它的预测分析表。
解:
(1)计算这个文法的每个非终结符的 FIRST 集和 FOLLOW集。
FIRST 集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST§={(,a,b,^};
FIRST(E’)={+,ε }
FIRST(T)=FIRST(F)=FIRST§={(,a,b,^};
FIRST(T’)=FIRST(T)U{ε}={(,a,b,^, ε};
FIRST(F)=FIRST§={(,a,b,^};
FIRST(F’)=FIRST§={, ε};
FIRST§={(,a,b,^};
FOLLOW 集合有:
FOLLOW(E)={),#};
FOLLOW(E’)=FOLLOW(E)={),#}; FOLLOW(T)=FIRST(E’)UFOLLOW(E)={+,),#};//不包含ε
FOLLOW(T’)=FOLLOW(T)=FIRST(E’)UFOLLOW(E)={+,),#}; FOLLOW(F)=FIRST(T’)UFOLLOW(T)={(,a,b,^,+,),#};//不包含ε
FOLLOW(F’)=FOLLOW(F)=FIRST(T’)UFOLLOW(T)={(,a,b,^,+,),#}; FOLLOW§=FIRST(F’)UFOLLOW(F)={,(,a,b,^,+,),#};//不包含ε
(2)证明这个方法是 LL(1)的。
各产生式的 SELECT 集合有:
SELECT(E->TE’)=FIRST(T)={(,a,b,^};
SELECT(E’->+E)={+};
SELECT(E’->ε)=FOLLOW(E/)={),#}
SELECT(T->FT’)=FIRST(F)={(,a,b,^};
SELECT(T’->T)=FIRST(T)={(,a,b,^};
SELECT(T’->ε)=FOLLOW(T/)={+,),#};
SELECT(F->PF’)=FIRST§={(,a,b,^};
SELECT(F’->F’)={};
SELECT(F’->ε )=FOLLOW(F’)={(,a,b,^,+,),#};
SELECT(P->(E))={(}
SELECT(P->a)={a}
SELECT(P->b)={b}
SELECT(P->)={}
可见,相同左部产生式的 SELECT 集的交集均为空,所以文法 G[E]是 LL(1)文法。
例题一
设文法G(S)为:
S—>a|aAb S—>b|bBa
A—>1A0|ε B—>1B0|ε
求①LR(0)项目集族;②构造识别文法G(E)的DFA;
例题二
已知文法G[S]
S→A A→BA | λ B→aB | b
(1)构造该文法的LR(1)归约规范活前缀状态机
(2)构造相应的LR(1)分析表