编译原理课后作业参考答案

合集下载

编译原理 全部参考答案

编译原理 全部参考答案

第二章P-36-6(1)L(G)是0~9组成的数字串;(2)最左推导:N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒01DD⇒012D⇒0127N⇒ND⇒DD⇒3D⇒34N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568最右推导:N⇒ND⇒N7⇒ND7⇒N27⇒ND27⇒N127⇒D127⇒0127N⇒ND⇒N4⇒D4⇒34N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568P-36-7G(S):(没有考虑正负符号问题)S→P|APP→1|3|5|7|9A→AD|NN→2|4|6|8|PD→0|N或者:(1)S→ABC|CA→1|2|3|4|5|6|7|8|9B→BA|B0|εC→1|3|5|7|9P-36-8G(E):E→T|E+T|E-TT→F|T*F|T/FF→(E)|i最左推导:E⇒E+T⇒T+T⇒F+T⇒i+T⇒i+T*F⇒i+F*F⇒i+i*F⇒i+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⇒T⇒T*F⇒T*(E)⇒T*(E+T)⇒T*(E+F)⇒T*(E+i)⇒T*(T+i)⇒T*(F+i)⇒T*(i+i)⇒F*(i+i)⇒i*(i+i)语法树:SiSeSiSiiSiS i S eS iiP-36-9句子:iiiei 有两个语法树: S ⇒iSeS ⇒iSei ⇒iiSei ⇒iiiei S ⇒iS ⇒iiSeS ⇒iiSei ⇒iiiei因此iiiei 是二义性句子,因此 该文法是二义性的。

P-36-10 S →TS|T T →(S)|()P-36-11L1: 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 第三章(1)Ei+i+iE +TE +TT F iF iF iEE +TT F iT *FF iii+i*i Ei-i-iE-TE -TT F iF iF i确定化:最小化:{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}P64-8(1)(0|1)*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(1|01*0)*P84-12(a)a最小化:{0,1} {2,3}{0,1}a={1},{0,1}b={2}{2,3}a={0,3},{2,3}={3}{0,1},{2},{3}a(b)已经确定化,只需最小化:{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}所以不能再分aP64-14正规式:(0|10)*还可以:然后再确定化,最小化,结果应该一样。

编译原理-第1章 编译概述--习题答案

编译原理-第1章 编译概述--习题答案

第1章编译概述1.判断下面的陈述是否正确。

(1)编译器生成的目标程序都是可执行的程序。

(2)汇编器将高级语言程序翻译成汇编语言程序。

(3)编译程序和解释程序的根本区别在于解释程序对源程序并没有真正进行翻译。

(4)因为编译程序和解释程序具有不同的功能,所以它们的实现技术也完全不同。

(5)编译程序的五个组成部分缺一不可。

(6)许多编译程序在识别出语法单位后并不真正构造语法树。

(7)高级语言程序到低级语言程序的转换是基于语义的等价变换。

(8)含有优化部分的编译程序的执行效率高。

(9)优化的任务在于对中间代码进行加工和变换,以使其能产生运行结果更为准确的目标代码。

(10)编译前端主要由与源语言和目标机相关的那些部分组成。

(11)无论一遍扫描的编译器还是多遍扫描的编译器都要对源程序至少扫描一遍。

(12)在编译过程中,既可以将几个不同的阶段合为一遍,也可以把一个阶段的工作分为若干遍。

(13)取编译程序前端改写其后端以生成不同机器上的目标代码,目前技术上还难以实现。

(14)支持程序设计人员进行程序计开发的工具,除了编译程序以外,还需要编辑程序、链接程序和调试程序等其他一些工具。

2. 指出下列错误信息是编译的哪个阶段报告的A. 词法B. 语法C. 语义(1)else没有匹配的if(2)使用的标识符没有定义(3)标识符中出现?号(4)赋值语句写成:x+y=1;(5)float a=1.1, b=2, c ; c=a%b;(6)数组下标越界3. 阅读教材第1章,回答以下问题:(1)计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?(2)画出编译程序的总体逻辑结构图,以语句“Area=3.14*r*r”编译过程为例,简述编译各个阶段的主要任务。

