编译原理及实现课后习题答案孙悦红
编译原理及实现课后答案

5.1 考虑以下的文法:S→S;T|TT→a(1)为这个文法构造LR(0)的项目集规范族。
(2)这个文法是不是LR(0)文法?如果是,则构造LR(0)分析表。
(3)对输入串“a;a”进行分析。
解:(1)拓广文法G[S’]:0:S’→S1:S→S;T2:S→T3:T→a构造LR(0)项目集规范族(2)该文法不存在“归约-归约”和“归约-移进”冲突,因此是LR(0)文法。
LR(0)分析表如下:(3)对输入串“a;a”进行分析如下:5.2 证明下面文法是SLR(1)文法,但不是LR(0)文法。
S→AA→Ab|bBaB→aAc|a|aAb解:文法G[S]:0:S→A1:A→Ab2:A→bBa3:B→aAc4:B→a5:B→aAb状态5存在“归约-移进”冲突,状态9存在“归约-归约”冲突,因此该文法不是LR(0)文法。
状态5:FOLLOW(B)={a},因此,FOLLOW(B)∩{b}=Φ状态9:FOLLOW(B)={a},FOLLOW(A)={#,b,c},因此FOLLOW(B)∩FOLLOW(A)=Φ该SLR(1)分析表无重定义,因此该文法是SLR(1)文法,不是LR(0)文法。
5.3 证明下面文法是LR(1)文法,但不是SLR(1)文法。
S→AaAb|BbBaA→εB→ε解:拓广文法G[S’]:0:S’→S1:S→AaAb2:S→BbBa3:A→ε4:B→ε={a,b},即FOLLOW(A)∩FOLLOW(B)={a,b}≠Φ,所以该文法不是SLR(1)文法。
构造LR(1)项目集规范族:分析表无重定义,说明该文法是LR(1)文法,不是SLR(1)文法。
5.4 考虑以下的文法:E→EE+E→EE*E→a(1)为这个文法构造LR(1)项目集规范族。
(2)构造LR(1)分析表。
(3)为这个文法构造LALR(1)项目集规范族。
(4)构造LALR(1)分析表。
(5)对输入符号串“aa*a+”进行LR(1)和LALR(1)分析。
编译原理教程课后习题答案

第二章 词法分析2.1 完成下列选择题: (1) 词法分析器的输出结果是 。
a. 单词的种别编码 b. 单词在符号表中的位置 c. 单词的种别编码和自身值 d. 单词自身值 (2) 正规式M1和M2等价是指 。
a. M1和M2的状态数相等 b. M1和M2的有向边条数相等 c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向边条数相等 (3) DFA M(见图2-1)接受的字集为 。
a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合 【解答】 (1) c (2) c (3) d图2-1 习题的DFA M2.2 什么是扫描器?扫描器的功能是什么? 【解答】 扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
通常是把词法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。
每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。
2.3 设M=({x,y}, {a,b}, f, x, {y})为一非确定的有限自动机,其中f 定义如下: f(x,a)={x,y} f {x,b}={y} f(y,a)=Φ f{y,b}={x,y} 试构造相应的确定有限自动机M ′。
【解答】 对照自动机的定义M=(S,Σ,f,So,Z),由f 的定义可知f(x,a)、f(y,b)均为多值函数,因此M 是一非确定有限自动机。
先画出NFA M 相应的状态图,如图2-2所示。
图2-2 习题的NFA M用子集法构造状态转换矩阵,如表表2-1 状态转换矩阵1b将转换矩阵中的所有子集重新命名,形成表2-2所示的状态转换矩阵,即得到 M ′=({0,1,2},{a,b},f,0,{1,2}),其状态转换图如图2-3所示。
(完整版)编译原理及实现课后习题答案

编译原理及实现课后习题解答2.1设字母表A={a},符号串x=aaa,写出下列符号串及其长度:x0,xx,x5 以及A+和A*.x0=(aaa)0=ε| x0|=0xx=aaaaaa |xx|=6x5=aaaaaaaaaaaaaaa | x5|=15A+ =A1∪A2∪ …. ∪A n∪…={a,aa,aaa,aaaa,aaaaa…}A* = A0 ∪A1 ∪A2 ∪…. ∪A n ∪…={ε,a,aa,aaa,aaaa,aaaaa…}2.2令∑={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3xy=abcb |xy|=4xyz=abcbaab |xyz|=7(xy)3=(abcb)3 =abcbabcbabcb | (xy)3 |=122.3设有文法G[S]:S∷=SS*|SS+|a,写出符号串aa+a*规范推导,并构造语法树。
S => SS* => Sa* => SS+a* => Sa+a* => aa+a*SS S *S S + aa a2.4 已知文法G[Z]:Z∷=U0∣V1 、U∷=Z1∣1 、V∷=Z0∣0 ,请写出全部由此文法描述的只含有四个符号的句子。
Z=>U0=>Z10=>U010=>1010Z=>U0=>Z10=>V110=>0110Z=>V1=>Z01=>U001=>1001Z=>V1=>Z01=>V101=>01012.5已知文法G[S]:S∷=AB A∷=aA︱εB∷=bBc︱bc , 写出该文法描述的语言。
A∷=aA︱ε描述的语言: {a n|n>=0}B∷=bBc︱bc 描述的语言:{b n c n|n>=1}L(G[S])={a n b m c m|n>=0,m>=1}2.6已知文法E∷=T∣E+T∣E-T 、T∷=F∣T*F∣T/F 、F∷=(E)∣i,写出该文法的开始符号、终结符号集合V T、非终结符号集合V N。
编译原理及实现(孙悦红)期末复习

编译原理期末复习注:下面出现的字母中,若无特别说明,小写英文字母为终结符,大写英文字母为非终结符,希腊字母为终结符与非终结符的任意组合。
第一、二章(1)简述编译程序的概念及其构成答:1)编译程序:它特指把某种高级程序设计语言翻译成等价的低级程序设计语言的翻译程序。
2)构成:标识符的各种属性是在编译的不同阶段填入符号表的。
词法分析阶段只能分析出标识符名,语法分析阶段只能判断标识符在语句中出现是否合法,只有到了语义分析阶段,才能将标识符的各种属性填入符号表并使用这些属性生成中间代码。
(2)简述词法分析阶段的主要任务(也有可能问语法分析阶段主要任务)答:词法分析的任务是输入源程序,对源程序进行扫描,识别其中的单词符号,把字符串形式的源程序转换成单词符号形式的源程序。
语法分析的主要任务是对输入的单词符号进行语法分析(根据语法规则进行推导或者归约),识别各类语法单位,判断输入是不是语法上正确的程序即:检查这个符号串是否为该程序语言的句子。
若是,输出该句子的分析树;若不是,则表示源程序存在语法错误,需要报告错误的性质和位置。
代码进行优化的目的:提高目标程序的执行效率。
代码优化首先在中间代码上进行。
代码优化不是编译程序的必要组成部分,不同的编译程序所进行的代码优化程度差别很大,能够完成代码优化的编译程序称为“优化编译程序”。
编译的最后一步是将中间代码生成特定机器上的低级语言代码。
这部分与机器类型有关,对程序中的每个变量指定存贮单元,把中间代码的指令翻译成等价的某种类型机器的机器指令代码或汇编指令代码。
目标代码的形式可以使绝对指令代码、可重定位的机器指令代码或汇编指令代码。
(3)高级语言的特点:(4) 说明解释和编译的区别:1)编译要程序产生目标程序,解释程序是边解释边执行,不产生目标程序;2)编译程序运行效率高而解释程序便于人机对话。
解释:以源程序作为输入,输入一句解释执行一句,不产生完整的目标程序,相应的翻译程序称为解释程序(Interpreter) 。
《编译原理》习题解答

