编译原理第六章习题答案

合集下载

《编译原理》(陈火旺版)课后作业参考答案ch6-10

《编译原理》(陈火旺版)课后作业参考答案ch6-10

第6章属性文法和语法制导翻译7. 下列文法由开始符号S产生一个二进制数,令综合属性val给出该数的值:试设计求的属性文法,其中,已知B的综合属性c, 给出由B产生的二进位的结果值。

例如,输入时,=,其中第一个二进位的值是4,最后一个二进位的值是。

【答案】11. 设下列文法生成变量的类型说明:(1)构造一下翻译模式,把每个标识符的类型存入符号表;参考例。

【答案】第7章语义分析和中间代码产生1. 给出下面表达式的逆波兰表示(后缀式):【答案】3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

【答案】间接码表:(1)→(2)→(3)→(4)→(1)→(5)→(6)4. 按节所说的办法,写出下面赋值句A:=B*(-C+D) 的自下而上语法制导翻译过程。

给出所产生的三地址代码。

【答案】5. 按照7.3.2节所给的翻译模式,把下列赋值句翻译为三地址代码:A[i, j]:=B[i, j] + C[A [k, l]] + d[ i+j]【答案】6. 按7.4.1和节的翻译办法,分别写出布尔式A or ( B and not (C or D) )的四元式序列。

【答案】用作数值计算时产生的四元式:用作条件控制时产生的四元式:其中:右图中(1)和(8)为真出口,(4)(5)(7)为假出口。

7. 用7.5.1节的办法,把下面的语句翻译成四元式序列: While A<C and B<D do if A=1 then C:=C+1 else while A ≦D do A:=A+2; 【答案】第9章 运行时存储空间组织4. 下面是一个Pascal 程序:当第二次( 递归地) 进入F 后,DISPLAY 的内容是什么当时整个运行栈的内容是什么 【答案】第1次进入F 后,运行栈的内容: 第2次进入F 后,运行栈的内容: 109 87 6 5 4 3 2 1 017 1615 14 13 12 11 10 9 8 7 6 5第2次进入F 后,Display 内容为:5. 对如下的Pascal 程序,画出程序执行到(1)和(2)点时的运行栈。

编译原理及其习题解答(武汉大学出版社)课件chap6

编译原理及其习题解答(武汉大学出版社)课件chap6