习题答案1.(1) × (2) × (3) × (4) × (5) × (6) √ (7) √(8) × (9) × (10) × (11) √ (12) √ (13) × (14) √2.BCABCC。

《编译原理》作业参考答案

《编译原理》作业参考答案

《编译原理》作业参考答案一、填空1.图二图一。

2.文法是无ε产生式,且任意两个终结符之间至多有一种优先关系的算符文法。

3.最右推导最右推导。

4.对于循环中的有些代码,如果它产生的结果在循环中是不变的,就把它提到循环外来。

把程序中执行时间较长的运算替换为执行时间较短的运算。

5.对于文法中的每个非终结符A的各个产生式的候选首符集两两不相交;对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则FIRST(A)∩FOLLOW(A)= ø6.控制。

7.语义分析和中间代码产生8.自上而下自下而上自上而下9.自下而上表达式10.自下而上11.源程序单词符号12. DFA初态唯一,NFA初态不唯一;DFA弧标记为Σ上的元素,NFA弧标记为Σ*上的元素;DFA的函数为单射,NFA函数不是单射13.词法,词法分析器,子程序,语法14.ε,a,ab,ab15.终结符号,非终结符号,产生式16.L(G)={a n | n≥1}17.1型,2型,3型18.二义的19.快20.终态,输入字21.单词符号,终结符22.归约23.必须24.直接25.终结符,更快26.E→E+∙T, E→E∙+T, E→∙E+T, E→E+T∙27.归约—归约28.类型检查,一致性检查29.词法分析、词法30.语法分析程序、语法31。

终结符号、产生式、开始符号、非终结符32.2、2、333.不需要避开34.符合、不符合35.推导36.包括37.Ass38.一定没有、一定没有、至多只有一个39.SLR(1)40.移进——归约41.a.控制流检查、b.一致性检查、c.相关名字检查二、判断下面语法是否正确1 ×2 ×3 √4 ×5 √6 ×三、简答题1.词法分析的任务是对输入的源程序进行单词及其属性的识别,为下一步的语法分析进行铺垫;有两种方法可以实现词法分析器:一,手工编写词法分析程序。

二,由词法分析器自动生成程序生成。

编译原理习题参考答案

编译原理习题参考答案