《编译原理》习题解答:第一次作业:P14 2、何谓源程序、目标程序、翻译程序、汇编程序、编译程序和解释程序?它们之间可能有何种关系?答:被翻译的程序称为源程序;翻译出来的程序称为目标程序或目标代码;将汇编语言和高级语言编写的程序翻译成等价的机器语言,实现此功能的程序称为翻译程序;把汇编语言写的源程序翻译成机器语言的目标程序称为汇编程序;解释程序不是直接将高级语言的源程序翻译成目标程序后再执行,而是一个个语句读入源程序,即边解释边执行;编译程序是将高级语言写的源程序翻译成目标语言的程序。
关系:汇编程序、解释程序和编译程序都是翻译程序,具体见P4 图 1.3。
P14 3、编译程序是由哪些部分组成?试述各部分的功能?答:编译程序主要由8个部分组成:(1)词法分析程序;(2)语法分析程序;(3)语义分析程序;(4)中间代码生成;(5)代码优化程序;(6)目标代码生成程序;(7)错误检查和处理程序;(8)信息表管理程序。
具体功能见P7-9。
P14 4、语法分析和语义分析有什么不同?试举例说明。
答:语法分析是将单词流分析如何组成句子而句子又如何组成程序,看句子乃至程序是否符合语法规则,例如:对变量x:= y 符合语法规则就通过。
语义分析是对语句意义进行检查,如赋值语句中x与y类型要一致,否则语法分析正确,语义分析则错误。
P15 5、编译程序分遍由哪些因素决定?答:计算机存储容量大小;编译程序功能强弱;源语言繁简;目标程序优化程度;设计和实现编译程序时使用工具的先进程度以及参加人员多少和素质等等。
补充:1、为什么要对单词进行内部编码?其原则是什么?对标识符是如何进行内部编码的?答:内部编码从“源字符串”中识别单词并确定单词的类型和值;原则:长度统一,即刻画了单词本身,也刻画了它所具有的属性,以供其它部分分析使用。
对于标识符编码,先判断出该单词是标识符,然后在类别编码中写入相关信息,以表示为标识符,再根据具体标识符的含义编码该单词的值。
编译原理及实现课后习题答案 孙悦红

