编译原理 第三版 陈火旺【khdaw_seven】

合集下载

编译原理(陈火旺第三版)Chapt1

编译原理(陈火旺第三版)Chapt1
高级语言书写
利用已有的某种语言的编译程序实现另一语 言的编译程序。
L2语言 A代码 L2语言 A代码
P2: L1语言 L1语言
A代码
P2: A代码
P1: A代码
重庆邮电大学
同一台机器 不同的语言
五.编译程序生成
移植方法 把一种机器上的编译程序移植到另一种机器 上。

L语言 L语言 B代码 B代码 L语言 B代码 B代码 P2: L语言 L语言 P2: B代码
P2: L语言 L语言
A代码
P2: A代码
P1: A代码
重庆邮电大学
同一种语言 不同的机器
五.编译程序生成
编译程序自动产生 编译程序-编译程序,编译程序书写系统

L语言的语法描述
语义描述 目标语言 或机器描述
源程序 表 词法分析器 单词符号 语法分析器 语法单位
语义分析与中间代码 生成器




四元式


优化段 四元式 目标代码生成器 目标代码
重庆邮电大学

2. 表格和表格管理
常见的表格:符号名表,常数表,标号表, 入口名表,过程引用表。 格式:

名字
信息
重庆邮电大学
3. 出错处理

出错处理程序:发现源程序中的错误,把 有关错误信息报告给用户
重庆邮电大学
5. 目标代码产生
任务: 把中间代码变换成特定机器上的目 标代码。 依赖于硬件系统结构和机器指令的含义 目标代码三种形式:

绝对指令代码:
可直接运行 可重新定位指令代码: 需要连接装配 汇编指令代码: 需要进行汇编
重庆邮电大学
三.

编译原理-陈火旺版-第一章

编译原理-陈火旺版-第一章

编译器的作用与重要性
01
编译器是将高级语言程序翻译成机器语言程序的软件工具,是 软件开发的基础设施之一。
02
编译器可以提高程序的执行效率,使得程序能够在各种计算机
上运行。
编译器还可以对程序进行优化,提程简介
01
02
03
词法分析
将输入的源程序分解成一 个个的单词符号,即词法 单元。
词法分析器的构造
构造原理
根据词法规则构造出识别相应单 词符号的有限自动机,然后将有 限自动机转换为对应的程序代码
构造方法
手工构造法、自动生成法
注意事项
处理好单词符号的二义性问题; 识别出源程序中的错误并进行适 当的处理。
04
语法分析
语法分析概述
语法分析的任务
根据语言的语法规则,对输 入的符号序列进行合法性检 查,并构造出相应的语法结
中间代码的形式
常见的中间代码形式有三地址码、四元式、树形表示等。
中间代码生成算法
根据源程序的语法结构和语义规则,生成相应的中间代码序列。
符号表管理
符号表的作用
符号表用于记录源程序中各种标识符的属性信息,如类型、作用域 和存储地址等。
符号表的组织方式
常见的符号表组织方式有线性表、散列表和树形结构等。
循环优化
通过循环展开、循环合并、循环交换等技术来改进循环的性能。
目标代码生成方法
机器无关代码生成
机器相关代码生成
生成与特定机器无关的中间代码,然后在 运行时将其转换为特定机器上的目标代码 。
直接生成特定机器上的目标代码,这需要 考虑机器的指令集、寄存器分配、内存访 问等因素。
汇编语言代码生成
高级语言虚拟机代码生成

编译原理 陈火旺.

编译原理 陈火旺.
基本字作为特殊的标识符来处理;不用特殊的 状态图来识别,只要查保留字表。
如果基本字、标识符和常数(或标号)之间没 有确定的运算符或界符作间隔,则必须使用一 个空白符作间隔。
DO99K=1,10 要写成 DO 99 K=1,10
3 状态转换图的实现
思想:每个状态结对应一小段程序。
做法:
1)对不含回路的分叉结,可用一个CASE语句或 一组IF-THEN-ELSE语句实现
全局变量与过程
1)ch 字符变量、存放最新读入的源程序 字符
2)strToken 字符数组,存放构成单词符 号的字符串
3)GetChar 子程序过程,把下一个字符 读入到 ch 中
4)GetBC 子程序过程,跳过空白符,直 至 ch 中读入一非空白符
5)Concat 子程序,把ch中的字符连接到 strToken
10)InsertConst 整型函数过程,将 strToken中的常数插入常数表,返回常 数表指针。
int code, value; strToken := “ ”; /*置strToken为空串*/ GetChar(); GetBC(); if (IsLetter()) begin
while (IsLetter() or IsDigit()) begin
如果1 2 n,则我们称这个序 列是从1到n的一个推导。若存在一个从 1到n的推导,则称1可以推导出n 。
通 一常 步,或用若干1步,可n 以表推示出:从n。1出发,经过
*
用 1 n 表示:从1出发,经过0步或
若干步,可以推出n。
*
所以 : 即 或
定义:假定G是一个文法,S 是它的开始符号。
2 例子
助忆符:直接用编码表示不便于记忆, 因此用助忆符来表示编码。