程序设计语言与编译——语言的设计与实现(第2版)习题4答案4-5 解:上下文有关文法(1型文法),产生的语言L(G){=a i b i c i | i≥1,i为整数} 4-6 解:3型文法,L(G)={a i | i≥1,i为奇数}4-7 解:2型文法,L(G)={a i b i | i≥1,i为整数}4-8 解:1型文法,L(G)={a i b i c i | i≥1,i为整数}4-9 解:1. 最左推导最右推导S⇒ (A) ⇒ (B) ⇒(SdB) S⇒ (A) ⇒ (B) ⇒ (SdB)⇒ ((A)dB) ⇒ ((B)dB) ⇒ (SdS) ⇒ (Sda)⇒ ((S)dB) ⇒ ((b)dB) ⇒ ((A)da ⇒ ((B)da)⇒ ((b)dS) ⇒ ((b)da) ⇒ ((s)da⇒ ((b)da)2. 语法树4-10解:1. 因为存在推导S ⇒ SbF ⇒ SbP ⇒ Sbc ⇒ Fbc ⇒ FaPbc所以FaPbc是文法G (S) 的一个句型。

2. 语法树4-11解:因为串aaabaa可有下列两棵不同的语法树所以文法G (S)是二义文法。

因为串i(*可有下列两棵不同的语法树9-2解:(1)消除文法G的②产生式直接左递归。

A→SeA' | fA' ③A'→dA' | ε④(2)消除间接左递归:按S.A排序,将S的①产生式代入③有A→AaeA' | AbeA' | ceA' | fA' ⑤(3)消除⑤的直接左递归有A→ceA'A" | fA'A" ⑥A"→aeA'A" | beA'A" | ε⑦(4)对S的①产生式提公因子有S→AB | c ⑧B→| a | b ⑨(5)最后,文法G提取公因子,消除左递归后的产生式由⑧, ⑨, ⑥, ⑦和④组成,无多余的产生式。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理第二版课后习答案

编译原理第二版课后习答案

编译原理第二版课后习答案编译原理是计算机科学领域中的一门重要学科,它主要研究程序的自动翻译技术,将高级语言编写的程序转换为机器能够执行的低级语言。

编译原理的基本概念和技术是计算机专业学生必须学会的知识之一,而编译原理第二版课后习题则是帮助学生更好地理解课程内容和提高编译器开发能力的重要资源。

本篇文章将对编译原理第二版课后习题进行分析和总结,并提供一些参考答案和解决问题的思路。

一、词法分析词法分析是编译器的第一步,它主要将输入的字符流转换为有意义的词法单元,例如关键字、标识符、常量和运算符等。

在词法分析过程中,我们需要编写一个词法分析程序来处理输入的字符流。

以下是几道词法分析相关的习题:1. 如何使用正则表达式来表示浮点数?答案:[+|-]?(\d+\.\d+|\d+\.|\.\d+)([e|E][+|-]?\d+)?这个正则表达式可以匹配所有的浮点数,包括正负小数、整数和指数形式的浮点数。

2. 什么是语素?举例说明。

答案:语素是构成单词的最小承载语义的单位,例如单词“man”,它由两个语素“ma”和“n”组成。

“ma”表示男性,“n”表示名词。

3. 采用有限状态自动机(Finite State Automata)实现词法分析的优点是什么?答案:采用有限状态自动机(Finite State Automata)实现词法分析的优点是运行速度快,消耗内存小,易于编写和调试,具有可读性。

二、语法分析语法分析是编译器的第二步,它主要检查词法分析生成的词法单元是否符合语法规则。

在语法分析过程中,我们需要编写一个语法分析器来处理词法单元序列。

以下是几道语法分析相关的习题:1. 什么是上下文无关文法?答案:上下文无关文法(Context-Free Grammar, CFG)是一种形式语言,它的语法规则不依赖于上下文,只考虑规则左边的非终结符号。

EBNF是一种常见的上下文无关文法。

2. LR分析表有什么作用?答案:LR分析表是一种自动机,它的作用是给定一个输入符号串,判断其是否符合某个文法规则,并生成语法树。

编译原理第三版课后习题答案

φ
φ
给状态编号:
a
b
0
1
2
1
1
2
2
0
3
3
3
3
a
a
a b b b
b
a
最小化:
a a
b b
a
b
(b)
b b a
a b
a
a b
b a
a a
已经确定化了,进行最小化
最小化:
b b a
a b
a
P64–
(1) 0
1
0
(2):
0
1
0
确定化:
0
1
{X,1,Y}
{1,Y}
{2}
{1,Y}
{1,Y}
{2}
{2}
{1,Y}
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)={+,),#}
P
(1)
是0~9组成的数字串
(2)
最左推导:
最右推导:
P
G(S)
P36-8
文法:
最左推导:
最右推导:
语法树:/********************************
*****************/
P36-
句子iiiei有两个语法树:
P36-

编译原理第二版课后习答案

《编译原理》课后习题答案第一章第?1?章引论第?1?题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)?编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)?源程序:源语言编写的程序称为源程序。

(3)?目标程序:目标语言书写的程序称为目标程序。

(4)?编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)?后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)?遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第?2?题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含?8?个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

编译原理课后习题答案ch9


盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第九章
附加题
问题 1: 利用 Pascal 的作用域规则,试确定在下面的 Pascal 程序中的名字 a 和 b 的每一次出现 所应用的说明。 program m ( input, output ) ; procedure n ( u, v, x, y : integer ) ; var m : record m, n : interger end ; n : record n, m : interger end ; begin with m do begin m := u ; n:= v end ; with n do begin m := x ; n := y end ; writeln ( m.m, m.n, n.m, n.n ) end ; begin m ( 1, 2, 3, 4 ) end. 答案: 图中用蓝色数字下标相应标明。 program m1 ( input, output ) ; procedure n1( u, v, x, y : integer ) ; var m2 : record m3, n2 : interger end ; n3 : record n4, m4 : interger end ; begin with m2 do begin m3 := u ; n2 := v end ; with n3 do begin m4 := x ; n4 := y end ; writeln ( m2.m3, m2.n2, n3.m4, n3.n4 ) end ; begin m1 ( 1, 2, 3, 4 ) end. 问题 2: 当一个过程作为参数被传递时,我们假定有以下三种与此相联系的环境可以考虑,下 面的 Pascal 程序是用来说明这一问题的。 一种是词法环境 (lexical environment) , 如此这样的一个过程的环境是由这一过程定义 之处的各标识符的联编所构成; 一种是传递环境(passing environment) ,是由这一过程作为参数被传递之处的各标识

编译原理课后习题答案+清华大学出版社第二版


b∶=10; end (q); procedure s; var c,d; procedure r;
e,f;
begin (r)
call q;
end (r); begin (s)
call r; end (s);
begin (p) call s;
end (p);
begin (main)
call p; end
返回地址 RA 的用途。
答案: 栈顶指针 T,最新活动记录基地址指针 B,动态链指针 DL,静态链指针 SL 与返回地址
RA 的用途说明如下: T: 栈顶寄存器 T 指出了当前栈中最新分配的单元(T 也是数组 S 的下标)。 B:基址寄存器,指向每个过程被调用时,在数据区 S 中给它分配的数据段起 始 地址,
总而言之,是边翻译边执行。 像 C,Pascal 之类的语言,属于编译型的高级语言。它们的特点是计算机事先对高级语 言进行全盘翻译,将其全部变为机器代码,再统一执行,即先翻译,后执行。从速度上看, 编译型的高级语言比解释型的高级语言更快。
盛威网()专业的计算机学习网站
4
《编译原理》课后习题答案第二章
第 2题
一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序 的总体结构图。
答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语
义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和 错误处理程序。其各部分的主要功能简述如下。
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作业参考答案第二章 高级语言及其语法描述6、(1)L (G 6)={0,1,2,......,9}+(2)最左推导:N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 N=>ND=>DD=>3D=>34N=>ND=>NDD=>DDD=>5DD=>56D=>568 最右推导:N=>ND =>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 N=>ND=>N4=>D4=>34N=>ND=>N8=>ND8=>N68=>D68=>568 7、G:S →ABC | AC | CA →1|2|3|4|5|6|7|8|9B →BB|0|1|2|3|4|5|6|7|8|9C →1|3|5|7|98、(1)最左推导:E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+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=>T=>T*F=>T*(E)=>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=>T*(i+i)=>F*(i+i)=>i*(i+i) (2)9、证明:该文法存在一个句子iiiei 有两棵不同语法分析树,如下所示,因此该文法是二义的。