2.1 设字母表A={a},符号串x=aaa,写出下列符号串及其长度:x0,xx,x5以及A+和A*.x0=(aaa)0=ε | x0|=0xx=aaaaaa |xx|=6x5=aaaaaaaaaaaaaaa | x5|=15A+ =A1∪A2∪…. ∪A n∪…={a,aa,aaa,aaaa,aaaaa…}A* = A0 ∪A1 ∪ A2∪…. ∪ A n∪…={ε,a,aa,aaa,aaaa,aaaaa…}2.2 令∑={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3xy=abcb |xy|=4xyz=abcbaab |xyz|=7(xy)3=(abcb)3 =abcbabcbabcb | (xy)3 |=122.3设有文法G[S]:S∷=SS*|SS+|a,写出符号串aa+a*规范推导,并构造语法树。
S => SS* => Sa* => SS+a* => Sa+a* => aa+a*2.4 已知文法G[Z]:Z∷=U0∣V1 、 U∷=Z1∣1 、 V∷=Z0∣0 ,请写出全部由此文法描述的只含有四个符号的句子。
Z=>U0=>Z10=>U010=>1010Z=>U0=>Z10=>V110=>0110Z=>V1=>Z01=>U001=>1001Z=>V1=>Z01=>V101=>01012.5 已知文法G[S]: S∷=AB A∷=aA︱ε B∷=bBc︱bc , 写出该文法描述的语言。
A∷=aA︱ε描述的语言: {a n|n>=0}B∷=bBc︱bc描述的语言:{b n c n|n>=1}L(G[S])={a n b m c m|n>=0,m>=1}2.6 已知文法E∷=T∣E+T∣E-T 、 T∷=F∣T*F∣T/F 、 F∷=(E)∣i,写出该文法的开始符号、终结符号集合V T、非终结符号集合V N。
编译原理及实践教程第1章参考答案

1.翻译程序:能够将某种语言写的程序转换成另一种语言的程序,而且后者与前者在逻辑上是等价的。
编译程序:是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序解释程序:接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
源程序:被翻译的程序。
目标程序:翻译后的程序。
遍:对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
编译前端:主要指与源语言有关,与目标语言无关的部分,通常包括词法分析、语法分析、语义分析和中间代码生成,与机器无关部分的代码优化编译后端:指与目标机器有关的部分。
如与机器有关的优化、目标代码生成2.高级语言程序有哪两种执行方式?其特点是什么?阐述其主要异同点。
答:高级语言程序有编译程序和解释程序两种执行方式;编译程序(Compiler)——将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。
解释程序(Interpreter)——将高级程序设计语言写的源程序作为输入,边解释边执行源程序本身,而不产生目标程序的翻译程序。
3.编译过程可分为哪些阶段?各个阶段的主要任务是什么?答:编译过程逻辑上可分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成。
第一阶段:词法分析任务: 从左到右扫描源程序,识别出每个单词第二阶段:语法分析任务: 在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:程序、语句、表达式)。
第三阶段:语义分析和中间代码生成任务:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码)。
第四阶段:代码优化任务:对已产生的中间代码进行加工变换,使生成的目标代码更为高效(时间和空间)。
第五阶段:目标代码的生成任务:把中间代码(或经优化的中间代码)变换成特定机器上的低级语言代码。
4. 编译程序有哪些主要构成成分?各自的主要功能是什么?答:(1) 记号(token)当扫描程序将字符收集到一个记号中时,它通常是以符号表示这个记号;这也就是说,作为一个枚举数据类型的值来表示源程序的记号集。
编译原理教程课后习题答案——第一章

