1、编译原理龙书答案编译原理龙书答案 作者: 日期: 第四章部分习题解答Aho:编译原理技术与工具书中习题(Aho)4.1 考虑文法 S ( L ) | a L L, S | Sa) 列出终结符、非终结符和开始符号解:终结符:(、)、a、,非终结符:S、L开始符号:Sb) 给出下列句子的语法树i) (a, a)ii) (a, (a, a)iii) (a, (a, a), (a, a) c) 构造b)中句子的最左推导i) S(L)(L, S) (S, S) (a, S) (a, a)ii) S(L)(L, S) (S, S) (a, S) (a, (L) (a, (L, S) (a, (S, S)
2、(a, (a, S) (a, (a, a)iii) 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)d) 构造b)中句子的最右推导i) S(L)(L, S) (L, a) (S, a) (a, a)ii) S(L
3、)(L, S) (L, (L) (L, (L, S) (L, (L, a) (L, (S, a) (L, (a, a) (S, (a, a) (a, (a, a)iii) 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), (S, S) (S, (
4、a, a), (a, a) (a, (a, a), (a, a)e) 该文法产生的语言是什么解:设该文法产生语言(符号串集合)L,则 L = (A1, A2, , An) | n是任意正整数,Ai=a,或AiL,i是1n之间的整数(Aho)4.2考虑文法SaSbS | bSaS | a) 为句子构造两个不同的最左推导,以证明它是二义性的SaSbSabSabaSbSababSababSaSbSabSaSbSabaSbSababSababb) 构造abab对应的最右推导SaSbSaSbaSbSaSbaSbaSbabababSaSbSaSbabSaSbabSabababc) 构造abab对应语法树d
5、) 该文法产生什么样的语言?解:生成的语言:a、b个数相等的a、b串的集合(Aho)4.3 考虑文法bexpr bexpr or bterm | btermbterm bterm and bfactor | bfactorbfactor not bfactor | ( bexpr ) | true | falsea) 试为句子not ( true or false) 构造分析树解:b) 试证明该文法产生所有布尔表达式证明:一、首先证明文法产生的所有符号串都是布尔表达式变换命题形式以bexpr、bterm、bfactor开始的推导得到的所有符号串都是布尔表达式最短的推导过程得到true、fals
6、e,显然成立假定对步数小于n的推导命题都成立考虑步数等于n 的推导,其开始推导步骤必为以下情况之一bexpr bexpr or btermbexpr btermbterm bterm and bfactorbexpr bfactorbfactor not bfactorbfactor ( bexpr )而后继推导的步数显然n,因此由归纳假设,第二步句型中的NT推导出的串均为布尔表达式,这些布尔表达式经过or、and、not运算或加括号,得到的仍是布尔表达式因此命题一得证。二、证明所有布尔表达式均可由文法生成变换命题所有析取式均可由bexpr推导出来,所有合取式均可由bterm(bexpr)推导
7、出来,所有对子布尔表达式施加not运算或加括号或简单true、false都可由bfactor(bexpr、bterm)推导出来最简单的布尔表达式true和false显然成立假定对长度小于n的布尔表达式,均可由文法推导出来考虑长度等于n的布尔表达式B,显然,B只能是以下形式之一B = B1 or B2B = B1 and B2B = not B1B = ( B1 )以上几种情况,B1、B2的长度均小于n对于情况1:B为析取式,B1可为析取式也可为合取式,B2为合取式,根据假设可由bexpr合bterm推导出来,显然可构造推导过程,由bexpr推导出B其他情况类似,命题二得证综合一、二,可知文法产
8、生的语言就是布尔表达式c) (Aho)4.4考虑文法RR | R | RR | R* | (R) | a | bc) 构造等价的非二义性文法RR | A | AAA B | BBB* | CC( R ) | a | b(Aho)4.5下面if-then-else文法试图消除空悬else的二义性,证明它仍是二义性的stmtif expr then stmt | matched_stmtmatched_stmtif expr then matched_stmt else stmt | other解:用S、M、E表示stmt、matched_stmt和expr,用i、t、e、o表示if、then、e
9、lse和other则句子i E t i E t o e i E t o e o对应两个最左推导:Si E t Si E t Mi E t i E t M e Si E t i E t o e Si E t i E t o e Mi E t i E t o e i E t M e Si E t i E t o e i E t o e S i E t i E t o e i E t o e Mi E t i E t o e i E t o e oSMi E t M e Si E t i E t M e S e S i E t i E t o e S e S i E t i E t o e i E
10、t S e S i E t i E t o e i E t M e S i E t i E t o e i E t o e S i E t i E t o e i E t o e M i E t i E t o e i E t o e o因此文法是二义性文法直接构造比较困难,可从SLR分析表的构造角度考虑,LR(0)项目集规范族中,项目I8=Mi E t M e S, SM,有移进/归约冲突,这就是是二义性所在。显然,存在句型.i E t M e S.和.i E t S e S.,当M位于栈顶时,产生移进/归约冲突。按此思路,构造形如. i E t S e S.的句型即可(Aho)4.6 为下
11、列语言设计上下文无关文法。哪些语言是正规式?a) 满足这样条件的二进制串:每个0之后都紧跟着至少一个1S0 A | 1 S | A1 S正规式:(1 | 01)*b) 0和1个数相等的二进制串S0 S 1 S | 1 S 0 S | d) 不含011子串的二进制串S0 A | 1 S | A0 A | 1 B | B0 A | 正规式:1*(0 | 01)*e) 具有形式xy的二进制串,xyS A | B | A B | B AA D A D | 0B D B D | 1D 0 | 1A、B分别表示中心符号为0、1的长度为奇数的二进制串将AB串接,长度为偶数,将它从中间分为长度相等的两部分,x
12、、y虽然A、B长度可能不一样,但容易得到,A的中心0在x中的位置,与B的中心1在y中的位置是相同的,因此xyBA的情况类似f) 形如xx的0、1串解:此语言无法用上下文无关文法描述(Aho)4.11 对习题4.1中文法a) 消除左递归S( L ) | aLS LL, S L | b) 构造预测分析表,对4.1(b)中句子,给出预测分析器的运行过程FIRST(S) = (, a )FIRST(L) = (, a FIRST(L) = , FOLLOW(S) = , ), $FOLLOW(L) = ) FOLLOW(L) = ) 预测分析表:a(),$SSaS( L )LLS LLS LLLL,
13、S L(a, a)的分析过程栈输入输出$S(a, a)$) L (a, a)$S( L )$) La, a)$LS L$) L Sa, a)$Sa$) L aa, a)$) L, a)$L, S L$) L S , a)$) L Sa)$Sa$) L aa)$) L)$L$)$其他两个句子的分析过程类似(Aho)4.13 下面文法产生除外所有长度为偶数的a的串 S a S a | a aa)试为该文法构造一个带回溯的递归下降语法分析器,对S的两个候选式首先考虑aSa。证明:S所对应的过程可以成功分析2、4、8个a的串,但6个a的串不行。解:aa的分析过程,其中表示匹配成功,表示匹配失败,匹配失
14、败则尝试下个候选式aaaa分析过程:aaaaaa分析过程:aaaaaaaa分析过程:b)此语法分析器能识别什么样的语言?解:由a)的解可以看出,2N个a的串分析过程中,步骤如下1) 产生2N+1个S的语法树,对第2N+1个S进行扩展时输入缓冲已空,失败2) 对第2N个S尝试候选式aa,第二个a匹配失败3) 对第2N-1个S尝试候选式aa,左边N-1个a匹配,右边最后一个a匹配,倒数第二个a失败4) 对第2N-2个S尝试候选式aa,左边N-2个a匹配,右边最后一个a和倒数第二个a匹配,倒数第三个a失败5) 对第2N-4个S尝试候选式aa,左边N-4个a匹配,右边最后一个a倒数第四个a匹配,倒数第
15、五个a失败6) 对第2N-8个S尝试候选式aa,最后正确识别的情况必然是:对第N个S尝试aa,左边N个a和右边N个a恰与输入匹配显然,可以正确识别的符号串的N满足2N 1 1 2 4 - = NN=2i(Aho)4.25 试给出图460中的优先关系表对应的优先级函数解:有向图如下优先级函数为a(),$f20220g33010(Aho)4.26 对习题4.1中文法,利用讲义中给出的算法计算终结符之间的优先关系解: S ( L ) | a L L, S | S由于S ( L ),因此 ( )S ( L ),而LL , S,LS( L ),LSa因此 ( , ,( (,( a;, ),) ),a )
16、由于L L, S,而LL , S,LS( L ),LSa,因此 , ,,) ,,a ,而S( L ),Sa,因此 , ( ,, a非终结符与$优先关系的计算方法:如果存在Sa,或SQa,则$ a,若存在Sa,或SaQ,则a $因此,$ (,$ a,) $,a $算符优先关系表为:a(),$a(),$(Aho)4.27 试给下列文法构造算符优先关系a) 练习4.2中文法解:SaSbS | bSaS | 由SaSbS可得ab由SbSaS可得ba由SaSbS,和SbSaS可得ab、bb、ab,和SaSbS可得aa、ba、bb由SbSaS,和SbSaS可得bb、ab、aa,和SaSbS可得ba、aa、
17、aa文法不是算符优先文法,二义性文法,很自然b) 练习4.3中文法bexpr bexpr or bterm | btermbterm bterm and bfactor | bfactorbfactor not bfactor | ( bexpr ) | true | false解:无论分析语法含义,还是利用4.26算法计算,均可得到truefalsenotandor()$truefalsenotandor()$(Aho)4.30 一个文法称为Greibach范式(GNF)文法,如果它无产生式,且每个产生式(S除外)均形如Aa,其中,a是终结符,是非终结符串,也可能为空。a) 试编写一个算法,
18、将给定文法转换为Greibach范式解:算法步骤如下1 先将文法消除左递归、消除产生式、删除无用符号,然后对每个非终结符A的每个产生式,执行22 若产生式右部以终结符开始,则略过,考虑其他产生式,否则产生式必为AA1的形式,A1为A的NT,a为语法符号串,对它执行以下操作i. 将A1的所有产生式的右部替换A1,产生新的关于A的产生式ii. 对于这些产生式,若右部以T开始,略过,不予处理,考虑那些以NT开始的产生式,反复执行i、iiiii. 由于文法的NT个数是有限的(设为k),且已消除左递归,则最多k个步骤后,处理完毕,此时,A的产生式右部应该均以T开始。否则,若某个产生式右部以NT开始,表明
19、A无论经过怎样的推导过程,均不可能得到一个以终结符开始的串,当然也就不可能得到一个终结符串,这显然是一个错误的文法,矛盾。这样,A的某个产生式处理完毕,其右部均以T开始。转向2,继续考虑其他产生式,所有产生式处理完毕,则转向33 此时,每个产生式均为Aa的形成,a为NT,为语法符号串,若中包含T,则进行如下处理i. 假定中包含k个T,则产生式形为Aa0a11akk,其中ai为T,i为NT串或ii. 引入k个新的NT A1、A2、Ak,和k个新的产生式A1a11A2A2a22A3Ak-1ak-1k-1AkAkakk而将原产生式改为Aa0A14 经过2、3处理,所有产生式必然满足Greibach范
20、式的格式b) 将你的算法应用到表达式文法4-10上解:文法410消除左递归、消除产生式后得到ET E | TE+ T E | + TTF T | FT* F T | * FF( E ) | id将每个产生式转换为以T开始的形式,得到E( E ) T E | id T E | ( E ) E | id E | ( E ) T | id T | ( E ) | idE+ T E | + TT( E ) T | id T | ( E ) | idT* F T | * FF( E ) | id将每个产生式右部转换为T NT*的形式,最后结果为:E( E E| id T E | ( E E | id E
21、 | ( E | id T | ( E E | idE) T EE) EE) TE)E+ T E | + TT( E E | id T | ( E E | idT* F T | * FF( E E | id(Aho)4.33 考虑文法 SAS | b ASA | aa) 构造此文法的LR(0)项目集规范族解:I0 = SS, SAS, Sb, ASA, Aa goto(I0, S) = SS, ASA, ASA, Aa, SAS, Sb = I1goto(I0, A) = SAS, SAS, Sb, ASA, Aa = I2goto(I0, a) = Aa = I3goto(I0, b) =
22、Sb = I4goto(I1, S) = ASA, ASA, Aa, SAS, Sb = I5goto(I1, A) = ASA, SAS, SAS, Sb, ASA, Aa = I6goto(I1, a) = I3, goto(I1, b) = I4goto(I2, S) = SAS, ASA, ASA, Aa, SAS, Sb = I7goto(I2, A) = I2, goto(I2, a) = I3, goto(I2, b) = I4goto(I5, S) = I5, goto(I5, A) = I6, goto(I5, a) = I3, goto(I5, b) = I4goto(I6
23、, S) = I7, goto(I6, A) = I2, goto(I6, a) = I3, goto(I6, b) = I4goto(I7, S) = I5, goto(I7, A) = I6, goto(I7, a) = I3, goto(I7, b) = I4c) 构造SLR分析表解:FIRST(S) = FIRST(A) = a, bFOLLOW(S) = $, a, b FOLLOW(A) = a, bSLR分析表为:actiongotoab$SA0s3s4121s3s4acc562s3s4723r4r44r2r2r25s3s4566s3/r3s4/r3727s3/r1s4/r1r1
24、56SLR分析表冲突,分析过程有多种可能路径,选择其中一种导致正确结果的即可。d) 对输入串abab,给出SLR分析器运行过程栈输入动作0abab$移进0a3bab$归约Aa0A2bab$移进0A2b4ab$归约Sb0A2S7ab$归约SAS0S1ab$移进0S1a3b$归约Aa0S1A6b$归约ASA0A2b$移进0A2b4$归约Sb0A2S7$归约SAS0S1$接受e) 构造规范LR分析表解:I0 = SS, $, SAS, $/a/b, Sb, $/a/b, ASA, a/b, Aa, a/b goto(I0, S) = SS, $, ASA, a/b, ASA, a/b, Aa, a/
25、b, SAS, a/b, Sb, a/b = I1goto(I0, A) = SAS, $/a/b , SAS, $/a/b, Sb, $/a/b, ASA, a/b, Aa, a/b = I2goto(I0, a) = Aa, a/b = I3, goto(I0, b) = Sb, $/a/b = I4goto(I1, S) = ASA, a/b, ASA, a/b, Aa, a/b, SAS, a/b, Sb, a/b = I5goto(I1, A) = ASA, a/b, SAS, a/b, SAS, a/b, Sb, a/b, ASA, a/b, Aa, a/b = I6goto(I1, a) = I3, goto(I1, b) = Sb, a/b = I7goto(I2, S) = SAS, $/a/b, ASA, a/b, ASA, a/b, Aa, a/b, SAS, a/b, Sb, a/b = I8goto(I2, A) = I2, goto(I2, a) = I3, goto(I2, b) = I4goto(I5, S) = I5, goto(I5, A) = I6, goto(I5, a) = I3,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1