T F F iFiF i T F i F iS i11、第3章 词法分析7、构造下列正规式相应的DFA :1(0|1)*101 解:(1)构造NFA :(2)确定化:重命名:(注:已是最简)8、(1)(0|1)*01(2)(0|1|2|3|4|5|6|7|8|9)(1|2|3|4|5|6|7|8|9)*(0|5)|0|5(3)(10*1|0)*10*|(01*0|1)*01*(4)a *b *c *......z *9、(1)正规式(0|1)*(010)(0|1)*NFA:G1: S →AB A →aAb|ab B →cB|ε G2: S →AB A →aA|ε B →bBc|bc G3: S →AA A →aAb|ε G4:S →1S0|A A →0A1|ε构造状态转换矩阵: 重命名:画出DFA :最少化后:重命名:重命名:画出确定化后的有限自动机:(b )最少化:首先分为终态集和非终态集: {0,1}{2,3,4,5} {0,1}a={1} {0,1}b={2,4}1{2,3,4,5}a={1,3,0,5} 可分为{2,4}和{3,5} {2,4}b={3,5}{3,5}b={2,4}形成划分:{0,1}{2,4}{3,5}最少化后的DFA:b14、每个1都有0直接跟在右边:(10|0)*15、画出NFA:等价的左线性正规文法:F→A1|B0|C0|C1S→0|1|S0|S1A→1|S1B→0|S0C→A1|B0|C0|C1第4章 语法分析——自上而下分析 1、S →a|^|(T) T →T,S|S (1)消除左递归S →a|^|(T) T →ST ’T ’ →,ST ’|ε 递归下降子程序:该文法是LL(1)的: 方法一(利用概念):a. 不含左递归;b. 候选终结首符集没有交集;c. ε∈first(T ’),follow(T ’)∩first(T ’)={} 方法二(指出预测分析表没有多重入口) 2、: void S() {if (sym==’a ’) advanced();else if (sym==’^’) advanced(); else if (sym==’(‘) {advanced();T();if (sym==’)’) advanced(); else error(); }else error(); } void T() { S(); T ’(); } void T ’() { if (sym==’,’){advanced(); S(); T ’();} else if (sym in follow(T ’)) else error(); }(2)略4、文法:Expr→-Expr|(Expr)|Var ExprTailExprTail→-Expr|εVar→id VarTailVarTail→(Expr)|ε(1)构造LL(1)分析表:第5章 语法分析——自下而上分析 1、文法:E →E+T|T T →T*F|F F →(E)|i证明E+T*F 是它的一个句型,并指出该句型所有短语、直接短语和句柄。

解:E+T*F 是它的一个句型,因为存在下面语法树:短语:T*F, E+T*F 直接短语:T*F 句柄:T*F 2、文法: S →a|^|(T) T →T,S|S(1)给出(a,(a,a))和(((a,a),^,(a)),a)的最左和最右推导;(2)指出(((a,a),^,(a)),a)的规范归约以及每一步的句柄,根据这个规范归约,给出“移进-归约”过程,并给出它的语法树自下而上构造过程。

解: (1)略(2)①规范句型及每一步的句柄(用下划线标示):②“移进-规约”过程:步骤 分析栈 输入串 动作 (1) # (((a,a),^,(a)),a)# 预备 (2) #( ((a,a),^,(a)),a)# 移进 (3) #(( (a,a),^,(a)),a)# 移进 (4) #((( a,a),^,(a)),a)# 移进 (5) #(((a ,a),^,(a)),a)# 移进 (6) #(((S ,a),^,(a)),a)# 归约 (7) #(((T ,a),^,(a)),a)# 归约E E + T T * F(8)#(((T, a),^,(a)),a)# 移进(9)#(((T,a ),^,(a)),a)# 移进(10)#(((T,S ),^,(a)),a)# 归约(11)#(((T ),^,(a)),a)# 归约(12)#(((T) ,^,(a)),a)# 移进(13)#((S ,^,(a)),a)# 归约(14)#((T ,^,(a)),a)# 归约(15)#((T, ^,(a)),a)# 移进(16)#((T,^ ,(a)),a)# 移进(17)#((T,S ,(a)),a)# 归约(18)#((T ,(a)),a)# 归约(19)#((T, (a)),a)# 移进(20)#((T,( a)),a)# 移进(21)#((T,(a )),a)# 移进(22)#((T,(S )),a)# 归约(23)#((T,(T )),a)# 归约(24)#((T,(T) ),a)# 移进(25)#((T,S ),a)# 归约(26)#((T ),a)# 归约(27)#((T) ,a)# 移进(28)#(S ,a)# 归约(29)#(T ,a)# 归约(30)#(T, a)# 移进(31)#(T,a )# 移进(32)#(T,S )# 归约(33)#(T )# 归约(34)#(T) # 移进(35)#S # 归约(36)#S # 接受③语法树的自下而上的构造过程:3、(1)计算练习2文法G2的FIRSTVT和LASTVT;(2)计算G2的优先关系,G2是一个算符优先文法吗?(3)给出输入串(a,(a,a))的算符优先分析过程。