第一章绪论1.1 完成下列选择题:(1) 构造编译程序应掌握。
a. 源程序b. 目标语言c. 编译方法d. 以上三项都是(2) 编译程序绝大多数时间花在上。
a. 出错处理b. 词法分析c. 目标代码生成d. 表格管理(3) 编译程序是对。
a. 汇编程序的翻译b. 高级语言程序的解释执行c. 机器语言的执行d. 高级语言的翻译【解答】(1) d (2) d (3) d1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。
在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。
这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。
在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。
因此,编译对源程序的处理是先翻译,后执行。
从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。
这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。
1.3 请画出编译程序的总框图。
如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题?【解答】编译程序总框图如图1-1所示。
作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(,),i}(xy ) 3 xy=abcb |xy|=4 xyz=abcbaab|xyz|=7333(xy) =(abcb) =abcbabcbabcb | (xy) |=122.3设有文法G[S] : S :: =SS*|SS+|a ,写出符号串aa+a*规范推导,并构造语法树。
S => SS* => Sa* => SS+a* => Sa+a* => aa+a*2.4已知文法 G[Z] : Z : =U0l V1、 U : : =Z1 I 1、V : : =Z0 I 0 ,请写出全部由此文法描述的只含有四个符号的句子。
Z=>U0=>Z10=>U010=>1010 Z=>U0=>Z10=>V110=>0110 Z=>V1=>Z0 仁〉U00 仁>1001 Z=>V1=>Z01=>V101=>01012.5已知文法 G[S] : S :: =AB A :: =aA |e B :: =bBc I bc ,写出该文法描述的语言。
A : : =aA |e 描述的语言:{a n |n>=0}B : : =bBc I bc 描述的语言:{bn c n|n>=1} L(G[S])={a n bZ m n>=0,m>=1}2.6已知文法 E : =T I E+T I E-T 、T : : =F I T*F I T/F 、F : : =(E) I i ,写出该文法的开始符号、终结符号集合 V T 、非终结符号集合 V N 。
开始符号:E V t ={+, - , * , / ,x °=(aaa) 0= e|=0xx=aaaaaa 5 x =aaaaaaaaaaaaaaa A =A 1U A ^U ….U A 0 1 2A* = A U A U A U I x |xx|=65| x|=15U …={a,aa,aaa,aaaa,aaaaa …}••• U A n U …={ 2.2 令刀={a , b , c},又令 x=abc , y=b , e ,a,aa,aaa,aaaa,aaaaa …}z=aab ,写出如下符号串及它们的长度:xy ,xyz ,V n={E , F , T}(,),i}句子abba 合法。
短语:T+T*F+iT+T*FiiT T*F简单短语:iT*F T句柄:T2.8 设有文法 G[S] : S : :E +T E + T FT / T \* FS+丿SaS*S根据所给文法推导出句子 a+a*a ,画出了两棵不同的语法树,所以该文法是二义性文法。
2.9写一文法,使其语言是奇正整数集合。
A::=1|3|5|7|9|NA N::=0|1|2|3|4|5|6|7|8|92.10给出语言{a n bmn,m > 1}的文法。
G[S]: S::=AB A::=aA|a B::=bB|b3.1有正则文法 G[Z] : Z::=Ua|Vb , U::=Zb|b , V::=Za|a ,画出该文法的状态图,并检查句子abba 是否合法。
解:该文法的状态图如下:2.7 对2.6题的文法,写出句型 T+T*F+i 的短语、简单短语以及句柄。
该文法是二义性文法吗?图3-35状态图解:左线性文法G[Z]:Z::=Ab|b A::=Aa|aV={Z,A,a,b} %={ Z,A} V={a,b}3.3 构造下列正则表达式相应的 右线性文法G' [S]:S::=aA|b A::=aA|bV={S,A,a,b} U={S,A} V={a,b}NFA1(1|0)*|01(1010*11(010)*1)*0 解:正则表达式:1(1|0)*|0 1、3.2状态图如图3.35所示,S 为开始状态,Z 为终止状态。
写出相应的正则文法以及 V , V和V 。
2、解:q仁{0,1} {0,1} {1}q2={1} {0} ①DFA:aa图3.37 DFA状态图3.5 将图3.37的DFA化简。
bbbb解:划分 a b{0,1} {1} r{2,4}{234,5} {1,0, 3,5} {3,5,2,4}划分 a b{0,1} {1} :{2,4}{2,4} {0,1} {3,5}{3,5} {3,5} 「{2,4}q0={0,1} q仁{2,4}化简后的DFAqoq14.1对下面文法,设计递归下降分析程序。
S T aAS|(A) , A 宀Ab|c解:首先将左递归去掉,将规则A T Ab|c改成A T c{b}非终结符号S的分析程序如下:4.2设有文法G[Z]:Z・• =(A) , A - - =a|Bb , B - - =Aab若采用递归下降分析方法,对此文法来说,在分析过程中,能否避免回溯?为什么?解:若采用递归下降分析方法,对此文法来说,在分析过程中不能避免回朔。
因为规则A ::=a|Bb和规则B:: =Aab构成了间接左递归,不满足实现没有回溯的递归下降分析方法的条件(1)(书P67),且规则A: := a|Bb , FIRST(a)={a} , FIRST(Bb)={a},即此规则候选式的首符号集有相交,不满足实现没有回溯的递归下降分析方法的条件( 2)(书P67),在分析过程中,将造成回溯。
改写文法可避免回溯:将规则B:=Aab代入规则A:=a|Bb得:A:=a|Aabb ,再转换成:A:=a{abb},可避免回溯。
4.3 若有文法如下,设计递归下降分析程序。
<语句>7 <语句><赋值语句>| £<赋值语句>7 ID=<表达式><表达式>7 <项>|<表达式>+ <项>|<表达式>—<项><项>7 <因子>|<项>*<因子>|<项>/<因子><因子>7 ID|NUM|(<表达式>)解:首先,去掉左递归<语句>7 <语句><赋值语句>| £改为:<语句>7 {<赋值语句>}<表达式>7 <项> | <表达式> + <项> | <表达式> - <项>改为:<表达式>7 <项>{ ( + | -) <项>}<项>7 <因子> | <项> * <因子> | <项> / <因子>改为:<项>7 <因子>{ ( * | / ) <因子>}则文法变为:<语句>T {<赋值语句>}<赋值语句>T|D=<表达式><表达式>7 <项>{ (+ | -) <项>} <项>7 <因子>{ (* | / ) <因子>} <因子>7 ID|NUM|(<表达式>)非终结符号<赋值语句>的分析程序如下:非终结符号<表达式>的分析程序如下:<赋值语句>7 |D=<表达式><表达式>7 <项>{ ( + | -) <项>}非终结符号<项>的分析程序如<项>T<因子>{ (* | /) <因子>}下:非终结符号<因子〉的分析程序如下: <因子ID|NUM|(<表达式>)复值语句的分析程序4.4 有文法G[A] : A::=aABe| £, B::=Bb|b(1)求每个非终结符号的FOLLOW集。
(2)该文法是LL(1)文法吗?(3)构造LL(1)分析表。
解:(1)FOLLOW(A)=First(B) U {#}={b,#}FOLLOW(B)={e,b}(2)该文法中的规则B::=Bb|b为左递归,因此该文法不是LL(1)文法(3)先消除文法的左递归(转成右递归),文法变为:A::=aABe| £, B::=bB ',4.5若有文法2 (A)A| &(1)为非终结符A构造FIRST集合和FOLLOWI合。
(2)说明该文法是LL(1)的文法。
解:(1)FIRST(A) ={(,门FOLLOW(A) ={ ) , #}(2)该文法不含左递归;FIRST ((A)A ) ={(} , FIRST (£) ={ £}, FIRST ((A)A)n FIRST (£)=①, 且FOLLOW(A)= {) , #}, FIRST ((A)A )n FOLLOW(A)=①,因此,该文法满足LL(1)文法的条件,是LL(1)文法。
4.6利用分析表4-1,识别以下算术表达式,请写出分析过程。
(1)i+i*i+i(2)i*(i+i+i)解:复值语句的分析程序4.7考虑下面简化了的C声明文法:<声明语句<类型><变量表>;<类型int|float|char<变量表ID,<变量表>|ID(1)在该文法中提取左因子。
(2)为所得的文法的非终结符构造FIRST集合和FOLLOW合。
(3)说明所得的文法是LL(1)文法。
(4)为所得的文法构造LL(1)分析表。
(5)假设有输入串为"char x ,y,z;”,写出相对应的LL(1)分析过程。
解:(1)规则<变量表ID,<变量表>|ID提取公因子如下:<变量表ID (,<变量表>| £)增加新的非终结符<变量表1>,规则变为:<变量表ID<变量表1><变量表1>T,<变量表>| £C声明文法改变为:<声明语句<类型><变量表>;<类型int|float|char<变量表ID<变量表1><变量表1>T,<变量表>| £(2)FIRST(<声明语句>)=FIRST(<类型>)={i nt , float , char} FIRST(<变量表>)={ ID}FIRST(<变量表1>)={,,£}FOLLOW(声明语句>)={ #} FOLLOW(类型>)=FIRST(<变量表>)={ ID }FOLLOW(变量表>)=FOLLOW(变量表1>)={; }(3)所得文法无左递归,且FIRST (int )n FIRST (float )n FIRST (char )=0 FIRST (, <变量表>)n FIRST (£)=①FIRST (, <变量表>)n FOLLOW(变量表1>)= 0因此,所得文法为LL(1)文法。
5.1考虑以下的文法: S T S;T|TT Ta(1)为这个文法构造LR(0)的项目集规范族。
(2)这个文法是不是LR(0)文法?如果是,则构造LR(0)分析表。
(3)对输入串“ a;a ”进行分析。
解:(1 )拓广文法G[S']:0: S'T S1: S T S;T2: S T T3: T Ta(2)该文法不存在“归约—归约”和“归约—移进”冲突,因此是LR(0)文法。
LR(0)分析表如下:5.2证明下面文法是SLR(1)文法,但不是LR(O)文法。
SFL Ab|bBaB T aAc|a|aAb解:文法G[S]:0: S T A1: A T Ab2:A T bBa3: B T aAc4: B Ta5: B T aAb,因此该文法不是LR(0) 文法。