编译原理 - 陈火旺版 - 第七章

编译原理 - 陈火旺版 - 第七章

3
后缀式
后缀式(逆波兰式)
表达式E的后缀形式E’的写法:
• 若E是变量或常量,则E’ = E • 若E=E1 op E2,则E’ =E1’ E2’ op • 若E=(E1),则E’ = E1 表达式变为后缀形式的语义规则
E→E1 op E2 E→(E1) E→i {E.CODE := E1.CODE||E2.CODE||op } {E.CODE := E1.CODE} {E.CODE := i}
推广到表达式外的范围
• 例如 a:=b*c+b*d 后缀形式:abc*bd*+:=
5

抽象语法树
内部结点表示运算符,后代表示运算对象
无循环有向图(DAG)
与抽象语法树
• 相同之处:内部结点表示运算符,后代表示运算对象 • 不同之处:考虑到公共子表达式(不只一个父结点),更加紧 凑高效
四元组表示 (1) (-,C, D , T1) (2) (*, B, T1, T2) (3) (+, A, T2 , T3) (4) (↑, F, G , T4) (5) ( /, E, T4, T5) (6) (-, T3, T5 , T6)
13
说明语句的翻译
说明语句
定义局部于该过程的数据对象(以标识符标识) 为数据对象分配空间,在符号表中登记数据对象的名 字,类型,分配的存储地址 有过程嵌套的,表示出嵌套关系
编译方法
中国人民大学信息学院 陈文萍
1
第7章 语义分析和中间代码生成
中间语言 一些语法成分的翻译
说明语句 赋值语句 布尔表达式 控制语句 过程调用
类型检查
2
语义分析概述

第3章 词法分析 (编译原理 陈火旺)

第3章 词法分析 (编译原理 陈火旺)

标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见P42.表3.1 单词符号及种别编码
10
3.1.3 词法分析器作为独立子程序

词法分析可采用如下两种处理结构:
把词法分析程序作为主程序。将词法分析作为
19
3.2.1 正规文法、正规式与正规集

正规集:由正规文法产生的语言所构成的集合。
注:正规集是集合,可有穷也可无穷。 可通过正规式来形式化表示。

对于一个正规文法的语言提炼出一个简洁的公式,用这个
式子来对它进行形式化的表示,这个式子叫正规式。

正规式:也称正则表达式,是说明单词的模式的一种重要的 表示法(记号);是定义正规集的数学工具;用来描述单词 符号。
在设计一个编译程序时,通常是把对源程序的结构分析分为词 法分析和语法分析两个相对独立的阶段来完成。
第一,描述单词的结构比描述源程序的其它语法结构要简单

得多,仅使用3型文法也就基本够用了。
第二,由于把词法分析和语法分析分开,可使编译程序各部

分的功能更为单一,整个编译程序的结构也更加清晰,从而 有利于编译程序的编写和调整。 上述词法分析和语法分析两个阶段的划分,仅仅是对整个编译 程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
25
例3.2 判断下述正规式之间是否等价: (1)b(ab)*与(ba)*b (2)(ab)*与a*b* 解: (1) b(ab)*对应的正规集是b后面出现任意多个ab对
L(b(ab)*)={b,bab,babab, ……}

编译原理考试陈火旺(含答案)

编译原理考试陈火旺(含答案)

编译原理考试陈火旺(含答案)编译原理试题 A (2003.12.4)一、回答下列问题:(30 分)1.(6分)对于下面程序段programtest(input,output)vari,j:integer;procedureCAL(x,y:integer);beginy:=y*y;x:=x-y;y:=y-xend;begini:=2;j:=3;CAL(i,j)writeln(j)end.若参数传递的方法分别为(1) 传值、(2) 传地址,(3)传名,请写出程序执行的输出结果。

2.(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1) 的,请说明理由。