解:因为:1)该文法不含ε产生式;2)该文法是算符文法;3)由优先关系表可以看出,任何终结符之间的优先关系之多满足一种优先关系;所以该文法是算符优先文法。

(3)步骤分析栈输入串动作原因0 # (a,(a,a))# 预备1 #( a,(a,a))# 移进#<(2 #(a ,(a,a))# 移进(<a3 #(S ,(a,a))# 归约a>,4 #(S, (a,a))# 移进(>,5 #(S,( a,a))# 移进,<(6 #(S,(a ,a))# 移进(<a7 #(S,(S ,a))# 归约a>,8 #(S,(S, a))# 移进(<,9 #(S,(S,a ))# 移进,<a10 #(S,(S,S ))# 归约,>)11 #(S,(T ))# 归约,>)12 #(S,(T) )# 移进(=)13 #(S,S )# 归约)>)14 #(T )# 归约,>)15 #(T) # 移进(=)16 #S # 归约)>#17 #S# 分析成功5、考虑文法:S→AS|bA→SA|a(1)列出这个文法所有的LR(0)项目;(2)构造这个文法的LR(0)项目集规范族以及识别活前缀的DFA ; (3)这个文法是SLR 的吗?若是,构造分析表; (4)这个文法是LALR 或LR(1)的吗? 解:拓广文法如下:S ’→S S →AS|b A →SA|a(1)所有LR(0)项目如下:1)S ’→.S 2)S ’→S . 3)S →.AS 4)S →A .S 5)S →AS . 6)S →.b7)S →b . 8)A →.SA 9) A →S .A 10)A →SA . 11)A →.a 12)A →a . (2)该文法的LR(0)项目集规范族如下:DFA 略。

(3)FOLLOW(S)={#,a,b} FOLLOW(A)={a,b}在LR(0)项目集规范族中,同时存在“移进-归约”和“归约-归约”项目的项目集有I1,I5和I7;其中I1中“归约”项目是“接受”项目,面临#时接受,移进项目要求面临a 和b 时移进,不存在冲突;I5中归约项目面临FOLLOW(A)中元素a,b 时归约,“移进”项目面临a,b 时移进,存在冲突;同理,I7也存在冲突。

所以该文法不是SLR 的。

(或者:构造出SLR 分析表,指出存在多重入口) (4)构造LR(1)项目集规范族:I0: S ’→.S S →.AS S →.b A →.SA A →.a I1: S ’→S. A →S.A A →.SA A →.a S →.AS S →.b I2: S →A.S S →.AS S →.b A →.SA A →.a I3: S →b. I4: A →a. I5: A →SA. S →A.S S →.AS S →.b A →.SA A →.a I6: A →S.A A →.SA A →.a S →.AS S →.b I7: S →AS. A →S.A A →.SA A →.a S →.AS S →.b I0: S ’→.S ,# S →.AS ,#/a/b S →.b ,#/a/b A →.SA ,a/b A →.a ,a/b I1: S ’→S. ,# A →S.A, a/b A →.SA, a/b A →.a, a/b S →.AS, a/b S →.b, a/b I2: S →A.S, #/a/b S →.AS, #/a/b S →.b, #/a/b A →.SA, a/b A →.a, a/b I3: S →b. , #/a/b I4: A →a. , a/b I5: A →SA. , a/b S →A.S, a/b S →.AS, a/b S →.b, a/b A →.SA, a/bA →.a, a/bI6: A →S.A , a/bA →.SA, a/b A →.a, a/b S →.AS, a/b S →.b, a/b I7: S →b. , a/b I8: S →AS. , #/a/b A →S.A, a/b A →.SA, a/b A →.a, a/b S →.AS, a/b S →.b, a/b因为:I5,I8,I9中存在“移进-归约”冲突,所以该文法不是LR(1)的,更不是LALR 的。

相关文档
最新文档