练习1题目 练习 题目
文法G[T]: T→ F | T*F F →F ↑ P | P P→ (T) | i 证明T*P ↑(T*F)是文法G的一个句型,并 指出这个句型的所有短语、直接短语、 句柄。
编译原理 Compiler Principles
练习1 练习1解答
证明:T T*F T*F↑P T*F↑(T) 语法树: T T * F P F ↑ ( P T )
编译原理 Compiler Principles
练习2题目
设有文法G[S]: 设有文法 S →V1 V1→ V2 | V1iV2 V2→ V3 | V2+V3 V3→ )V1* | ( (1)给出 (+(i( 的最右推导,并画出相应的语法树; 给出 的最右推导,并画出相应的语法树; (2)证明 2+V3i( 是文法的一个句型,并指出这个句型的短语、直接 证明V 是文法的一个句型,并指出这个句型的短语、 证明 短语、句柄。 短语、句柄。
编译原理 Compiler Principles
非确定的自下而上的分析器
非确定的自下而上的分析器,是一般移进 归约方法 非确定的自下而上的分析器,是一般移进-归约方法 的抽象模型,可识别任何上下文无关语言。 的抽象模型,可识别任何上下文无关语言。给定一个上下 文无关文法,可构造一个自下而上的分析器。 文无关文法,可构造一个自下而上的分析器。 非确定的自下而上的分析器与非确定的自上而下的分 析器的不同之处: 析器的不同之处: 课本P147 课本
编译原理 Compiler Principles
自下而上分析法存在的问题
可归约串的问题;(∵ 该分析的每一步就是从当前串中找一 ;(∵
个子串( 个子串(称“可归约串”),将它归约到某个非终结符号) 可归约串”),将它归约到某个非终结符号) 将它归约到某个非终结符号 自下而上分析法的关键就是找哪个子串是“可归约串” 自下而上分析法的关键就是找哪个子串是“可归约串”, 关键就是找哪个子串是 哪个不是“可归约串” 例如上例中的(3) 哪个不是“可归约串”。例如上例中的

《编译原理》课后习题答案

《编译原理》课后习题答案

第7 题证明下述文法G[〈表达式〉]是二义的。

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。

所以,该文法是二义的。

或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。

第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。

(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。

答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。

第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

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

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

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

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

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

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

第一章:引论习题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:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理教程课后习题答案——第六章

编译原理教程课后习题答案——第六章

第六章运行时存储空间组织6.1 完成下列选择题:(1) 过程的DISPLAY表中记录了。

a. 过程的连接数据b. 过程的嵌套层次c. 过程的返回地址d. 过程的入口地址(2) 过程P1调用P2时,连接数据不包含。

a. 嵌套层次显示表b. 老SPc. 返回地址d. 全局DISPLAY地址(3) 堆式动态分配申请和释放存储空间遵守原则。

a. 先请先放b. 先请后放c. 后请先放d. 任意(4) 栈式动态分配与管理在过程返回时应做的工作有。

a. 保护SPb. 恢复SPc. 保护TOPd. 恢复TOP(5) 如果活动记录中没有DISPLAY表,则说明。

a. 程序中不允许有递归定义的过程b. 程序中不允许有嵌套定义的过程c. 程序中既不允许有嵌套定义的过程,也不允许有递归定义的过程d. 程序中允许有递归定义的过程,也允许有嵌套定义的过程【解答】(1) b (2) a(3) d (4) b (5) b6.2 何谓嵌套过程语言运行时的DISPLAY表?它的作用是什么?【解答】当过程定义允许嵌套时,一个过程在运行中应能够引用在静态定义时包围它的任一外层过程所定义的变量或数组。

也就是说,在栈式动态存储分配方式下的运行中,一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据。

因此,过程Q运行时必须知道它的所有(静态)外层过程的最新活动记录的地址。

由于允许递归和可变数组,这些外层过程的活动记录的位置也往往是变迁的。

因此,必须设法跟踪每个(静态)外层的最新活动记录的位置,而完成这一功能的就是DISPLAY嵌套层次显示表。

也即,每当进入一个过程后,在建立它的活动记录区的同时也建立一张DISPLAY表,它自顶而下每个单元依次存放着现行层、直接外层等,直至最外层(主程序层)等每一层过程的最新活动记录的起始地址。

6.3 (1) 写出实现一般递归过程的活动记录结构以及过程调用、过程进入与过程返回的指令;(2) 对以return(表达式)形式(这个表达式本身是一个递归调用)返回函数值的特殊函数过程,给出不增加时间开销但能节省存储空间的实现方法。

编译原理第六章习题解答

编译原理第六章习题解答

第六章习题答案4.文法G:S→S;G|GG→G(T)|HH→a|(S)T→T+S|S(1)该文法是算符文法,且不包含ε产生式。

计算每个非终结符的FIRSTVT集合:FIRSTVT(S) = FIRSTVT(S)∪{;}∪FIRSTVT(G) = {;, a, (}FIRSTVT(G) = FIRSTVT(G)∪{(}∪FIRSTVT(H) = {a, (}FIRSTVT(H) = {a, (} = {a, (}FIRSTVT(T) = FIRSTVT(T)∪{+}∪FIRSTVT(S) = {+, ;, a, (}计算每个非终结符的LASTVT集合:LASTVT(S) = {;}∪LASTVT(G) = {;, a, )}LASTVT(G) = {)}∪LASTVT(H) = {a, )}LASTVT(H) = {a, )} = {a, )}LASTVT(T) = {+}∪LASTVT(S) = {+, ;, a, )}①关系由#S#可知:##由G→G(T)|H可知:()②关系S# LASTVT(S)#→{;, a, )}#S; LASTVT(S);→{;, a, )};G( LASTVT(G)( →{a, )}(T) LASTVT(T)) →{+, ;, a, )})S) LASTVT(S)) →{;, a, )})T+ LASTVT(T)+ →{+, ;, a, )}+③关系#S #FISRTVT(S)→ #{;, a, (};G ;FISRTVT(G)→ ;{a, (}(T (FISRTVT(T)→ ({+, ;, a, (}(S (FISRTVT(S)→ ({;, a, (}+S +FISRTVT(S)→ +{;, a, (}构造算符优先关系表如下:+ ; a ( ) # +;a()#由该文法的算符优先关系表可知,该文法是算符优先文法。

(2)句型a(T+S);H;(S)的语法树如右图所示:短语:a(T+S);H;(S),a(T+S);H ,a(T+S),a ,T+S ,H ,(S)句柄:a素短语:a ,T+S ,(S)最左素短语:a(3)对a;(a+a)进行算符优先分析步骤如下:对采用算符优先分析方法进行分析,可知:a;(a+a)和(a+a)均应为该文法的句子。

编译原理(清华大学-第2版)课后习题答案

编译原理(清华大学-第2版)课后习题答案

编译原理(清华⼤学-第2版)课后习题答案第三章N=>D=> {0,1,2,3,4,5,6,7,8,9}N=>ND=>NDDL={a |a(0|1|3..|9)n且 n>=1}(0|1|3..|9)n且 n>=1{ab,}a nb n n>=1第6题.(1) <表达式> => <项> => <因⼦> => i(2) <表达式> => <项> => <因⼦> => (<表达式>) => (<项>)=> (<因⼦>)=>(i)(3) <表达式> => <项> => <项>*<因⼦> => <因⼦>*<因⼦> =i*i(4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因⼦>+<项>=> <因⼦>*<因⼦>+<项> => <因⼦>*<因⼦>+<因⼦> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因⼦>+<项>=i+<项> => i+<因⼦> => i+(<表达式>) => i+(<表达式>+<项>)=> i+(<因⼦>+<因⼦>)=> i+(i+i)(6) <表达式> => <表达式>+<项> => <项>+<项> => <因⼦>+<项> => i+<项> => i+<项>*<因⼦> => i+<因⼦>*<因⼦> = i+i*i第7题第9题语法树ss s* s s+aa a推导: S=>SS*=>SS+S*=>aa+a*11. 推导:E=>E+T=>E+T*F语法树:E+T*短语: T*F E+T*F直接短语: T*F句柄: T*F12.短语:直接短语:句柄:13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS=> abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa => ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) ⽂法:S → ABSS → AaS →εA → aB → b(3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa,直接短语: a1 , b1 , b2, a2 , ,句柄:a114 (1)S → ABA → aAb | εB → aBb | ε(2)S → 1S0S → AA → 0A1 |ε第四章1. 1. 构造下列正规式相应的DFA (1)1(0|1)*101NFA(2) 1(1010*|1(010)*1)*0NFA(3)NFA(4)NFA2.解:构造DFA 矩阵表⽰b其中0 表⽰初态,*表⽰终态⽤0,1,2,3,4,5分别代替{X} {Z} {X,Z} {Y} {X,Y} {X,Y,Z} 得DFA状态图为:3.解:构造DFA矩阵表⽰构造DFA的矩阵表⽰其中表⽰初态,*表⽰终态替换后的矩阵4.(1)解构造状态转换矩阵:{2,3} {0,1}{2,3}a={0,3}{2},{3},{0,1}{0,1}a={1,1} {0,1}b={2,2}(2)解:⾸先把M的状态分为两组:终态组{0},和⾮终态组{1,2,3,4,5} 此时G=( {0},{1,2,3,4,5} ) {1,2,3,4,5}a={1,3,0,5} {1,2,3,4,5}b={4,3,2,5}由于{4}a={0} {1,2,3,5}a={1,3,5}因此应将{1,2,3,4,5}划分为{4},{1,2,3,5}G=({0}{4}{1,2,3,5}){1,2,3,5}a={1,3,5}{1,2,3,5}b={4,3,2}因为{1,5}b={4} {23}b={2,3}所以应将{1,2,3,5}划分为{1,5}{2,3}G=({0}{1,5}{2,3}{4}){1,5}a={1,5} {1,5}b={4} 所以{1,5} 不⽤再划分{2,3}a={1,3} {2,3}b={3,2}因为 {2}a={1} {3}a={3} 所以{2,3}应划分为{2}{3}所以化简后为G=( {0},{2},{3},{4},{1,5})7.去除多余产⽣式后,构造NFA如下G={(0,1,3,4,6),(2,5)} {0,1,3,4,6}a={1,3}{0,1,3,4,6}b={2,3,4,5,6}所以将{0,1,3,4,6}划分为 {0,4,6}{1,3} G={(0,4,6),(1,3),(2,5)}{0,4,6}b={3,6,4} 所以划分为{0},{4,6} G={(0),(4,6),(1,3),(2,5)}不能再划分,分别⽤ 0,4,1,2代表各状态,构造DFA 状态转换图如下;b8.代⼊得S = 0(1S|1)| 1(0S|0) = 01(S|ε) | 10(S|ε) = (01|10)(S|ε)= (01|10)S | (01|10)= (01|10)*(01|10)构造NFA由NFA可得正规式为(01|10)*(01|10)=(01|10)+9.状态转换函数不是全函数,增加死状态8,G={(1,2,3,4,5,8),(6,7)}(1,2,3,4,5,8)a=(3,4,8) (3,4)应分出(1,2,3,4,5,8)b=(2,6,7,8)(1,2,3,4,5,8)c=(3,8)(1,2,3,4,5,8)d=(3,8)所以应将(1,2,3,4,5,8)分为(1,2,5,8), (3,4)G={(1,2,5,8),(3,4),(6,7)}(1,2,5,8)a=(3,4,8) 8应分出(1,2,5,8)b=(2,8)(1,2,5,8)c=(8)(1,2,5,8)d=(8)G={(1,2,5),(8),(3,4),(6,7)}(1,2,5)a=(3,4,8) 5应分出G={(1,2), (3,4),5, (6,7) ,(8) }去掉死状态8,最终结果为 (1,2) (3,4) 5,(6,7) 以1,3,5,6代替,最简DFA为b正规式:b*a(da|c)*bb*第五章1.S->a | ^ |( T )(a,(a,a))S => ( T ) => ( T , S ) => ( S , S ) => ( a , S) => ( a, ( T )) =>(a , ( T , S ) ) => (a , ( S , S )) => (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 ) => ( ( ( a , a ) , ^ , ( a ) ) , S ) => ( ( ( a , a ) , ^ , ( a ) ) , a )S->a | ^ |( T )T -> T , ST -> S消除直接左递归:S->a | ^ |( T )T -> S T’T’ -> , S T’ | ξSELECT ( S->a) = {a}SELECT ( S->^) = {^}SELECT ( S->( T ) ) = { ( }SELECT ( T -> S T’) = { a , ^ , ( }SELECT ( T’ -> , S T’ ) = { , }SELECT ( T’ ->ξ) = FOLLOW ( T’ ) = FOLLOW ( T ) = { )}构造预测分析表分析符号串( a , a )#分析栈剩余输⼊串所⽤产⽣式#S ( a , a) # S -> ( T )# ) T ( ( a , a) # ( 匹配# ) T a , a ) # T -> S T’# ) T’ S a , a ) # S -> a# ) T’ a a , a ) # a 匹配# ) T’,a) # T’ -> , S T’# ) T’ S , , a ) # , 匹配# ) T’ S a ) # S->a# ) T’ a a ) # a匹配# ) T’) # T’ ->ξ# ) ) # )匹配# # 接受2.E->TE’E’->+E E’->ξT->FT’T’->T T’->ξF->PF’F’->*F’F’->ξP->(E) P->a P->b P->∧SELECT(E->TE’)=FIRST(TE’)=FIRST(T)= {(,a,b,^)SELECT(E’->+E)={+}SELECT(E’->ε)=FOLLOW(E’)= {#,)}SELECT(T->FT’)=FIRST(F)= {(,a,b,^}SELECT(T’ —>T)=FIRST(T)= {(,a,b,^)SELECT(T’->ε)=FOLLOW(T’)= {+,#,)}SELECT(F ->P F’)=FIRST(F)= {(,a,b,^}SELECT(F’->*F’)={*}SELECT(F’->ε)=FOLLOW(F’)= {(,a,b,^,+,#,)}3. S->MH S->a H->Lso H->ξK->dML K->ξL->eHf M->K M->bLM FIRST ( S ) =FIRST(MH)= FIRST ( M ) ∪FIRST ( H ) ∪{ξ}∪{a}= {a, d , b , e ,ξ} FIRST( H ) = FIRST ( L ) ∪{ξ}= { e , ξ}FIRST( K ) = { d , ξ}FIRST( M ) = FIRST ( K ) ∪{ b } = { d , b ,ξ}FOLLOW ( S ) = { # , o }FOLLOW ( H ) = FOLLOW ( S ) ∪{ f } = { f , # , o }FOLLOW ( K ) = FOLLOW ( M ) = { e , # , o }FOLLOW ( L ) ={ FIRST ( S ) –{ξ} } ∪{o} ∪FOLLOW ( K )∪{ FIRST ( M ) –{ξ} } ∪FOLLOW ( M )= {a, d , b , e , # , o }FOLLOW ( M ) ={ FIRST ( H ) –{ξ} } ∪FOLLOW ( S )∪{ FIRST ( L ) –{ξ} } = { e , # , o }SELECT ( S-> M H) = ( FIRST ( M H) –{ξ} ) ∪FOLLOW ( S )= ( FIRST( M ) ∪FIRST ( H ) –{ξ} ) ∪FOLLOW ( S )= { d , b , e , # , o }SELECT ( S-> a ) = { a }SELECT ( H->L S o ) = FIRST(L S o) = { e }SELECT ( H ->ξ) = FOLLOW ( H ) = { f , # , o }SELECT ( K->ξ) = FOLLOW ( K ) = { e , # , o }SELECT ( L-> e H f ) = { e }SELECT ( M->K ) = ( FIRST( K ) –{ξ} ) ∪FOLLOW ( M ) = {d,e , # , o }SELECT ( M -> b L M )= { b }4 . ⽂法含有左公因式,变为S->C $ { b, a }C-> b A { b }C-> a B { a }A -> b A A { b }A-> a A’ { a }A’-> ξ{ $ , a, b }A’-> C { a , b }B->a B B { a }B -> b B’ { b }B’->ξ{ $ , a , b }B’-> C { a, b }5. <程序> --- S <语句表>――A <语句>――B <⽆条件语句>――C <条件语句>――D <如果语句>――E <如果⼦句> --FS->begin A end S->begin A end { begin }A-> B A-> B A’ { a , if }A-> A ; B A’-> ; B A’ { ; }A’->ξ{ end }B-> C B-> C { a } B-> D B-> D { if }C-> a C-> a { a }D-> E D-> E D’ { if }D-> E else B D’-> else B { else }D’->ξ{; , end } E-> FC E-> FC { if }F-> if b then F-> if b then { if }⾮终结符是否为空S-否A-否A’-是B-否C-否D-否D’-是E-否F-否FIRST(S) = { begin }FIRST(A) = FIRST(B) ∪FIRST(A’) ∪{ξ} = {a , if , ; , ξ} FIRST(A’) ={ ; , ξ}FIRST(B) = FIRST(C) ∪FIRST(D) ={ a , if }FIRST(C) = {a}FIRST(D) = FIRST(E)= { if }FIRSR(D’) = {else , ξ}FIRST(E) = FIRST(F) = { if }FIRST(F) = { if }FOLLOW(S) = {# }FOLLOW(A) = {end}FOLLOW(A’) = { end }FOLLOW(B) = {; , end }FOLLOW (C) = {; , end , else }FOLLOW(D) = {; , end }FOLLOW( D’ ) = { ; , end }FOLLOW(E) = { else , ; end }FOLLOW(F) = { a }S A A’ B C D D’ E F if then else begin end a b ;6. 1.(1) S -> A | B(2) A -> aA|a(3)B -> bB |b提取(2),(3)左公因⼦(1) S -> A | B(2) A -> aA’(3) A’-> A|ξ(4) B -> bB’(5) B’-> B |ξ2.(1) S->AB(2) A->Ba|ξ(3) B->Db|D(4) D-> d|ξ提取(3)左公因⼦(1) S->AB(2) A->Ba|ξ(3) B->DB’(4) B’->b|ξ(5) D-> d|ξ3.(1) S->aAaB | bAbB(2) A-> S| db(3) B->bB|a4(1)S->i|(E)(2)E->E+S|E-S|S提取(2)左公因⼦(1)S->i|(E)(2)E->SE’(3)E’->+SE’|-SE’ |ξ5(1)S->SaA | bB(2)A->aB|c(3)B->Bb|d消除(1)(3)直接左递归(1)S->bBS’(2)S’->aAS’|ξ(3)A->aB | c(4) B -> dB’(5)B’->bB’|ξ6.(1) M->MaH | H(2) H->b(M) | (M) |b消除(1)直接左递归,提取(2)左公因⼦(1)M-> HM’(2)M’-> aHM’ |ξ(3)H->bH’ | ( M )(4)H’->(M) |ξ7. (1)1)A->baB4)B->a将1)、2)式代⼊3)式1)A->baB2)A->ξ3)B->baBbb4)B->bb5)B->a提取3)、4)式左公因⼦1)A->baB2)A->ξ3)B->bB’4)B’->aBbb | b5)B->a(3)1)S->Aa2)S->b3)A->SB4)B->ab将3)式代⼊1)式1)S->SBa2)S->b3)A->SB4)B->ab消除1)式直接左递归1)S->bS’2)S’->BaS’ |ξ3)S->b4)A->SB5)B->ab删除多余产⽣式4)1)S->bS’(5)1)S->Ab2)S->Ba3)A->aA4)A->a5)B->a提取3)4)左公因⼦1)S->Ab4)A’-> A |ξ5)B->a将3)代⼊1)5)代⼊21)S->aA’b2)S->aa3)A->aA’4)A’-> A |ξ5)B->a提取1)2)左公因⼦1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξ5)B->a删除多余产⽣式5)1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξA A’S’S将3)代⼊4)1)S-> aS’2)S’->A’b | a3)A->aA ’4)A’-> aA’ |ξ3)S’->a4)S’->b5)A->aA ’6)A’-> aA’ |ξ对2)3)提取左公因⼦1)S->aS’2)S’->aS’’3)S’’->A’b|ξ4)S’->b5)A->aA ’6)A’-> aA’ |ξ删除多余产⽣式5)1)S->aS’2)S’->aS’’3)S’’->A’b|ξ4)S’->b第六章1S → a | ∧ | ( T )T → T , S | S解:(1) 增加辅助产⽣式 S’→#S#求 FIRSTVT集FIRSTVT(S’)= {#}FIRSTVT(S)= {a ∧ ( }= { a ∧ ( } FIRSTVT (T) = {,} ∪ FIRSTVT( S ) = { , a ∧ ( }求 LASTVT集LASTVT(S’)= { # }LASTVT(S)= { a ∧ )}LASTVT (T) = { , a ∧ )}(2)因为任意两终结符之间⾄多只有⼀种优先关系成⽴,所以是算符优先⽂法(3)a ∧( ) , #F 1 1 1 1 1 1g 1 1 1 1 1 1f 2 2 1 3 2 1g 2 2 2 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1(4)栈优先关系当前符号剩余输⼊串移进或规约#<·( a,a)# 移进#( <· a ,a)# 移进#(T <·, a)# 移进#(T,<· a )# 移进#(T,a ·> ) # 规约#(T,T ·> ) # 规约#(T =·) # 移进#(T) ·> #规约#T =·#接受4.扩展后的⽂法S’→#S# S→S;G S→G G→G(T) G→H H→a H→(S)T→T+S T→S(1)FIRSTVT(S)={;}∪FIRSTVT(G) = {; , a , ( }FIRSTVT(G)={ ( }∪FIRSTVT(H) = {a , ( }FIRSTCT(H)={a , ( }FIRSTVT(T) = {+} ∪FIRSTVT(S) = {+ , ; , a , ( }LASTVT(S) = {;} ∪LASTVT(G) = { ; , a , )}LASTVT(G) = { )} ∪LASTVT(H) = { a , )}LASTVT(H) = {a, )}LASTVT(T) = {+ } ∪LASTVT(S) = {+ , ; , a , ) }构造算符优先关系表因为任意两终结符之间⾄多只有⼀种优先关系成⽴,所以是算符优先⽂法(2)句型a(T+S);H;(S)的短语有:a(T+S);H;(S) a(T+S);H a(T+S) a T+S (S) H直接短语有: a T+S H (S)句柄: a素短语:a T+S (S)最左素短语:a(3)(4)不能⽤最右推导推导出上⾯的两个句⼦。

编译原理(第2版)课后习题答案详解

编译原理(第2版)课后习题答案详解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
▪ 深刻理解:属性,综合属性,继承属性,依赖图,计算 顺序,语法树,语法制导定义,S-属性文法定义,L-属 性文法定义,翻译模式。
▪ 熟练掌握:对于已知文法G和翻译任务,构造其L-属性 定义,将其改造成适于自顶向下分析或自底向上分析的 翻译模式。
上一页
下一页
3ห้องสมุดไป่ตู้
本章教学线索
1 属性文法(属性翻译文法)
上一页
下一页
5
1.1 属性文法的概念
(1)属性文法的定义 在上下文无关文法的基础上,为每个文法符号(终 结符和非终结符)配备若干相关的“值”(也称: “属性”),对于文法的每个产生式都配备了一组属 性的计算规则(语义规则),这种文法称为属性文法。 1968年,Knuth首先提出。
说明:在一般情况下,整个属性文法是非常复杂的。但 属性的函数关系却通常非常简单。属性也很少依赖于 大量的其它属性,因此可以将相互依赖的属性分割成 较小的独立属性集,然后单独对每一属性集写出一个 属性文法。
… 规则n
… 相关的属性等式/语义规则
上一页
下一页
7
例6.1 一个简单台式计算器的属性文法
产生式 L→En E→E1+T E→T T→T1*F T→F F→(E) F→digit
语义规则 Print(E.val) E.val =E1.val+T.val E.val=T.val T.val=T1.val*F.val T.val=F.val F.val=E.val F.val=digit.lexval
例6.3 属性文法为例6.1中的属性文法,输入:3*5+4n
L
Eval:=19
n
Eval:=15
+
Tval:=4
Tval:=15
Tval:=3 Fval:=3
*
Fval:=5
digitlexval:=5
Fval:=4 digitlexval:=4
digitlexval:=3
上一页
下一页
10
例6.4 继承属性的类型说明文法
1.1 属性文法的概念 1.2 属性的分类 1.3 属性的计算规则
2 基于属性文法的处理办法 3 S-属性文法的自下而上计算 4 L-属性文法和自顶向下翻译 5 自下而上计算继承属性
上一页
下一页
4
1 属性文法(属性翻译文法)
语法制导翻译:通过给语法树上各个符号赋予一定的含义 并且将各个符号进行有结构的连接,可以形成语言的具 体语句的含义。这给予我们以启示:可以通过扩充文法, 在文法符号上附着某些语义信息,并在这些语义信息间建 立相互计算关系,从而在语法分析的同时进行语义分析。 由于这种分析是在语法分析的控制下进行的,故称为语法 制导翻译。
上一页
下一页
8
例6.2:无符号整数的属性文法
文法规则
语义规则
Number1→Number2digit Number→digit digit→0 digit→1 digit→2 digit→3 digit→4 digit→5 digit→6 digit→7 digit→8 digit→9
Number1.val=number2.val*10+digit.val Number.val=digit.val digit.val=0 digit.val=1 digit.val=2 digit.val=3 digit.val=4 digit.val=5 digit.val=6 digit.val=7 digit.val=8 digit.val=9
上一页
下一页
12
注意:
Ø 如果同一文法符号在文法规则中出现不止一次,那么每次必须用合适 的下标与在其他地方出现的符号区分开来。
Ø 终结符只有综合属性,它们由词法分析器提供。
Ø 非终结符既可有综合属性也可有继承属性,文法开始符的所有继承属 性为属性计算前的初始值。
Ø 属性计算规则中仅能使用相应产生式中文法符号的属性(封装性)。
Ø 产生式左边的继承属性和产生式右边的文法符号的综合属性由其它产 生式的属性规则计算。
Ø 一个句型的语法树可以加以扩充,用来表示句型分析中得到的各个符 号的属性间的关系:
语法树中,一个结点的综合属性的值由其子结点的属性值确定
产生式
语义规则
D→TL
L.in=T.type
T→int
T.type=integer
T→real
T.type=real
L→L1,id
L1.in=L.in Addtype(id.entry,L.in)
L→id
Addtype(id.entry,L.in)
D
T.type=real
L.in=real
real
L.in=real ,
编译原理第六章习题 答案
本章的主要内容
▪ 属性文法和语法制导的翻译的概念 ▪ 综合属性和继承属性的概念、特点 ▪ S-属性文法与L-属性文法的概念及分析方法 ▪ 翻译模式 ▪ 递归下降翻译器的设计
上一页
下一页
2
本章要求
▪ 知识点:语法制导定义,S-属性定义及其自底向上计算 属性,L-属性定义,自顶向下的翻译,自底向上计算继 承属性。
L.in=real , id2
id1
id3
real id1,id2,id3
上一页
下一页
11
1.3 属性的计算规则
属性的计算规则:设有产生式A→ 定义 b= f(c1,c2,……,ck )f是一个计算函数,并且 (1)b是A的一个综合属性,并且c1,c2,……,ck是产 生式右边文法符号的属性。或者: (2)b是产生式右边某文法符号的一个继承属性,并且 c1,c2,……,ck是A或产生式右边任何文法符号的属性。
上一页
下一页
6
(2)属性(Attribute)是编程语言结构的任意特性。属性在其包含 的信息和复杂性等方面变化很大。属性的典型例子有:
• 变量的数据类型 • 表达式的值 • 存储器中变量的位置 • 程序的目标代码 • 数的有效位数 (3)属性文法一般表示方法:
文法规则
语义规则
规则1 规则2
相关的属性等式/语义规则 相关的属性等式/语义规则
上一页
下一页
9
1.2 属性的分类
• 综合属性:用于自下而上传递信息;在语法树中,一个结点的综合属性由其子 结点的属性值确定,因此,通常使用自底向上的方法在每一个结点处使用语义规 则计算综合属性的值。仅仅使用综合属性的属性文法称S-属性文法。 • 继承属性:用于自上而下传递信息;在语法树中,一个结点的继承属性由此结 点的父结点和/或兄弟结点的某些属性确定。
相关文档
最新文档