G(M):M→TBT→Ba|B→Db|eT|D→d|3. (4分)考虑下面的属性文法产生式语义规则S→ABC B.u:=S.uA.u:=B.v+C.vS.v:=A.vA→a A.v:=3*A.uB→b B.v:=B.uC→c C.v:=1(1)画出字符串abc的语法树;(2)对于该语法树,假设S.u的初始值为5,属性计算完成后,S.v 的值为多少?4.(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?5.(5分)对下列四元式序列生成目标代码:1A:=B*CD:=E+AG:=B+CH:=G*D其中,H在基本块出口之后是活跃变量,R0和R1是可用寄存器。

6.(5分)写出表达式a+b*(c-d)对应的逆波兰式、三元式序列和抽象语法树。

二、(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。

三、(6 分)写一个文法使其语言为L(G)={ a n b n c m|m,n≥1,n 为奇数,m为偶数}。

四、(8分)对于文法G(S):S bMbM(L|aLMa)1.写出句型b(Ma)b的最右推导并画出语法树。

2.写出上述句型的短语,直接短语和句柄。

五、(12 分)对文法G(S):S→a|^|(T)T→T,S|S(1)构造各非终结符的FIRSTVT和LASTVT集合;(2)构造算符优先表;(3)是算符优先文法吗?(4)构造优先函数。

编译原理陈火旺版PPT课件

编译原理陈火旺版PPT课件

例有文法G[L]
(1)LE,L (2)LE (3)Ea (4)Eb
要求对输入串a,b,a进行分 析,即分析#a,b,a#
首先应给出LR分析表
为了节省空间,在实际应用中,将动作(Action) 表和状态转换(Goto)表中关于终结符的各列对 应进行合并。
10
例如,本来 Action(S0,a)= “移进”,表示 在状态S0下输入 a时,执行“移
进行分析时,对
为了构造分应析的动表作,是我把们符根据各项目的特点把项 目分成不同类型号,a移分进类符的号栈原。则是根据圆点所在位置
和圆点之后是终结符它还表是明非该状终态结等符进行的。
1.,移进V项*,目a:V圆T,它点此析对之时完待的应,毕后着分已,的为对析把状终非。已终态结分在结为符符移的B进项状目态, A;Sa.Aa.c,Be 2.待约项目:圆点栈之顶,后可为以非按终相结符的项目, A.B ,
(1)应用面广:能够用LR分析程序识别绝大多数的程 序设计语言的语法结构;
(2)实现效率高:虽构造方法复杂,但是实现(执行) 效率高。 (3)查错准确:LR分析器能够及时发现语法错误并准 确指出错误位置。
1
LR(k)分析方法中L是指自左(Left)向右扫描输入单词 串,R指分析过程是最右(Right)推导的逆过程(规 范归约),k是指在决定当前分析动作时需向前察看 的输入符号个数。
输入符号进栈; 归约:用相应的产生
S0
移进
元素元为素空为白a表cc 示表出示错接受
式进行归约;
S1
r5
接受:当归约到只剩下

文法开始符号且输入串 结束时分析成功;
Sm
ac c
出错:当状态栈顶为某一状态下,出现了不该出现的

编译原理 - 陈火旺版 - 第三章

编译原理 - 陈火旺版 - 第三章
状态 字符
f(V,a)=U f(V,b)=Q f(Q,a)=Q f(Q,b)=Q
S U V Q
a U Q U Q
b V V Q Q
21
确定有限自动机(DFA)
• 状态转换图
f(S,a)=U f(V,a)=U
f(V,b)=Q f(Q,a)=Q f(Q,b)=Q U b b a a a,b S Q b
3
3.1 词法分析器的要求
• 输入:源程序 • 输出:单词符号
– 单词是语言中具有独立意义的最小单位 – 分类
• 基本字:具有固定意义的标识符,
– 如Pascal中, begin, end
• 标识符:变量名、数组名、过程名等 • 常数:分为整型、实型、布尔型等
– 如 100, 0.8, TRUE
• 运算符:+、-、*、/等 • 界符:逗号,分号,括号等
24
非确定有限自动机(NFA)
• NFA: Nondeterministic Finite Automata • 定义:NFA M=S,,δ,S0,F,其中S为状态 的有限集, 为有穷字母表,δ为S * 到 S的子集(2 S)的映射,S0S是初始状态 集,F S为终止状态集。
25
NFA vs. DFA
一个确定有限状态自动机 DFA 是一个五元组 M = (S, ,δ,S0, F ).
有限状态集
有限输入符号集
转移函数 一个开始状态
δ : S S
S0 S FS
26
一个终态集合
NFA vs. DFA
一个非确定有限状态自动机 NFA 是一个五元组 M = (S, ,δ,S0, F ).
22
f(S,b)=V f(U,a)=Q f(U,b)=V a

编译原理 陈火旺

编译原理 陈火旺


逆波兰表示法不用括号。只要知道每个 算符的目数,对于后缀式,不论从哪一 端进行扫描,都能对它进行唯一分解。 后缀式的计算
用一个栈实现。
一般的计算过程是:自左至右扫描后缀式,

每碰到运算量就把它推进栈。每碰到k目运 算符就把它作用于栈顶的k个项,并用运算 结果代替这k个项。
•把表达式翻译成后缀式的语义规则描述
x[i]:=y op (0) [ ] = (1)

arg1 x y
arg2 i
x:=y[i] op (0) = [ ] (1) assign

arg1 y x
arg2 i
(0)
三地址语句

间接三元式
为了便于优化,用
三元式表+间接码表 表示
中间代码 间接码表:一张指示器表,按运算的先后次 序列出有关三元式在三元式表中的位置。 优点: 方便优化,节省空间
E→true
E→false
E.code:=gen(‘goto’ E.false)
考虑如下表达式: a<b or c<d and e<f 假定整个表达式的真假出口已分别置为Ltrue 和Lfalse,则按定义将生成如下的代码:
if a<b goto Ltrue goto L1 if c<d goto L2 goto Lfalse if e<f goto Ltrue goto Lfalse
T1:=not c T2:=b and T1 T3:=a or T1

a<b的关系表达式可等价地写成
if a<b then 1 else 0 ,翻译成 100: if a<b goto 103 101: T:=0 102: goto 104 103: T:=1 104:

编译原理课后答案(陈火旺)

编译原理课后答案(陈火旺)

第二章P36-6(1)L G ()1是0~9组成的数字串(2)最左推导:N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒0010120127334556568最右推导:N ND N ND N ND N D N ND N D N ND N ND N D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒77272712712701274434886868568P36-7G(S)O N O D N S O AO A AD N→→→→→1357924680|||||||||||P36-8文法:E T E T E T TF T F T F F E i→+-→→|||*|/()| 最左推导:E E T T TF T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()最右推导:E E T E TF E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()*()*()*()*()语法树:/********************************EE FTE +T F F T +iiiEEFTE-T F F T -iiiE EFT+T F FTiii*i+i+ii-i-ii+i*i*****************/P36-9句子iiiei 有两个语法树:S iSeS iSei iiSei iiiei S iS iiSeS iiSei iiiei ⇒⇒⇒⇒⇒⇒⇒⇒P36-10/**************)(|)(|S T TTS S →→***************/P36-11/*************** L1:ε||cC C ab aAb A ACS →→→ L2:bcbBc B aA A ABS ||→→→ε L3:εε||aBb B aAb A ABS →→→ L4:AB B A A B A S |01|10|→→→ε ***************/第三章习题参考答案P64–7(1)101101(|)*1 ε ε 1 0 1 1确定化:0 1 {X} φ {1,2,3} φ φ φ {1,2,3} {2,3} {2,3,4} {2,3} {2,3} {2,3,4} {2,3,4} {2,3,5} {2,3,4}{2,3,5} {2,3} {2,3,4,Y} {2,3,4,Y}{2,3,5}{2,3,4,}1 00 0 1 1 00 1 0 1 1 1 最小化:X 1 2 3 4 Y5 XY60 12 35 4{,,,,,},{}{,,,,,}{,,}{,,,,,}{,,,}{,,,,},{},{}{,,,,}{,,}{,,,},{},{},{}{,,,}{,01234560123451350123451246012345601234135012345601231010==== 3012312401234560110112233234012345610101}{,,,}{,,}{,},{,}{},{},{}{,}{}{,}{,}{,}{}{,}{}{},{},{,},{},{},{}===== 0 10 0 1 00 1 0 1 1 1P64–8(1)01)0|1(*(2))5|0(|)5|0()9|8|7|6|5|4|3|2|1|0)(9|8|7|6|5|4|3|2|1(*(3)******)110|0(01|)110|0(10P64–12(a)aa,b a 确定化:a b {0} {0,1} {1} {0,1} {0,1} {1} {1} {0} φ φφφ给状态编号:a b 0125 01 2 4 3 011 12 2 03 333aaa b b bba 最小化:{,},{,}{,}{}{,}{}{,}{,}{,}{}{,},{},{}012301101223032330123a ba b ====a ab bab (b)b b aa baa bb aa a 已经确定化了,进行最小化 最小化:{{,}, {,,,}}012345011012423451305234523452410243535353524012435011012424{,}{}{,}{,}{,,,}{,,,}{,,,}{,,,}{,}{,}{,}{,}{,}{,}{,}{,}{{,},{,},{,}}{,}{}{,}{,}{,}a b a b a b a b a b a =============={,}{,}{,}{,}{,}{,}{,}10243535353524 b a b0 1 2 3 01 2 0 2 3 14 5b b aa b aP64–14(1) 01 0 (2):(|)*0100 1 ε ε0 确定化:0 1 {X,1,Y} {1,Y} {2} {1,Y} {1,Y} {2} {2} {1,Y} φ φφφ 给状态编号:0 1 0 1 2 1 1 2 2 1 3 33 30 1 01 1 10 最小化:0 1 2 01YX YX2 1 0 2 13{,},{,}{,}{}{,}{}{,}{,}{,}{}{,},{},{}0123011012231323301230101====1 1 1 0第四章P81–1(1) 按照T,S 的顺序消除左递归ε|,)(||^)(T S T T S T T a S S G '→''→→'递归子程序: procedure S; beginif sym='a' or sym='^' then abvance else if sym='(' then begin advance;T;if sym=')' then advance; else error; end else error end;procedure T; begin S;'T end;procedure 'T ; beginif sym=',' then begin advance; S;'T end1 3其中:sym:是输入串指针IP 所指的符号 advance:是把IP 调至下一个输入符号 error:是出错诊察程序 (2)FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T )={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T )={)} 预测分析表a^() , # S S a →S →^S T →()TT ST →' T ST →' T ST →''T'→T ε '→'T ST ,是LL(1)文法P81–2文法:|^||)(|*||b a E P F F F P F T T T F T E E E T E →'→''→→''→+→''→εεε(1)FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#}FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#}考虑下列产生式:'→+'→'→'→E E T T F F P E a b ||*|()|^||εεεFIRST(+E)∩FIRST(ε)={+}∩{ε}=φ FIRST(+E)∩FOLLOW(E')={+}∩{#,)}=φ FIRST(T)∩FIRST(ε)={(,a,b,^}∩{ε}=φ FIRST(T)∩FOLLOW(T')={(,a,b,^}∩{+,),#}=φ FIRST(*F')∩FIRST(ε)={*}∩{ε}=φFIRST(*F')∩FOLLOW(F')={*}∩{(,a,b,^,+,),#}=φ FIRST((E))∩FIRST(a) ∩FIRST(b) ∩FIRST(^)=φ 所以,该文法式LL(1)文法. (3)+ * ( ) a b ^ # EE TE →'E TE →' E TE →' E TE →'E' '→+E E'→E ε'→E εTT F T →' T F T →' T F T →' T F T →'T' '→T ε '→T T '→T ε '→T T '→T T '→T T '→T εF F P F →' F P F →' F P F →' F P F →'F' '→F ε '→'F F * '→F ε '→F ε '→F ε '→F ε '→F ε '→F εPP E →() P a → P b → P →^(4)procedure E; beginif sym='(' or sym='a' or sym='b' or sym='^' then begin T; E' end else error endprocedure E'; beginif sym='+'then begin advance; E endelse if sym<>')' and sym<>'#' then error endprocedure T; beginif sym='(' or sym='a' or sym='b' or sym='^' then begin F; T' end else error endprocedure T';if sym='(' or sym='a' or sym='b' or sym='^' then Telse if sym='*' then errorendprocedure F;beginif sym='(' or sym='a' or sym='b' or sym='^' then begin P; F' endelse errorendprocedure F';beginif sym='*'then begin advance; F' endendprocedure P;beginif sym='a' or sym='b' or sym='^'then advanceelse if sym='(' thenbeginadvance; E;if sym=')' then advanceelse errorendelse errorend;P81–3/***************(1)是,满足三个条件。

编译原理(陈火旺第三版)练习答案

编译原理(陈火旺第三版)练习答案

P-36-9 句子:iiiei 有两个语法树: S⇒iSeS⇒iSei⇒iiSei⇒iiiei S⇒iS⇒iiSeS⇒iiSei⇒iiiei 因此 iiiei 是二义性句子,因此 该文法是二义性的。 i i S
S e S i i S i i
S S S i e S i
P-36-10 S→TS|T T→(S)|() P-36-11 L1: G(S): S→AC A→aAb|ab C→cC|ε L2: G(S): S→AB A→aA|ε B→bBc|bc L3: G(S): S→AB A→aAb|ε B→aAb|ε L4: G(S): S→1S0|A A→0A1|ε 或者:S→A|B A→0A1|ε B→1B0|A
a {0} {0,1} {1} Φ
给状态编号:
b {1} {1} Φ Φ
{0,1} {0,1} {0} Φ
a 0 1 2 3 1 1 0 3
B 2 2 3 3
4
本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动! 更多计算机考研资料请大家到:www.jsj8.com下载!
1
本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动! 更多计算机考研资料请大家到:www.jsj8.com下载!
语法树: E E T E E
E
+
E
+
T
-
T
E
+
T
F i
T F i
T
*
F
E
-
T
F i
T F i i+i+i
F i
F i
i
T F i
F i
i+i*i

陈火旺编译原理(第三版)课后习题答案

陈火旺编译原理(第三版)课后习题答案

第二章P36-6(1)L ( G1) 是0~9组成的数字串(2)最左推导 :N ND NDD NDDD DDDD0DDD01DD012D 0127N ND DD3D34N ND NDD DDD5DD56 D568最右推导 :N ND N 7ND 7N 27ND 27N 127D1270127N ND N 4 D 434N ND N 8ND 8N 68 D 68568P36-7G(S)O1|3|5|7|9N 2|4|6|8|O D0|NS O|AO AAD|NP36-8文法:ET|E T|E TT F|T*F|T/F F( E)|i最左推导 :E E T T TF T i T i T * F i F * F i i * Fi i * iE T T *F F * F i * F i *( E ) i *( E T )i *( T T )i *( F T )i *( i T )i *( i F )i *( i i )最右推导 :E E T E T*F E T * i E F * i E i * i T i * i F i * i i i * iE TF * T F * F F*( E)F*( E T)F*( E F) F *( E i )F *( T i ) F *( F i ) F *( i i )i *( i i )语法树: /********************************E E EE+T E+T E-TE-T F E+T FT T*FT F i T F iF F iF iF ii ii ii+i+i i-i-i i+i*i*****************/P36-9句子 iiiei有两个语法树:SiSeSiSeiiiSeiiiieiSiSiiSeSiiSeiiiieiP36-10/**************S TS |TT(S) |()***************/P36-11/***************L1:S ACA aAb | abC cC |L2:S ABA aA |B bBc | bcL3:S ABA aAb | BaBb |L4:S A | BA 0A1| B1B0| A***************/第三章习题参考答案P64–7(1)1(01|) * 101XY1101X12345Y1确定化:01 {X}φ{1,2,3}φφφ{1,2,3}{2,3}{2,3,4}{2,3}{2,3}{2,3,4}{2,3,4}{2,3,5}{2,3,4}{2,3,5}{2,3}{2,3,4,Y}{2,3,4,Y}{2,3,5}{2,3,4,}102300110101564111最小化:{ 0,1,2,3,4,5},{ 6}{ 0,1,2,3,4,5} 0{1,3,5}{0,1,2,3,4,5} 1{1,2,4,6}{ 0,1,2,3,4},{ 5},{ 6}{ 0,1,2,3,4} 0{1,3,5}{ 0,1,2,3},{ 4},{ 5},{ 6}{ 0,1,2,3} 0{1,3}{0,1,2,3}1{12,,4}{ 0,1},{2,3}{ 4},{5},{6}{ 0,1} 0{1}{0,1} 1{1,2}{ 2,3} 0{ 3}{ 2,3}1{4}{ 0},{ 1},{ 2,3},{ 4},{ 5},{ 6}1020010011345111P64–8(1)(1 | 0)* 01(2)(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(0|5) |(0|5)(3)0*1(0 | 10*1) * |1* 0(0 |10* 1) *P64–12(a)aa,b01a确定化:a b{0}{0,1}{1}{0,1}{0,1}{1}{1}{0}φφφφ给状态编号:a b012112203333 aa01a b b bb23a最小化:{ 0,1},{2,3}{ 0,1} a{1}{0,1} b{ 2}{ 2,3} a{ 0,3}{ 2,3} b{3}{ 0,1},{2},{3}a ab b012ab(b)b b a023a baabb a514a a已经确定化了 , 进展最小化最小化:{{ 0,1}, { 2, 3,4, 5}}{ 0,1} a{1}{ 0,1} b{ 2,4}{ 2, 3,4,5} a { 1, 3, 0, 5}{ 2,3,4,5} b { 2, 3,4,5} { 2, 4} a{1,0}{ 2,4} b{ 3,5}{ 3, 5} a{ 3,5}{ 3,5} b{ 2,4}{{ 0,1},{2, 4},{3, 5}}{ 0,1} a{1}{ 0,1} b{ 2,4}{ 2, 4} a{1,0}{ 2,4} b{ 3,5}{ 3, 5} a{ 3,5}{ 3,5} b{ 2,4}bb a012abaP64–14(1)0101(2):X(| )*Y0102 01X1Y确定化:01 {X,1,Y}{1,Y}{2}{1,Y}{1,Y}{2}{2}{1,Y}φφφφ给状态编号:01 01211221333311011123最小化:{ 0,1},{ 2, 3}{ 0,1} 0{1}{ 0,1} 1{ 2}{ 2,3} 0{1,3}{ 2,3}1{ 3}{ 0,1},{ 2},{ 3}111013第四章P81–1(1)按照 T,S 的顺序消除左递归G (S)Sa |^ | (T )TSTT,ST |递归子程序:procedure S;beginif sym='a' or sym='^'then abvanceelse if sym='('then beginadvance;T;if sym=')' then advance;else error;endelse errorend;procedure T;beginS; Tend;procedure T ;beginif sym=','then beginadvance;S; Tendend;其中 :sym: 是输入串指针IP 所指的符号advance: 是把 IP 调至下一个输入符号error:是出错诊察程序(2)FIRST(S)={a,^,(}FIRST(T)={a,^,(}FIRST( T )={,,}FOLLOW(S)={),,,#}FOLLOW(T)={)}FOLLOW(T )={)}预测分析表a^(),#S SaS ^S (T)T TSTTSTT STT TT,ST是LL(1) 文法P81–2文法:ETEEE |TFTT T |FPFF* F |P( E) | a | b |^(1)FIRST(E)={(,a,b,^}FIRST(E')={+,ε }FIRST(T)={(,a,b,^}FIRST(T')={(,a,b,^,ε }FIRST(F)={(,a,b,^}FIRST(F')={*,ε }FIRST(P)={(,a,b,^}FOLLOW(E)={#,)}FOLLOW(E')={#,)}FOLLOW(T)={+,),#}FOLLOW(T')={+,),#}FOLLOW(F)={(,a,b,^,+,),#}FOLLOW(F')={(,a,b,^,+,),#}FOLLOW(P)={*,(,a,b,^,+,),#}(2)考虑以下产生式:EE|TT|F* F |P( E)|^| a|bFIRST(+E) ∩ FIRST( ε )={+}∩{ ε }= φFIRST(+E) ∩ FOLLOW(E')={+} ∩ {#,)}=φFIRST(T)∩FIRST( ε)={(,a,b,^}∩ { ε}= φFIRST(T)∩FOLLOW(T')={(,a,b,^}∩ {+,),#}=φFIRST(*F')∩ FIRST(ε )={*}∩ {ε }=φFIRST(*F')∩ FOLLOW(F')={*}∩ {(,a,b,^,+,),#}= FIRST((E)) ∩ FIRST(a)∩ FIRST(b)∩FIRST(^)=所以 , 该文法式LL(1) 文法 .φφ(3)+ *()ab^#E ETE 'ETE 'ETE' ETE 'E'E E E E T TFT TFT T FT T FTT'T T T TTT TT T T TF F' PFPFFPF FPF F PF F F*F FFFFFFP( E )Pa P b P ^(4)procedure E;beginif sym='(' or sym='a' or sym='b' or sym='^' then begin T; E' endelse errorendprocedure E';beginif sym='+'then begin advance; E endelse if sym<>')' and sym<>'#' then error endprocedure T;beginif sym='(' or sym='a' or sym='b' or sym='^' then begin F; T' endelse errorendprocedure T';beginif sym='(' or sym='a' or sym='b' or sym='^' then Telse if sym='*' then errorendprocedure F;beginif sym='(' or sym='a' or sym='b' or sym='^' then begin P; F' endelse errorendprocedure F';beginif sym='*'then begin advance; F' endendprocedure P;beginif sym='a' or sym='b' or sym='^'then advanceelse if sym='(' thenbeginadvance; E;if sym=')' then advanceelse errorendelse errorend;P81–3/***************(1)是,满足三个条件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

kh
2
co
F i i i-i-i S S S i e S i
F
F
i
T
m
F
第三章 (1) 1(0|1)*101
X Y
0 2 1 ε 3 1 4 0 1 5 Y
1
X
1
ε
0 {X} Φ {1,2,3} {2,3} {2,3,4} {2,3,5} Φ Φ
1
{1,2,3} Φ
案 网
{2,3} {2,3}
i+i)⇒i*(i+i)
P-36-7 G(S) : (没有考虑正负符号问题) S→P|AP P→1|3|5|7|9 A→AD|N N→2|4|6|8|P D→0|N 或者: (1)S→ABC|C A→1|2|3|4|5|6|7|8|9 B→BA|B0|ε C→1|3|5|7|9 P-36-8 G(E) :E→T|E+T|E-T T→F|T*F|T/F F→(E)|i 最左推导: E⇒E+T⇒T+T⇒F+T⇒i+T⇒i+T*F⇒i+F*F⇒i+i*F⇒i+i*i
E'→ε
后 答

F'→*F'
ww
(4) 构造递归下降程序 Procedure E; Begin If sym = ‘ (’ or sym = ‘a’ or sym = ‘b’ or sym = ‘⋀’ Then begin T;E' end Else error End Procedure E'; Begin If sym = ‘+’ Then begin advance ; E end Else if sym <> ‘)’ and sym <> ‘#’ then error End Procedure T; Begin If sym = ‘(’ or sym = ‘a’ or sym = ‘b’ or sym = ‘⋀’ Then begin F; T' end Else error End
kh
1
ww
da
b a b 2 b
0
1

w.
a 2
5
案 网
最小化: {0,1} {2,3} {0,1}a={1},{0,1}b={2} {2,3}a={0,3},{2,3}={3} {0,1},{2},{3}
co
m
P64-14 正规式: (0|10)* 0 1 0 1 0
0 X ε 1 2 ε 1 0 Y
{2,3,5} {2,3}

{2,3,4,Y}
da
{2,3,5}
0 3 0 1 5 0 1 1 4 0 1
0 0 1
kh
2 1 1
1
0
ww
w.
0
最小化:{0,1,2,3,4,5},{6} {0,1,2,3,4,5}0={1,3,5} {0,1,2,3,4,5}1={1,2,4,6} {0,1,2,3,4},{5},{6} {0,1,2,3,4}0={1,3,5} {0,1,2,3},{4},{5},{6} {0,1,2,3}0={1,3} {0,1,2,3}1={1,2,4} {0,1},{2,3},{4},{5},{6} {0,1}0={1} {0,1}1={1,2} {2,3}0={3} {2,3}1={4} {0},{1},{2,3},{4},{5},{6}
kh
da
1

后 答
w.
案 网
co
m
语法树: E E T E E
E
+
E
+
T
-
T
E
+
T
F i
T F i
T
*
F
E
-
T
F i
T F i i+i+i
i
i
P-36-9 句子:iiiei 有两个语法树: S⇒iSeS⇒iSei⇒iiSei⇒iiiei S⇒iS⇒iiSeS⇒iiSei⇒iiiei
w.
S S e S i S i i i
后 答
1
1
S 0 0
0
ww
w.
0 A 0 S 1 B 0 1 1 G(C)
则有:G(f) f→A1|B0|C1|C0 C→C0|C1|A1|B0 A→S1|1 B→S0|0 S→S0|S1|0|1 或者是确定化,然后最小化:
kh
0 0,1 C C→C0|C1|A0|B1 A→0|B0 B→1|A1
6
第二章
P-36-6 (1)L(G)是 0~9 组成的数字串; (2)最左推导: N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒01DD⇒012D⇒0127 N⇒ND⇒DD⇒3D⇒34 N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568 最右推导: N⇒ND⇒N7⇒ND7⇒N27⇒ND27⇒N127⇒D127⇒0127 N⇒ND⇒N4⇒D4⇒34 N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568
E⇒T⇒T*F⇒F*F⇒i*F⇒i*(E)⇒i*(E+T)⇒i*(T+T)⇒i*(F+T)⇒i*(i+T)⇒i*(i+F)⇒i*(i+i)
E⇒E+T⇒E+T*F⇒E+T*i⇒E+F*i⇒E+i*i⇒T+i*i⇒F+i*i⇒i+i*i E⇒T⇒T*F⇒T*(E)⇒T*(E+T)⇒T*(E+F)⇒T*(E+i)⇒T*(T+i)⇒T*(F+i)⇒T*(i+i)
ww
Procedure T'; Begin If sym = ‘,’ Then begin Advance; S;T' End End 其中:sysm 为输入串指针所指的符号;advance 是把输入指针调至下一输入符号。 (2) 求 First 和 Follow 集合: First(S)={a 、 ⋀ 、 (} First(T)={a 、 ⋀ 、 (} First(T')={, 、ε} Follow(S)={ , 、) 、 #} Follow(T) = { ) } Follow(T')={ ) } a S→a T→ST' ⋀ S→⋀ T→ST' ( S→(T) T→ST' T'→ε T'→, ST' ) , #
{ M、 C、 G }, {{ W }} <MG> <MG>
{{M、W、G、C},{}}
后 答
<MG>
{{W,C},{M、G}} <MC>
w.
<MW> <MW> <M> {{M、W、C},{G}} <MC> <MW> <MG> {{W、M、G},{ C}}
{C},{{M、W、G}}
案 网
<MG>
da
{W},{{M、G、C}} <MG>

kh w.
ww
co
<MC> <MC> {{G},{M、W、C}} <M> <MW> <M> { M、 G}, {{ W、 C}} <MG> <MG> {{},{M、W、G、C}
7
m
第四章 P81-1 (1) 按照 T,S 的顺序消除左递归 G'(S) :S→a|⋀|(T) T→ST' T'→,ST'|ε 递归下降子程序: procedure S: begin if sym = ‘a’or sym= ‘⋀’ then advance else if sym=‘ (’ then begin advance;T; if sym = ‘)’ then advance; else error; end else error end procedure T; begin S;T' End
P81-2 文法:E→TE' E'→+E|ε T→FT' T'→T|ε F→PF' F'→*F'|ε P→(E)|a|b|⋀ (1) First(E) = {(,a,b, ⋀} First(E') = {+,ε} First(T) = {(,a,b, ⋀} First(T') = {(,a,b, ⋀, ε} First(F) = {(,a,b, ⋀} First(F') = {*,ε} First(P) = {(,a,b, ⋀} Follow(E)={#, )} Follow(E')={#,)} Follow(T)={+,),#} Follow(T')={+,),#} Follow(F)= {+,(,a,b,⋀,),# } Follow(F')={+,(,a,b,⋀,),# } Follow(P) ={*,+,(,a,b,⋀,),# } (2)文法无左递归,考察 E'→+E|ε T'→T|ε F'→*F'|ε P→(E)|a|b|⋀ E'→+E|ε: First(E') = {+,ε}∩Follow(E')={#,)} = Φ T'→T|ε: First(T') = {(,a,b, ⋀, ε} ∩Follow(T')={+,),#} = Φ F'→*F'|ε:First(F') = {*,ε}∩Follow(F')={ (,a,b,⋀,),# } = Φ P→(E)|a|b|⋀:候选式终结首符集两两不相交 所以该文法为 LL(1)文法。 (3) LL(1)分析表 # E'→ε T'→ε F'→ε E→TE' T→FT' F→PF' F'→ε
相关文档
最新文档