编译原理作业集-第五章-修订(精选.)
- 格式:doc
- 大小:439.50 KB
- 文档页数:22
《编译原理》课后习题答案第5章《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf第5章自顶向下语法分析方法第1题对文法G[S] S→a|∧|(T) T→T,S|S(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
答案:(1) 对(a,(a,a)的最左推导为:S(T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a))对(((a,a),∧,(a)),a) 的最左推导为:S(T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),∧,S),S) (((a,a),∧,(T)),S)(((a,a),∧,(S)),S)《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf(((a,a),∧,(a)),S) (((a,a),∧,(a)),a)(2) 改写文法为:0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε非终结符FIRST集FOLLOW集S {a,∧,(} {#,,,)} T {a,∧,(} {)} N {,,ε} {)}对左部为N的产生式可知:FIRST (→, S N)={,} FIRST (→ε)={ε} FOLLOW (N)={)}由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。
第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。
S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。
5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。
5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。
5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。
第五章代码优化5.1 完成以下选择题:(1) 优化可生成的目标代码。
a. 运行时间较短b. 占用存储空间较小c. 运行时间短但占用内存空间大d. 运行时间短且占用存储空间小(2) 下列优化方法不是针对循环优化进行的。
a. 强度削弱b. 删除归纳变量c. 删除多余运算d. 代码外提(3) 基本块内的优化为。
a. 代码外提,删除归纳变量b. 删除多余运算,删除无用赋值c. 强度削弱,代码外提d. 循环展开,循环合并(4) 在程序流图中,我们称具有下述性质的结点序列为一个循环。
a. 它们是非连通的且只有一个入口结点b. 它们是强连通的但有多个入口结点c. 它们是非连通的但有多个入口结点d. 它们是强连通的且只有一个入口结点(5) 关于必经结点的二元关系,下列叙述中不正确的是。
a. 满足自反性b. 满足传递性c. 满足反对称性d. 满足对称性【解答】(1) d (2) c (3) b (4) d (5) d5.2 何谓局部优化、循环优化和全局优化?优化工作在编译的哪个阶段进行?【解答】优化根据涉及的程序范围可分为三种。
(1) 局部优化是指局限于基本块范围内的一种优化。
一个基本块是指程序中一组顺序执行的语句序列(或四元式序列),其中只有一个入口(第一个语句)和一个出口(最后一个语句)。
对于一个给定的程序,我们可以把它划分为一系列的基本块,然后在各个基本块范围内分别进行优化。
通常应用DAG方法进行局部优化。
(2) 循环优化是指对循环中的代码进行优化。
例如,如果在循环语句中某些运算结果不随循环的重复执行而改变,那么该运算可以提到循环外,其运算结果仍保持不变,但程序运行的效率却提高了。
循环优化包括代码外提、强度削弱、删除归纳变量、循环合并和循环展开。
5.3 将下面程序划分为基本块并作出其程序流图。
read(A,B)F=1C=A*AD=B*Bif C<D goto L1E=A*AF=F+1E=E+Fwrite(E)haltL1: E=B*BF=F+2E=E+Fwrite(E)if E >100 goto L2haltL2: F=F-1goto L1【解答】先求出四元式程序中各基本块的入口语句,即程序的第一个语句,或者能由条件语句或无条件转移语句转移到的语句,或者条件转移语句的后继语句。
《编译原理》习题参考答案(六)第五章5.4 为下列类型写类型表达式:(a) 指向实数的指针数组,数组的下标从1到100。
(b) 两位数组(即数组的数组),他的行下标从1到10,列下标从1到20。
(c) 函数,他的定义域是从整数到整数的指针的函数,它的值域是从一个整数和一个字符组成的纪录。
Solution:(a) array ( 1 . . 100 , pointer ( real ) )(b) array ( 1 . . 10 , array ( 1 . . 20 , type ) )(c) ( integer →pointer(integer) )→record((i : integer) * ( c : char )) 假定作为值域的记录类型的两个域分别叫i和c。
5.6 下列文法定以字面常量表的表。
符号的解释和图5.2文法的那些相同,增加了类型list,它表示类型T的元素表。
→ D ; EP→ D ; D | id : TD→ list of T | char | integerTE→ ( L ) | literal | num | id→ E , L | EL写一个类似5.3节中的翻译方案,以确定表达式( E )和表( L )的类型。
P→ D ; ED→ D ; DD→ id : T { addtype ( id.entry , T.type ) }T→ char { T.type := char }T→ integer { T.type := integer }T→ list of T1 { T.type := list ( T1.type ) }E→ literal { E.type := char }E→ num { E.type := integer }E→ id { E.type := lookup ( id.entry ) }E→ ( L ) { E.type := list ( L.type ) }L→E{L.type:=E.type}L→ E , L1 { L.type := if L1.type = E.type then E.typeelse type_error }5.16 对下面的每对表达式,找出最一般的合一代换:(a) α1 → ( α2 →α1 )(b) array ( β1 ) → ( pointer( β1 ) →β2 )(c) γ1 →γ2(d) δ1 →(δ1 →δ2 )Solution:S(α1) = array ( β1 ) S(α2) = pointer ( β1 ) S(β2) = array ( β1 ) (a)(c):S(γ1) = α1 S(γ2) = α2 → α1 (a)(d):S(α1) = S(α2) = S(δ1) = S(δ2) = α (b)(c):S(γ1) = array ( β1 ) S(γ2) = pointer ( β1 ) → β2 (b)(d): 无 (c)(d):S(γ1) = δ1 S(γ2) = δ1 → δ25.17 仿效例5.5,推到下面map 的多态类型: map: ∀ α . ∀ β . ( ( α → β ) * list ( α ) ) → list ( β ) map 的ML 定义是 fun map ( f , l ) = if null ( l ) then nilelse cons ( f ( hd ( l ) ) , map ( f , tl ( l ) ) );在这个函数体中,内部定义的标识符的类型是: null : ∀α . list (α ) → boolean ; nil : ∀α . list (α ) ;cons : ∀α . ( α * list (α ) ) → list (α ) ;hd:∀α . list (α ) →α;∀α . list (α ) → list (α ) ;tl:Solution:行定型断言代换规则(1) f : α( Exp Id )(2) l : β( Exp Id )(3) map : γ( Exp Id )(4) map ( f , l ) : δγ = ( α * β ) →δ(Exp Funcall)(5) null : list (α0) → boolean ( Exp Id ) 和( Type Fresh )(6) null ( l ) : boolean β = list (α0) (Exp Funcall)(7) nil : list (α1) ( Exp Id ) 和( Type Fresh )(8) l : list (α0) 由(2)可得(9) hd : list (α2) →α2( Exp Id ) 和( Type Fresh )(10) hd ( l ) : α0α2 = α0(Exp Funcall)(11) f ( hd ( l ) ) : α3α = α0→α3( Exp Id )(12) f : α0→α3由(1)可得(13) tl : list (α4)→ list (α4) ( Exp Id ) 和( Type Fresh )(14) tl ( l ) : list (α0) α4 = α0(Exp Funcall)(15) map : ((α0→α3)*list(α0))→δ由(3)可得(16) map ( f , tl ( l ) ) : δ(Exp Funcall)(17) cons : α5 * list(α5) → list(α5) ( Exp Id ) 和( Type Fresh ) (18) cons (…) : list (α3) α5 = α3 , δ=list(α3) (Exp Funcall)(19) if : boolean *α6 * α6→α6( Exp Id ) 和( Type Fresh )(20) if (…) : list (α1) α6 = α1 , α3 = α1(Exp Funcall)(21) match : α7 *α7 →α7( Exp Id ) 和( Type Fresh ) (22) match (…) : list (α1) α7 = list (α1) (Exp Funcall)至此有map : ( (α0→α1)*list(α0) )→list(α1)所以map : ∀α . ∀β . ( ( α→β ) * list ( α ) ) → list ( β )5.18 假定类型名link和cell如5.5节那样定义,下面的表达式中,那些结构等价?那些名字等价?(a) link(b) pointer ( cell )(c) pointer ( link )(d) pointer ( record ( ( info : integer ) * ( next : pointer ( cell ) ) ) ) Solution:(a)、(b)、(d)结构等价,无名字等价。
练习5.1解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2解答: (1)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树(2)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树练习5.3解答:设置下面的函数和属性:expr1||expr2:把表达式expr2拼写在表达式expr1后面。
deletep(expr):去掉表达式expr左端的‘(’和右端的‘)’。
E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。
E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。
E.pmark,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。
语法制导定义如下:产生式语义规则E -> E1 +T if(T.pmark==true)THEN E.expr=E1.expr||'+'||deletep(T.expr) ELSE E.expr:=E1.expr||'+'||T.expr;E.add:=true;E.pmark:=false;E -> T if(T.pmark==true)THEN E.expr:=deletep(T.expr)ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T -> T1*F T.expr:=T1.expr||'*'||F.expr; T.add:=false;T.pmark:=false;T -> F T.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark;F -> (E) if(E.add==false)THEN BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('||E.expr||')';F.add:=true;F.pmark:=true;END;F -> id F.expr:=id.lexval;F.add:=false;F.pmark:=false;练习5.4解答: (1)语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int) THEN E.type:=intELSE E.type:=real;E -> T E.type:=T.type;T -> num T.type:=int;T -> num.num T.type:=real;(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int)THEN E.type:=intELSE BEGINE.type:=real;if(E1.type==int) AND (T.type==real)THEN E1.pf:='inttoreal'||E1.pfELSE if(E1.type==real)AND(T.type==int)THEN T.pf:='inttoreal'||T.pfEND;E.pf:='+'||E1.pf||T.pf;E -> T E.type:=T.type; E.pf:=T.pf;T -> num T.type:=int; T.pf:=int.lexval;T ->num.numT.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定s.val的语法制导定义:产生式语义规则S -> L S.val:=L.val;S ->L1.L2S.val:=L1.val+L2.val*L2.p;L -> B L.val:=B.val; L.p:=2-1;L -> L1B L.val:=L1.val*2+B.val; L.p:=L.p*2-1;B -> 0 B.val:=0;B -> 1 B.val:=1;注:L.p表示恢复L.val的因子。
第五章P138.1.解:由中缀表达式翻译成波兰前缀表达式的符号串翻译文法如下:①E→@+E+T ②E→T ③T→@*T*F④T→F ⑤F→(E) ⑥F→a@a⑦F→b@b ⑧F→c@c2.解:a)输入符号串的倒置:①S→@0S0 ②S→@1S1 ③S→1@1④S→0@0c)输入符号串本身:①S→S0@0 ②S→S1@1 ③S→1@1④S→0@03.解:该符号串翻译文法能将输入的符号序列“ENGLISH”翻译成动作序列“@C@HI@N@E@SE”,并执行该动作序列得到输出序列“CHINESE”。
4.解:根据活动序列将动作符号放到文法中适当位置得到该翻译文法为:①<s>→@q a<s>@x <s>@y ②<s>→@x @y b@z5.解:由该符号串翻译文法得到其输入文法为:①<s>→<A>c<B> ②<s>→dcb③<A>→<B>a ④<A>→d ⑤<B>→b由推导:s=><A>c<B>=><A>cb=>dcb 可得到对偶<dcb,xxy>由推导:s=>dcb 可得到对偶<dcb,yxz>由推导:s=><A>c<B>=><A>cb=><B>acb=>bacb可得到对偶<dcb,xyxxy>第六章符号表管理技术P185.4、下面是一个非分程序结构语言的程序段。
画出编译该程序段时将生成的有序符号表。
BLOCKREAL X,Y,Z1,Z2,Z3;INTEGER I,J,K,LASTI;STRING LIST-OF-NAMES;LOGICAL ENTRY-ON,EXIT-OFF;ARRAY REAL VAL(20);ARRAY INTEGER MIN-VAL-IND(20);...END OF BLOCK解:变量名类型维数ENTRY-ON LOGICAL 0EXIT-OFF LOGICAL 0I INTEGER 0J INTEGER 0K INTEGER 0LASTI INTEGER 0LIST-OF-NAMES STRING 0MIN-VAL-IND INTEGER 1VAL REAL 1X REAL 0Y REAL 0Z1 REAL 0Z2 REAL 0Z3 REAL 06、下面是一分程序结构的程序段。
第五章自顶向下语法分析方法1.对文法G[S]S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
解:(1) (a,(a,a))的最左推导为S→(T)→(T,S)→(S,S)→(a,(T))→(a,(T,S))→(a,(S,a))→(a,(a,a))(((a,a),∧,(a)),a)的最左推导为S→(T)→(T,S)→(S,a)→((T),a)→((T,S),a)→((T,S,S),a)→((S,∧,(T)),a)→(((T),∧,(S)),a) →(((T,S),∧,(a)),a)→(((S,a),∧,(a)),a)→(((a,a),∧,(a)),a)(2)由于有T→T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/[S]:S→a|∧|(T)T→SUU→,SU|ε分析子程序的构造方法对满足条件的文法按如下方法构造相应的语法分析子程序。
(1) 对于每个非终结号U,编写一个相应的子程序P(U);(2) 对于规则U::=x1|x2|..|xn,有一个关于U的子程序P(U),P(U)按如下方法构造:IF CH IN FIRST(x1) THEN P(x1)ELSE IF CH IN FIRST(x2) THEN P(x2)ELSE ......IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序;P(xj)为相应的子程序。
(3) 对于符号串x=y1y2...yn;p(x)的含义为:BEGINP(y1);P(y2);...P(yn);END如果yi是非终结符,则P(yi)代表调用处理yi的子程序;如果yi是终结符,则P(yi)为形如下述语句的一段子程序IF CH=yi THEN READ(CH) ELSE ERROR即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,否则表明出错。
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。
所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。
讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。
即从树结尾开始,构造语法树。
所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。
自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。
即,识别可归约串的问题。
归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。
实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。
重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。
现举例说明。
例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。
步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法8. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自顶向下分析试图为输入符号串构造一个;a. 语法树b. 有向无环图c. 最左推导d. 最右推导9. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自底向上分析试图为输入符号串构造一个。
a. 语法树b. 有向无环图c. 最左推导d. 最右推导10. 采用自顶向下分析方法时,要求文法中不含有。
a. 右递归b. 左递归c. 直接右递归d. 直接左递归11. LR分析是寻找右句型的;而算符优先分析是寻找右句型的。
a. 短语;b. 素短语;c. 最左素短语;d. 句柄12. LR分析法中分析能力最强的是;分析能力最弱的是。
a. SLR(1);b. LR(0);c. LR(1);d. LALR(1)13. 设有文法G:T->T*F | FF->F↑P | PP->(T) | a该文法句型T*P↑(T*F)的最左直接短语是下列符号串________。
a. (T*F),b. T*F,c. P,d. P↑(T*F)14. 在通常的语法分析方法中,()特别适用于表达式的分析。
a.算符优先分析法b.LR分析法c.递归下降分析法d.LL(1)分析法15. .运算符的优先数之间有几种关系。
a.3种b. 2种c. 4种d. 1种16. 算符优先法属于()a.自上而下分析法b.LR分析法c.SLR分析法d.自下而上分析法17. 在LR分析法中,分析栈中存放的状态是识别规范句型的DFA状态。
a.句柄b. 前缀c. 活前缀d. LR(0)项目一.答案:1. b;2. b;3. b;4. d;5. d;6. a;7. c;8. c;9. d;10. b;11. d,c;12. c,b;13. a;14. a 15. a;16. d;17. c;二、填空题:1. 规范归约的关键问题是________ 。
2. LR(k)分析法中,L 的含义是____________________,R 的含义是_______________________,k 的含义是 。
3. 移进一归约分析对符号串的使用有四类操作:移进、__________、_________和出错处理。
4. 设文法G (E 为其开始符号)产生式如下:E→E+T|T T→T*F|F F→(E )|i则句型E+T*F+i 的句柄是_________________。
5. 自下而上分析方法的基本思想是:从输入符号串开始,利用文法规则逐步进行归约,直至归约到文法的 。
6. 在算符优先分析中,用 来刻画“可归约串”;在规范归约分析中,用 来刻画“可归约串”。
7. 在LR(0)分析中,相容的项目集,必须满足的条件是_______,_______。
8. LR 语法分析栈中存放的状态是识别_______的DFA 状态。
9. 在LR 分析过程中的任何时候,栈里的文法符号从下往上应该构成 ,把输入串的剩余部分配上之后应成为 。
10. 对于LR(0)分析法来说,项目A→β1⋅β2对活前缀αβ1是有效的,其条件是存在规范推导 。
11. 形式上我们说一个LR(1)项目[A→α⋅β,a]对于活前缀γ是有效的,如果存在规范推导 。
12. LR(k)分析方法中项目类型可分为四类 、 、 和 。
13. 所谓算符优先分析法就是仿照算术四则运算的运算过程设计的一种语法分析方法。
它首先要规定 ,然后利用这种关系确定 ,并进行 。
14. 如图所示的语法树中,a ,b 不在同一句柄中, 先归约,所以 的优先级高于 。
PbR……a…Q15. 对于句型η的语法树,若它的一棵子树的根标记为A ,且将此子树的末端结点标记从左至右排列起来所形成的符号串为β,则β是 ;此时文法中必有推导 。
16. LR(0)每个项目中圆点的左部表示在分析过程中,要用该产生式归约时, ,右部表示 。
17. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别 的NFA 的一个状态。
二.答案:1. 寻找或确定一个句型的句柄;2. 从左到右扫描输入串,构造一个最右推导的逆过程;3. 归约,接受;4. T*F ;5. 开始符号;6. 最左素短语,句柄;7. 移进项目和归约项目并存,多个归约项目并存;8. 文法活前缀和可归前缀;9. 活前缀,规范句型;10.ωβαβωα21*'RRA S ⇒⇒;11. δαβωωδRRA S ⇒⇒*',其中γ=δα,a 是ω的第一个符号,或者a是#而ω为ε。
12. 归约项目,接受项目,移进项目,待约项目;13. 运算符之间的优先关系;句型的“句柄”, 归约;14. a ,a ,b ;15. 句型η相对于A 的一个短语;A==>+ β;16. 句柄已识别的部分(进入符号栈),等待识别的部分;17. 活前缀三、判断题1. 一个二义性文法可以是SLR 文法或LALR 文法。
( )2. LL(1)文法不能用LR (1)分析器来分析。
( )3. LR 分析器在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。
( )4. 在归约过程的任一时刻,一个上下文无关文法的任何句型的直接短语一般都不是唯一的。
( )5. 算符优先分析法不是一种规范规约法。
( )6. 存在有左递归规则的文法是LL(1)的。
( )7. 任何算符优先文法的句型中不会有两个相邻的非终结符号。
( )8. 算符优先文法中任何两个相邻的终结符号之间至少满足三种关系(<·,·>,=·)之一。
( ) 9. 任何LL(1)文法都是无二义性的。
( )10. 每一个SLR(1)文法也都是LR(1)文法。
( )11. 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。
( ) 12. 任何一个LL(1)文法都是一个LR(1)文法,反之亦然。
( )13. LR(1)分析中括号中的1是指,在选用产生式A→α进行分析,看当前读入符号是否在FIRST(α)中。
( )14. 若某一个句型中出现了某一产生式的右部,则此右部不一定是该句型的句柄。
( ) 15. 算符优先关系表不一定存在对应的优先函数。
( ) 16. 简单优先文法允许任意两个产生式具有相同右部。
( ) 17. 一个句型的句柄一定是文法某产生式的右部。
( ) 18. 若一个句型中出现了某产生式的右部,则此右部一定是该句型的句柄。
( ) 19. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别活前缀的DFA 的一个状态。
( ) 四.答案:1. ×;2. ×;3. √;4. √;5. √;6. ×;7. √;8. ×;9. √;10. √;11. √;12. ×;13. √;14. ×;15. √;16. ×;17. √;⒙ ×;19. ×;五、名词解释:1. 短语,直接短语,句柄;2. 规范归约,规范推导;3. 算符文法,算符优先文法;4. 素短语,最左素短语;5. 前缀,活前缀;6. LR(0)项目,LR(0)项目集规范族;五. 答案:1. 设G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有:S=>*αAδ且A=>*β,则称β是句型αβδ相对于非终结符A的短语。
特别地,如果A=>β,则称β是句型αβδ相对于规则A->β的直接短语。
一个句型的最左直接短语称为该句型的句柄。
2. 在形式语言中,最右推导常称规范推导。
规范归约是最右推导的逆过程,也称最左归约。
3. 一个文法,如果它的任何一个产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:……QR……,则我们称该文法为算符文法。
在一个算符文法中的任何终结符对(a,b),至多只满足下述三个关系之一:a⋅=b,a<⋅b,a⋅>b,则称G是一个算符优先文法。
4. 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除自身之外不再含任何更小的素短语。
所谓最左素短语是指处于句型最左边的哪个素短语。
5. 一个字的前缀是指该字的任意首部。
活前缀是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。
6. 文法G的每一个产生式的右部添加一个小圆点,称为G的一个LR(0)项目。
构成识别一个文法活前缀的DFA的项目集(状态)的全体,称为该文法的项目集规范族。
六、简答题:1. 说明任何SLR(1)文法都是LR(1)文法。
2. 为什么移进-归约法不是一种语法分析方法?3. LR(k)分析法是如何做到严格地自左向右进行分析的?4. 使用状态有限的识别可归前缀的有穷自动机,为什么可以识别语言的无穷多个句子?5. LR项目的含义是什么?六.答案:1. 假设有一个SLR(1)文法G不是LR(1)文法,那么在G的LR(1)项目集规范族中,或有下面的(i),或有下面的(ii),或两种情形都有与之对应,G的LR(0)项目集规范族或有下面的(i),或有下面的(ii),或两者皆有:因为G是SLR(1)文法,因此有:a不属于FOLLOW(A),FOLLOW(A)∩FOLLOW(B)=Φ根据G的LR(1)项目集,有a∈FOLLOW(A),FOLLOW(A)∩FOLLOW(B)≠Φ这和假设矛盾。