4编译原理,陈意云 ,课后答案4(方案).ppt
编译原理陈意云课后答案.ppt
5
3.2
• 考虑文法 S -> aSbS|bSaS|ε (a) 为句子abab构造两个不同的最左推导, 以说明此文法二义 (b) 为abab构造对应的最右推导 (c) 为abab构造对应的分析树 (d) 这个文法产生的语言是什么
2019/3/22
luanj@
6
3.2 (续)
luanj@ 9
2019/3/22
3.4 (续)
• 该文法没有体现运算符 |、*、() 、并置的优 先级,因而是二义的。
R=>R|R=> a|R =>a|R*=>a|b* R=>R*=>R|R*=>a|R*=>a|b*
• E -> E’|’T | T T -> TF | F F -> F* | (E) | a | b
• (1) S=>aSbS=>abS=>abaSbS=>ababS=>abab (2) S=>aSbS=>abSaSbS=>abaSbS=>ababS=>abab • S=>aSbS=>aSb=>abSaSb=> abSab =>abab (2)
S a S ε b a S ε (1) 描述的语言是a,b数目相等的串 S b S ε S
S
( L S a L , ( L S a
2019/3/22 luanj@ 3
) S L , ) S a
3.1 (续) - (a,((a,a),(a,a)))
S =>(L) =>(L,S) =>(S,S) =>(a,S) =>(a,(L)) =>(a,(L,S)) =>(a,(S,S)) =>(a,((L),S)) =>(a,((L,S),S)) =>(a,((S,S),S)) =>(a,((a,S),S)) =>(a,((a,a),S)) =>(a,((a,a),(L))) =>(a,((a,a),(L,S))) =>(a,((a,a),(S,S))) =>(a,((a,a),(a,S))) =>(a,((a,a),(a,a))) S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,(L))) =>(L,(L,(L,S))) =>(L,(L,(L,a))) =>(L,(L,(S,a))) =>(L,(L,(a,a))) =>(L,(S,(a,a))) =>(L,((L),(a,a))) =>(L,((L,S),(a,a))) =>(L,((L,a),(a,a))) =>(L,((S,a),(a,a))) =>(L,((a,a),(a,a))) =>(S,((a,a),(a,a))) =>(a,((a,a),(a,a)))
编译原理第4章习题答案
S-> S’ S’->(S)SS’| First( (S)SS’) = { ( } Follow(S)=Follow(S’)= { (, ),$ }
预测分析表
非终结符 S ( S->S’ ) S->S’ $ S->S’
S’
S’->(S)SS’
S’->
S’->
S’->
冲突
仔细分析后,发现该文法 S->S(S)S| 是二义性文法。 二义性文法不可能是LL(1)文法。 例如:( ) ( )
S->aS’ S’->aS’AS’|Ɛ A->+|*
First(S) = First(aS’)={a} First(S’)= First(aS’AS’) ∪ First(Ɛ)= {a} ∪{Ɛ}= {a, Ɛ} First(A) = { +,*}
Follow(S) ={$} 因为 S->aS’,所以把Follow(S)加入到Follow(S’)中。 因为 S’->aS’AS’的第一个S’ ,所以把First(AS’)={+,*}加入到Follow(S’)中。 因为 S’->aS’AS’的第二个S’ ,所以Follow(S)加入到Follow(S’)中。 所以,Follow(S’)= {$, +,*} 对 S’->aS’AS’的A ,当A后面的S’推导出非空时,把First(S’)-{Ɛ}={a}加入到Follow(A)中。 对 S’->aS’AS’的A ,当A后面的S’推导出空时,把Follow(S’)={$,+,*}加入到Follow(A)中。 所以,Follow(A)= {a, +,*,$} 对于S’->aS’AS’|Ɛ,因为First(aS’AS’) ∩Follow(S’)={a} ∩{$,+,*}=空集,所以没有冲突。 对于A->+|*,因为First(+) ∩First(*)={+} ∩{*}=空集,所以没有冲突。 所以该文法是LL(1)文法。
编译原理chapter4 语法分析
type array[simple] of type {注:A=type,a=array,
type→array[simple ] of type}
array[num dotdot num] of type
{注:A=simple, a=num
simple→num dotdot num }
array[num dotdot num] of simple
aSbAa (SbA) aSbbaa (ba) aabbaa (a)
S
a
A
S
S
b
A
a
aபைடு நூலகம்
ba
精品文档
7
4.2预测分析器 4 .2 .1 预测分析 预测分析的原理 4 .2 .2 递归预测分析器的构造 用一组递归过程实现预测分析,产生式的状 态转换图可作为编写递归过程的兰图。 4 .2 .3 非递归预测分析器的构造—LL(1) 对于每一步分析,分析表项M[A,a]=‘A ’ 表示:面对非终结符号精A品和文档向前看符号a应选 8
A 1 2 ... n
i,j(1 i,j n i<>j),从 i推导出来的第一个 终结符号集合(称为FIRST( i) )和从 j推 导出来的第一个终结符号集合(称为FIRST( j) )不相交,即, FIRST( i) FIRST( j)=
精品文档
12
定义4.1 令G[S]=(VT,VN,S,P),则
FIRST( )= a a*… a VT
例4.2 文法G[S],其产生式如下:
S→aA|d A→bAS|ε (4.2)
若 w=abd,则构造最左推导的过程如下:
S aA {注:A=S,a=a,S→aA}
abAS {注:A=A,a=b,A→ bAS}
中国科学技术大学陈意云编译原理全套参考资料chapter4
中国科学技术大学陈意云编译原理全套参考资料chapter4中国科学技术大学陈意云编译原理全套参考资料chapter4 第四章语法制导的翻译在3.7节用Yacc写的例子中,我们看到一种有用的描述形式:语言结构的属性附加在代表语言结构的文法符号上,这些属性值由附加在文法产生式的语义动作来计算,这些语义动作在归约对应的产生式时进行计算,由此得到结果。
这种描述形式可用来描述编译器的语义分析,因此本章系统地研究这种称之为“语法制导下的语言翻译”的描述方法及其实现。
它的语义动作(有时称为语义规则)的计算可以产生代码、把信息存入符号表、显示出错信息、或完成其它工作。
语义规则的计算结果就是我们所要的记号流的翻译。
本章讨论语义规则和产生式相联系的两种方式:语法制导的定义和翻译方案。
语法制导定义是较抽象的翻译说明,它隐蔽了一些实现细节;而翻译方案陈述了一些实现细节,主要是指明了语义规则的计算次序。
在第五章说明语义检查和第七章描述中间代码生成时,大量使用这两种方法。
本章还讨论语法制导定义和翻译方案的实现方法。
概念上的方法是,首先分析输入的记号串,建立分析树,然后从分析树得到描述结点属性间依赖关系的有向图,从这个依赖图得到语义规则的计算次序,然后进行计算,最终得到翻译的结果。
实际的实现并不需要按上面步骤逐步进行,本章将讨论几种不同限制下的实现方法。
4.1 语法制导的定义语法制导的定义是上下文无关文法的推广,其中每个文法符号都有一个属性集合,它分成两个子集,分别叫做该文法符号的综合属性集合和继承属性集合。
如果我们把分析树上的结点看成是保存对应文法符号的属性的记录,那么属性对应记录的域。
属性可以表示任何东西:串、数、类型、内存单元,或其它想表示的东西。
分析树结点的属性值由该结点所用产生式的语义规则定义。
在语法制导定义中,我们把其中的文法称为基础文法。
本节介绍语法制导定义的形式及其概念上的实现模型。
4.1.1 语法制导定义的形式在语法制导定义中,每个文法符号有一组属性,每个文法产生式A , ,有一组形式为b := f (c, c, …, c )的语义规则,其中f 是函数,b和c, c, …, c 是该产生式的文法符号的12k12k属性,并且:(1) 如果b是A的属性,c , c , …, c 是产生式右部文法符号的属性或A的其它属12k性,那么b叫做文法符号A的综合属性。
编译原理第四章答案
First( A' ) Follow ( A' ) {d , } {), b}
4.4(2)
见课后答案 规则见课本P66
问题?
Select( E gAf ) Select( E c) First( gAf ) Frist(c) {g} {c}
4.2
对下面的文法G: E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→(E)|id (1)计算这个文法的每个非终结符的FIRST和FOLLOW。 (2)证明这个文法是LL(1)的。 (3)构造它的预测分析表。 (4)构造它的递归下降分析程序。
第四章习题
4.1 4.2 4.3 4.4
4.1
1、考虑下面文法G[A]: A→BCc|gDB B→bCDE|ε C→DaB|ca D→dD|ε E→gAf|c (1)FIRST集和FOLLOW集 (2)是否是LL(1)文法。
4.1(1) First集
First( A) First( BCc) First( gDB) First( B) \ { } First(C ) {g} {b} First( D) \ { } {a} First(ca) {g} {b} {d } {a} {c} {g} {a, b, c, d , g}
E’→ε T→FT ’ T’→ε F→idFra bibliotekE’→ε
T’→ε
4.2(4)
规则见课本P66 见课后答案 E→TE’ T→FT’ F→(E)|id E’→+TE’|ε T’→*FT’|ε
4.3
文法G[S]: S→A A→B|AiB B→C|B+C C→)A*|( 1)改写为LL(1)文法 2)求改写后的文法的每个非终结符的First集和Follow集 3)构造相应的预测分析表
编译原理习题及答案课堂ppt课件
A.提高程序的执行效率
B.使程序的结构更加清晰
C.利用有限的机器内存并提高机器的执行效率
D.利用有限的机器内存但降低了机器的执行效
率
(3) 构造编译程序应掌握 。
A.源程序
B.目标语言
C.编译方法
D.A~C项
.
2
严格执行突发事件上报制度、校外活 动报批 制度等 相关规 章制度 。做到 及时发 现、制 止、汇 报并处 理各类 违纪行 为或突 发事件 。
来到达2的弧都导向1,并删除状态2。最后,得到如图2-4
所示的化简了的DF.A M′。
21
严格执行突发事件上报制度、校外活 动报批 制度等 相关规 章制度 。做到 及时发 现、制 止、汇 报并处 理各类 违纪行 为或突 发事件 。
《编译原理教程》习题解析
22
图2-4 图2-3化简后的DFA M′
.
.
4
严格执行突发事件上报制度、校外活 动报批 制度等 相关规 章制度 。做到 及时发 现、制 止、汇 报并处 理各类 违纪行 为或突 发事件 。
《编译原理教程》习题解析
5
(4) 编译各阶段的工作都涉及到构造、查找或更新有 关表格,即编译过程的绝大部分时间都用在造表、查表和 更新表格的事务上。故选D。
《编译原理教程》习题解析
16
(5) NFA可以有DFA与之等价,即两者描述能力相同; 也即,对于任一给定的NFA M,一定存在一个DFA M',使 L(M)=L(M′)。故选B。
(6) DFA便于识别,易于计算机实现,而NFA便于定 理的证明。故选C。
(7) 本题虽然是第二章的题,但答案参见第三章3.1.3 节。即选C。
.
8
严格执行突发事件上报制度、校外活 动报批 制度等 相关规 章制度 。做到 及时发 现、制 止、汇 报并处 理各类 违纪行 为或突 发事件 。
编译原理课后答案
<表达式>AVV ------ *第二早1、 L(G[S])={ abc }2、 L(G[N])={ n 位整数或空字符串| n>0}3、 G[E] : E —>E+D | E-D | DD —>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 94、 L(G[Z])={ a n b n | n>0 }5、(1)考虑不包括“ 0”的情况G[S]: S — >0S | ABC | 2 | 4| 6 | 8A —>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B —>AB | 0B | &C —>0 | 2 | 4 | 6 | 8考虑包括“ 0”的情况: G[S]: S — >AB | CB —>AB | CA —>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C —>0 | 2 | 4 | 6 | 8(2)方法1:G[S]: S — > ABC | 2 | 4 | 6 | 8A —>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B —>AB | 0B | &C —>0 | 2 | 4 | 6 | 8方法2:G[S]: S — >AB | CB —> AB | 0B |C | 0A —> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C —>2 | 4 | 6 | 8&设<表达式 >为E , <项>为T , <因子〉为F ,注:推导过程不能省略,以下均为最 左推导(1) E => T => F => i(4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i (6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I8、 是有二义性的,因为句子abc 有两棵语法树(或称有两个最左推导或有两个最右 推导)ii<表达式>最左推导1: S => Ac => abc最左推导2:S => aB => abc9、⑴a a(2) 该文法描述了变量a和运算符+、*组成的逆波兰表达式10、(1)该文法描述了各种成对圆括号的语法结构(2)是有二义性的,因为该文法的句子()()存在两种不同的最左推导:最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()() 最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S=> ()S(S)S => ()(S)S => ()()S => ()()11、⑴因为从文法的开始符E出发可推导出E+T*F,推导过程如下:E => E+T =>E+T*F,所以E+T*F 是句型。
编译原理习题及答案(课堂PPT)
.
8
《编译原理教程》习题解析
9
1.3 请画出编译程序的总框图。如果你是一个编译程 序的总设计师,设计编译程序时应当考虑哪些问题?
【解答】 编译程序总框图如图1-1所示。 作为一个编译程序的总设计师,首先要深刻理解被编 译的源语言其语法及语义;其次,要充分掌握目标指令的 功能及特点,如果目标语言是机器指令,还要搞清楚机器 的硬件结构以及操作系统的功能;第三,对编译的方法及 使用的软件工具也必须准确化。总之,总设计师在设计编 译程序时必须估量系统功能要求、硬件设备及软件工具等 诸因素对编译程序构造的影响。
《编译原理教程》习题解析
1
第一章 绪 论 第二章 词 法 分 析 第三章 语 法 分 析
.
1
《编译原理教程》习题解析
2
第一章 绪 论
1.1 完成下列选择题: (1) 下面叙述中正确的是 。
A.编译程序是将高级语言程序翻译成等价的机 器语言程序的程序
B.机器语言因其使用过于困难,所以现在计算 机根本不使用机器语言
.
5
《编译原理教程》习题解析
6
(4) 编译各阶段的工作都涉及到构造、查找或更新有 关表格,即编译过程的绝大部分时间都用在造表、查表和 更新表格的事务上。故选D。
(5) 由(1)可知,编译程序实际上实现了对高级语言程 序的翻译。故选D。
.
6
《编译原理教程》习题解析
7
1.2 计算机执行用高级语言编写的程序有哪些途径?它们 之间的主要区别是什么?
.
12
《编译原理教程》习题解析
13
图2-1 习题2.1的DFA M
编译原理陈意云课后答案
22.07.2020
luanj@
9
3.16 (续)
• Goto(I4, )) =
I6 S -> (L ) ∙
• Goto(I4, ,)=
I7 L -> L , ∙ S S -> ∙(L) S -> ∙a22.07.20来自0luanj@23
谢谢!!
22.07.2020
luanj@
19
3.26 (续)
I0 L’ -> ∙L, $ L -> ∙MLb, $ L -> ∙a, $ M -> ∙ , a
L I1 L’ -> L ∙, $
I2
M
L -> M ∙Lb, $ L -> ∙MLb, b
L -> ∙a, b
M -> ∙, a
• 只有直接左递归 S -> (L)|a L -> SL’ L’-> ,SL’|ε
22.07.2020
luanj@
3
3.8(b) (续)
• S -> (L)|a L -> SL’ L’-> ,SL’|ε
• FIRST(S) = {(, a} FIRST(L) = FIRST(S) = {(, a} FIRST(L’) = {,, ε}
➢S->aAc A->bAb|b
22.07.2020
luanj@
22
3.30 (续)
• 第二个不是LR(1)文法 第二个文法在句子的正中心按A->b规约, 而只向后看一位是无法判断是否到达句子 的中心位置的
• 存在冲突的项目集:
S -> a∙Ac, $ A -> ∙bAb, c A -> ∙b, c
编译原理 第4章习题解答
第四章习题解答4.1词法分析的主要任务是对源程序进行扫描,从中识别出单词,它是编译过程的第一步,也是编译过程中不可缺少的部分。
4.2单词符号一般分为五类:关键字、标识符、常数、运算符和界限符。
分别用整数1、2、3、4、5表示。
对于这种非一符一个类别码的编码形式,一个单词符号除了给出它的单词类别码之外,还要给出它的自身值。
标识符的自身值被表示成按字节划分的内部码。
常数的自身值是其二进制值。
由于语言中的关键字、运算符和界限符的数量都是确定的,因此,对这些单词符号可采用一符一个单词类别码。
如果采取一符一个单词类别码,那么这些单词符号的自身值就不必给出了。
4.3设计词法分析程序有如下几种方法:①由正规文法设计词法分析程序——程序设计语言的单词一般都可以用正规文法描述,从正规文法可构造一个FA。
再对FA确定化和状态个数最少化,最后得到一个化简了的DFA。
这个DFA正是词法分析程序的设计框图,这样,由DFA编制词法分析程序就容易了。
②由正规表达式设计词法分析程序——正规表达式也是描述单词的一种方便工具。
由正规表达式转换成NDFA,然后再对它确定化和状态个数最少化,可得一个DFA。
再由DFA编制词法分析程序。
4.4符号表在编译程序中具有十分重要的意义,它是编译程序中不可缺少的部分。
在编译程序中,符号表用来存放在程序中出现的各种标识符及其语义属性。
一个标识符包含了它全部的语义属性和特征。
标识符的全部属性不可能在编译程序的某一个阶段获得,而需要在它的各个阶段中去获得。
在编译程序的各个阶段,不仅要用获取的标识符信息去更新符号表中的内容,添加新的标识符及其属性,而且需要去查找符号表,引用符号表中的信息。
因为,符号表是编译程序进行各种语义检查(即语义分析)的依据,是进行地址分配的依据。
标识符处理的基本思想是,当遇到定义性标识符时,先去查符号表(标识符表)。
如果此标识符已在符号表中登记过,那么表明该标识符被多次声明,将作为一个错误,因为一个标识符只能被声明一次;如果标识符在符号表中未登记过,那么将构造此标识符的机内符,并在符号表中进行登记。
编译原理第4章答案
编译原理第4章答案第四章词法分析1.构造下列正规式相应的DFA :(1) 1(0|1)* 101 (2) 1(1010* | 1(010)* 1)* 0 (3) a((a|b)*|ab *a)* b (4) b((ab)* | bb)*ab 解:(1)1(0|1)*101对应的NFA 为(2)1(1010* | 1(010)* 1)* 0对应的NFA 为下表由⼦集法将NFA 转换为DFA :0 0,1(3)a((a|b)*|ab*a)* b (略)(4)b((ab)* | bb)* ab (略)2.已知NFA=({x,y,z},{0,1},M,{x},{z})其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)=φ,M(z,1)={y},构造相应的DFA。
解:根据题意有NFA图如下0,1 下表由⼦集法将NFA转换为DFA:下⾯将该DFA最⼩化:(1)⾸先将它的状态集分成两个⼦集:P1={A,D,E},P2={B,C,F}(2)区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等价。
由于F(B,0)=F(C,0)=C, F(B,1)=D,F(C,1)=E,⽽D,E不等价(见下步),从⽽B与C,F可以区分。
有P21={C,F},P22={B}。
(3)区分P1:由于A,E输⼊0到终态,⽽D输⼊0不到终态,所以D与A,E可以区分,有P11={A,E},P12={D}。
(4)由于F(A,0)=B,F(E,0)=F,⽽B,F不等价,所以A,E可以区分。
(5)综上所述,DFA可以区分为P={{A},{B},{D},{E},{C,F}}。
所以最⼩化的DFA如下:3.将图4.16确定化:图4.16解:下表由⼦集法将NFA转换为DFA:14.把图4.17的(a)和(b)分别确定化和最⼩化:(a) (b)解: (a):下表由⼦集法将NFA 转换为DFA :可得图(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,所以A,B 等价,可将DFA 最⼩化,即:删除B ,将原来引向B 的引线引向与其等价的状态A ,有图(a2)。
编译原理第四版课后答案
编译原理第四版课后答案第一章简介1.1 编译原理的定义编译原理是计算机科学中一个重要的领域,它涉及到将高级程序语言转化为机器语言的过程。
编译原理的目标是设计和实现一个能够将源代码转化为机器语言的编译器。
1.2编译器的结构和功能编译器一般包含以下几个部分:词法分析器、语法分析器、语义分析器、中间代码生成器、代码优化器和目标代码生成器。
这些部分协同工作,将源代码转化为可执行的机器语言。
1.3 编译原理的应用编译原理广泛应用于各个领域,如操作系统、数据库、嵌入式系统等。
在这些领域中,编译原理被用于将高级程序语言转化为机器语言,以在计算机上执行。
第二章词法分析2.1 词法分析的基本概念词法分析是编译器中的第一步,它将源代码划分为一个个的词法单元,如标识符、关键字、常量等。
词法分析器通过对源代码进行扫描和解析,生成词法单元的序列。
2.2 正则表达式正则表达式是一种用于描述字符串模式的工具。
在词法分析中,正则表达式常被用于识别和匹配不同的词法单元。
例如,正则表达式[a-z]+可以用来匹配一个或多个小写字母组成的标识符。
2.3 有限自动机有限自动机是一种用于识别和处理正则表达式的工具。
它由状态和转移函数组成,能够根据输入字符的不同改变状态,并最终确定是否接受输入。
有限自动机常被用于实现词法分析器。
第三章语法分析3.1 语法分析的基本概念语法分析是编译器中的第二步,它将词法单元序列转化为一棵语法树。
语法树是一种树形结构,用于表示源代码的语法结构。
语法分析器通过对词法单元序列进行解析和归约,生成语法树。
3.2 上下文无关文法上下文无关文法是用于描述程序语言语法的形式化工具。
它由一个或多个产生式组成,每个产生式包含一个非终结符和一串终结符或非终结符。
上下文无关文法常被用于定义编程语言的语法规则。
3.3 语法分析算法语法分析算法有多种,如递归下降分析、LL(1)分析、LR(1)分析等。
这些算法都是基于上下文无关文法的语法规则进行解析和归约,并生成语法树。
最新编译原理(课后习题答案ppt课件
10
(b) 试对于句子 not ( true or false) 构造一棵分析树.
bexpr bterm bfactor not bfactor
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
(a) 0 ( 0 | 1)* 0 由0和1组成且以0开始和结束的符号串全体.
(b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
16
3.4 对于下列语言分别写出它们的正规表达式:
(a) 英文字母组成的所有符号串, 要求符号串中顺序包含 五个元音字母. 令letter={非元音的英文字母} letter* (a|A) letter* (e|E) letter* (i|I) letter* (o|O) letter* (u|U) letter*
18
(e) 带有偶数个0和奇数个1的由0和1组成的符号串全体. E为带有偶数个0和1的由0和1组成的符号串全体. 即 ( 00 | 11)* ( ( 01 | 10 ) ( 00 | 11)* ( 01 | 10 ) ( 00 | 11)* )* E1E|E0E1E0E
编译原理(第2版)陈意云张昱编著课后答案精品PPT课件
0 start A'
1 最小化DFA
24
3.8 给定右线性文法G:
S 0S | 1S | 1A | 0B A 1C |1
B 0C | 1
C 0C | 1C | 0 | 1 试求一个等价的左线性文法G’.
1A
1
start S 0,1
1 C 0,1 f
0
0,1
0
B
0
状态转移图
图中状态C和f可合并, 得到左线性文法G’: C A1 | B0 | C1 | C0 A S1 B S0 S S0 | S1 |
( bexpr ) bexpr or bterm bterm bfactor bfactor false
11
true
(c) 试说明此文法产生的语言是全体布尔表达式.
12
练习: 长度为n的字符串, 分别有多少个 前缀, 后缀, 子串, 真前缀, 子序列 ? 前缀: n+1 后缀: n+1 子串: 1+ n+(n-1)+...+1 = 1+n(n+1)/2 真前缀: n 子序列: 1+Cn1+Cn2+Cn3+...+Cnn = 2n
S
S
if E then S
MS
e1 MS
if E then MS
else
S
if E then MS else S
e1 if E then MS else S
MS
e2 other
MS
e2 other if E then S other
s1 if E then MS else S
s1
e3 MS s3
编译原理考试习题及答案PPT课件
自底向上的语法分析是从输入的字符串出发,逐步将其归约为文法的起始符号。
自底向上的语法分析通常采用LR(0)、SLR(1)、LALR(2)等算法。
自底向上的语法分析可以检测出输入的字符串是否符合语言的语法规则,并生成相应的语法结构。
01
02
03
自底向上的语法分析
语法分析的算法和数据结构
语法分析的算法包括预测分析法、移位/归约法、LR(0)、SLR(1)、LALR(2)等。
三地址代码的生成
对三地址代码进行优化可以提高目标代码的执行效率,常见的优化技术包括常量折叠、死代码删除、循环展开等。
三地址代码的优化
循环优化
循环是程序中常见的结构之一,对循环进行优化可以提高程序的执行效率。常见的循环优化技术包括循环展开、循环合并、循环剪枝等。
要点一
要点二
死代码删除
死代码是指程序中永远不会被执行的代码,删除这些死代码可以减小目标代码的大小并提高程序的执行效率。
习题及答案解析
词法分析习题及答案解析
题目
给定一个字符串,判断它是否是合法的标识符。
答案解析
合法的标识符必须以字母或下划线开头,后面可以跟字母、数字或下划线。
题目
给定一个字符串,判断它是否是关键字。
答案解析
关键字是编程语言中预定义的保留字,不能用作标识符。例如,在C语言中,关键字包括`int`, `float`, `if`, `else`等。
答案解析
上下文无关文法是一种形式文法,它的产生式右部不依赖于左部的任何符号。这意味着产生式右部是一个终结符或一个非终结符的序列。
题目
给定一个抽象语法树,判断它是否是二叉树。
答案解析
抽象语法树是源代码的树形表示,每个节点表示源代码中的一个结构。如果一个抽象语法树中的每个节点最多有两个子节点,则它是二叉树。
4编译原理,陈意云 ,课后答案4(方案).ppt
..........
5
6.3
• 一个C程序如下: typedef struct _a{ char c1; long I; char c2; double f; } a; typedef struct _b{ char c1; char c2; long l; double f; } b; main(){ printf(“Size of double, long, char = %d,%d,%d\n”, sizeof(double), sizeof(long), sizeof(char)); printf(“Size of a, b = %d,%d\n”, sizeof(a), sizeof(b)); } 该程序在SPARC/Solaris工作站上运行结果如下: Size of double, long, char = 8,4,1 Size of a, b = 24,16 试分析为什么
..........
2
6.1 (续)
• with a a:=u b:=v with b a:=x b:=y
a—record a—a.a b—a.b b—record a—b.a b—b.b
..........
3
6.2
• 考虑下面的C程序 main(){ char * cp1, * cp2; cp1 = “12345”; cp2 = “abcdefghij”; strcpy(cp1, cp2); printf(“cp1 = %s \n cp2 = %s \n”, cp1, cp2); }
.data .align 4 .type aa,@object .size aa,4 aa: .long 10 .globl bb .align 2 .type bb,@object .size bb,2 bb: .value 20 .align 4 .type cc.2,@object .size cc.2,4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19990314/Linux(egcs-1.1.2 release)”
..........
10
6.4 (续)
.file "static.c“
.version “01.01”
gcc2_compiled:
.data
.align 4
.type aa,@object
.size aa,4
aa:
--aa分配在静态数据区,作
• 常量区连续分配
• 因而本题中”12345”和”abcdefghij”存储为 1 2 3 4 5 \0 a b c d e f g h i j \0
cp1
cp2
拷贝后结果为
a b c d e f g h i j \0 f g h i j \0
cp1
cp2
• 现代编译器编译通过,执行时会出错。(GCC: 段错误 / VC 非法访问)
..........
12
6.5 (续)
• 值调用 x := 5; y := 2; z := 2; y := y + 1; z := z + x; 为2
• 引用调用 t := a + b; a = a + 1; a = a + t;
• 值-结果调用 t:=a+b; x:=t;y:=a;z:=a y:=y+1;z:=z+x; t:=x;a:=y;a:=z;
..........
11
6.5
• 假定使用:(a)值调用;(b)引用调用;(c)值-结果调用;(d)换名 调用。下面程序的结果分别是什么?
program main(input, output); var a, b : integer; procedure p(x, y, z : integer); begin y := y + 1; z := z + x; end; begin a := 2; b := 3; p(a + b, a, a); print a; end.
• VC6下,Debug模式Memory窗口查看
|A
|1
|B
|1.0
|
• GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
..........
8
6.4
• 下面给出一个C程序及其在X86/Linux下的编译结 果,根据所生成的汇编程序来解释程序中4个变量 的存储分配、作用域、生成期和置初始值方式的 区别
short i1, j1; float f1, e1; printf(“Address of i, j, f,e = %o,%o,%o,%o\n”, &i, &j, &f, &e); printf(“Address of i1,j1,f1,e1 = %o,%o,%o,%o\n”, &i1, &j1, &f1, &e1); printf(“Address of short,int,long,float,double = %d,%d,%d,%d,%d\n”, sizeof(short), sizeof(int), sizeof(long), sizeof(float), sizeof(double)); } main(){ short i, j; float f, e; func(i, j, f, e); } 运行结果:
..........
5
6.3
• 一个C程序如下: typedef struct _a{ char c1; long I; char c2; double f; } a; typedef struct _b{ char c1; char c2; long l; double f; } b; main(){ printf(“Size of double, long, char = %d,%d,%d\n”, sizeof(double), sizeof(long), sizeof(char)); printf(“Size of a, b = %d,%d\n”, sizeof(a), sizeof(b)); } 该程序在SPARC/Solaris工作站上运行结果如下: Size of double, long, char = 8,4,1 Size of a, b = 24,16 试分析为什么
• 换名调用 a := a+1; a := a+(a+b);
对形参的调用不改变实参的值,结果a
结果a为8
结果为7 结果为9
..........
13
6.6
• 一个C程序如下: func(i1, i2, i3) long i1, i2, i3; { long j1, j2, j3; printf(“Address of i1 i2 i3 = %o,%o,%o\n”, &i1, &i2, &i3); printf(“Address of j1 j2 j3 = %o,%o,%o\n”, &j1, &j2, &j3); } main(){ long i1, i2, i3; func(i1, i2, i3); } 该程序在X86/Linux上运行结果为: Address of i1, i2, i3 = 27777775460,27777775464,27777775470 Address of j1, j2, j3 = 27777775444,27777775440,27777775434 从结果看func的3个形参地址逐渐升高,而3个局部变量地址逐渐降低。 试说明为什么
cc.2: .long 30 .text .align 4
.globl func .type func,@function
func: pushl %ebp movl %esp, %ebp subl $4, %esp movw $40, -2(%ebp)
.L1: leave ret
.Lfe1: .size func,.Lfe1-func .ident "GCC: (GNU) egcs-2.91.66
• GCC: (GNU) 3.2.2 (Red Hat Linux 3.2.2-5)结果为20,16
..........
7
6.3 (续)
• #include <stdio.h> static struct _a{ char c1; long i; char c2; double f; } a = {'A', 1, 'B', 1.0};
..........
6
6.3 (续)
• 数据对齐:为了寻址方便
• A: char long char
OXXX OOOO OXXX XXXX
double
OOOO OOOO
• B: char char long double
O OXX OOOO OOOO OOOO
• 可以用gcc –S命令查看编译后的汇 编码 VC下可以在debug模式下,菜单栏 View->Debug Windows中 Dissassenbly查看编译后的汇编码
..........
17
6.8
• 下面给出一个C程序及其在X86/Linux下的编译结果。从结果看,func的四个局部变量i1, j1,f1,e1的地址间隔和他们的类型一致,而形参i,j,f,e的地址间隔和他们的类型 不一致,试分析原因
func(i, j, f, e) short i, j; float f, e; {
.size cc.2,4
cc.2: --cc分配在静态数据区,作用域为本文件, 生存期为整个程序。源程序中在函数内部,为防止 重名,需要重命名为cc.2
.long 30 –cc静态置初值
.text .align 4 .globl func .type func,@function func: pushl %ebp movl %esp, %ebp subl $4, %esp movw $40, -2(%ebp) --dd分配在栈上,生存期为 func调用期,动态置初值 .L1: leave ret .Lfe1: .size func,.Lfe1-func .ident "GCC: (GNU) egcs-2.91.66 19990314/Linux(egcs-1.1.2 release)”
..........
16
6.7 (续)
• C语言不做实参和形参个数类型是否一致的 检查
• printf函数根据第一个参数—格式控制列表, 到栈中取参数
• 本题中虽然只传了格式控制列表,但是 printf函数分析格式控制列表,认为程序员 还传了3个整型数,因此继续去栈中取3个 参数,并输出之。
• 所以得到了三个不可预知值得整数。
static long aa = 10;
short bb = 20;
func(){
static long cc = 30;
short dd = 40;
} 生成的汇编代码:
..........
9
6.4 (续)
.file "static.c“ .version “01.01” gcc2_compiled:
用域为本文件,生存期为整个程序
.long 10 –aa静态置初值
.globl bb
--bb分配在静态数据区,作
用域为全局,可以被其他文件引用,