编译原理——习题练习

针对期末考试的……有问题欢迎指出,毕竟我的水平连及格都难

文章目录

  • 知识点
  • 可能考的概念题
  • 应用题
    • 词法分析
      • 自动机与正则表达式的转换
        • 解题步骤
        • 例题
      • DFA极小化
        • 解题步骤
        • 例题
      • NFA转DFA
        • 解题步骤
        • 例题
    • 语法分析
      • 语法树
        • 知识点
        • 例题
      • 自下而上语法分析
        • 例题
      • 分析表
        • 知识点
        • 例题
      • 活前缀
        • 例题
    • 文法分析
      • 语法制导翻译器
    • 中间代码生成



知识点

  1. 编译各阶段功能,以及自展和移植的概念。
  2. 语法树,短语,句柄,简单短语……
  3. 正规表达式,先消除左递归、提取左因子,然后构造成NFA、DFA、最简DFA的全过程。
  4. 构造文法的预测分析表、算符优先分析表、LR(0)项目集族、SLR分析表、LR(1)项目集族、规范LR(1)分析表的过程。
  5. 将语句翻译成三地址代码的方法。



可能考的概念题

  1. 编译的过程   词法分析-语法分析-语义分析及中间代码生成-中间代码优化-目标代码生成

  2. 编译程序
    能够把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标程序),而后者与前者在逻辑上等价,这种程序称为编译程序。

  3. 词法分析的任务
    输入源程序,对构成程序的字符串进行扫描和分解,识别出一个个的单词符号。 把需要存放的单词放到符号表中,如变量名,标号,常量等。

  4. 单词符号
    构成语言的最小单元。如基本字 if,标识符,常数123,算符 +和界符 ;

  5. 词法单元
    由一个词法单元名和一个可选的属性值组成。词法单元名是一个表示某种词法单位的抽象符号,比如一个特定的关键字,或者代表一个标识符的输入字符序列。词法单元名字是由语法分析器处理的输入符号。

  6. 模式:描述了一个词法单元的词素可能具有的形式。

  7. 词素: 源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。

  8. 语法分析的任务
    在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。

  9. 中间代码
    是一种含义明确、便于处理的记号系统,并独立于硬件系统。

  10. 优化的主要方面有:公共子表达式的提取、循环优化、删除无用代码等等

  11. 别人总结的一些概念

  12. 乐乐的总结

  13. 挺全的概念小结



应用题




词法分析



自动机与正则表达式的转换



解题步骤

DFA转正则表达式

将状态按 1、2、…、n 的顺序依次标号
先求任意状态 i 到 j(i 可以等于 j,即自身到自身),不经过其它状态的路径对应的正则表达式
求状态 i 到 j,最高只经过状态 1 的路径对应的正则表达式
求状态 i 到 j,最高只经过状态 2 的路径对应的正则表达式
依此类推……
求状态 i 到 j,最高只经过状态 n 的路径对应的正则表达式,即经过所有状态的路径对应的正则表达式

正则表达式转自动机

了解基本的转换公式就可以画出来
编译原理——习题练习_第1张图片


例题

例题一
构造与下述自动机等价的正则表达式
在这里插入图片描述

分解情况,这个比较简单,直接看也能看出来。如果遇上复杂的,就把复杂的部分单独列出来看然后再合在一起。
ab*a(ba)*


例题二

a(b|c)*转成NFA 简书截图

编译原理——习题练习_第2张图片

例题二

r=(a|b)*abb
正则表达式转换成NFA
在这里插入图片描述



DFA极小化


解题步骤

可列状态表也可不列
我主要使用的是划分的方法

将所有状态先划分为两个集合,终极符集和非终极符集
再对集合进一步划分,例如:
终极符集中,每一个状态过边的集合内的每一个元素可指向的状态是终极状态还是非终极状态,可将集合内继续进行划分
最终划分就是极小化的最终结果
划分内的每一个集合是极小化自动机的状态结点


例题

例题一
将下图所示的DFA M进行最小化
编译原理——习题练习_第3张图片

划分 П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}状态,图就不画了。

例题二

将下图所示有限自动机化为最简自动机
编译原理——习题练习_第4张图片

划分 П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})
编译原理——习题练习_第5张图片



NFA转DFA



解题步骤

子集构造法

先求闭包,再求move
闭包T0=ε-closure(0)求的是在0状态,通过0-n次ε能到达的状态的集合
Ti+1=move(Ti,a)求的是Ti的集合中的状态通过一次a能到达的状态的集合
(不一定是Ti+1也可能是之前的Tk,求出的集合可能相等)
每次求一个Ti之后求一次move,move需要是边的所有值

最后通过Ti之间的关系求出转换后的图



例题


例题一

NFA转DFA例题一

该博客中没有给出状态转换表,其实也很好画
编译原理——习题练习_第6张图片


例题二

编译原理——习题练习_第7张图片

将这个非确定有限自动机确定化
编译原理——习题练习_第8张图片




语法分析



关于SLR和其他的一些知识点,可以看文章
语法分析3
语法分析4



语法树

知识点

句型:从开始符号按文法能推出来的语句
短语:由开始符号能推出含非终结符A的句型,A能推出β,则β是句型的短语
直接短语: 能由非终结符仅经过一步推导得出的短语
句柄:最左直接短语


例题

已知文法G[E]:
E→T | E+T
T→F | T*F
F→i | (E)
给出句型(T+i)*i+F的所有短语、所有简单短语以及句柄

编译原理——习题练习_第9张图片



自下而上语法分析


最左(右)推导:总是选择每个句型的最左(右)非终结符进行推导。
规范规约:每次都把句柄替换成相应产生式的左部,即最左规约。

对于简单问题(不用考虑优先级等问题)的自下而上语法分析有以下方法:

  1. 移进归约,即用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号;
  2. 规范规约,首先了解规范规约的定义,假定α是文法G的一个句子,如果序列αn,αn-1,… ,α0满足:(1)αn=α(2)α0为文法的开始符号,即α0=S(3) 对任何i,0
  3. 用符号栈进行自下而上的语法分析,取一个栈作为符号栈,在分析开始时,’#’预先进栈,作为栈底符号,将输入串中的符号依次入栈并规约,’#’作为输入串的结束符。

例题


例题一

文法为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)写出规范规约及每一步的句柄

编译原理——习题练习_第10张图片



分析表


知识点

first集,follow集,predict集



例题


例题一
文法:
S->MH|a
H ->LSo| ε
K ->dML| ε
L ->eHf
M->K|bLM
判断 G 是否为 LL(1) 文法,如果是,构造 LL(1) 分析表。

FIRST集和FOLLOW集
编译原理——习题练习_第11张图片

PREDICT集
编译原理——习题练习_第12张图片

预测分析表
编译原理——习题练习_第13张图片

预测分析表看出没有多重入口,所以是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)文法。

(3)构造它的预测分析表。 文法 G[E]的预测
编译原理——习题练习_第14张图片



活前缀



例题


例题一
设文法G(S)为:
S—>a|aAb     S—>b|bBa
A—>1A0|ε      B—>1B0|ε
求①LR(0)项目集族;②构造识别文法G(E)的DFA;
 
编译原理——习题练习_第15张图片

例题二
已知文法G[S]
S→A     A→BA | λ    B→aB | b
(1)构造该文法的LR(1)归约规范活前缀状态机
(2)构造相应的LR(1)分析表




文法分析





语法制导翻译器




中间代码生成



你可能感兴趣的:(编译原理)