编译原理作业集-第五章-修订
- 格式:doc
- 大小:534.00 KB
- 文档页数:22
编译原理作业集1 第二章词法分析1. C或Java语言的标示符是字母和数字组成的序列,第一个字符必须是字母,下划线视为字母,且大小写字母不同。
请写出匹配C或Java语言标示符的正规表达式。
2.为下边所描述的串写正规式,字母表是 {0, 1}. a) 以11 结尾的所有串 b) 只包含一个1的所有串2 第三章上下文无关文法1. ________是描述程序设计语言语法结构的形式工具。
2. 设G=(VN,VT,P,S)是一文法,且V= VN∪VT,若S =>*α,α∈V,则称α为文法G的,若S=>*α,α∈VT,则称α为文法G的。
3. 给出语言L={ab|j>i>=1}的上下文无关文法。
4. 文法G[S]的产生式如下:S?SaS | SbS | cS | Sd | t 对于输入串 tbctat: (1) 给出一个推导;(2) 画出(1)中推导对应的分析树;ij**(3) 文法G是否是二义性的,请证明你的结论。
3 第四章语法分析1. 考虑文法G[S]:S-> A��B A->a|b B->(C) C->CS|S 1) 消除上述文法的左递归,重写该文法。
2) 求消除左递归后的文法的非终结符构造First集合和Follow集合。
3) 为消除左递归后的文法构造LL(1)分析表。
4) 并写出对句子 (ab) 的LL(1)分析过程。
2. 给定文法G[S]: S->SaSb��c给出句子 cacbacb 的规范推导,画出该句子的语法推导树,指出该句子的句柄。
3. 给定文法G[S]:S->S b A��A A->a 1) 造文法G[S]的LR(1)项目的DFA。
2) 上述文法构造LR(1)分析表。
3) 写出句子 ababa的分析过程。
4 第五章语义分析1.通过下面文法给出的十进制数的浮点数值,写出一个属性文法(提示:使用一个属性count计算小数点右面数字的个数)。
《编译原理》习题参考答案(六)第五章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)结构等价,无名字等价。
编译原理作业集 第五章 自下而上语法分析 西安理工大学计算机科学与工程学院 张发存编写 4/27/2022 7:31:03 AM - 1 - 第五章 语法分析—自下而上分析
本章要点 1. 自下而上语法分析法的基本概念: 2. 算符优先分析法; 3. LR分析法分析过程; 4. 语法分析器自动产生工具YACC; 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)简单短语 编译原理作业集 第五章 自下而上语法分析 西安理工大学计算机科学与工程学院 张发存编写 4/27/2022 7:31:03 AM - 2 - 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 | F F->FP | P P->(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; 编译原理作业集 第五章 自下而上语法分析 西安理工大学计算机科学与工程学院 张发存编写 4/27/2022 7:31:03 AM - 3 - 二、填空题: 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→12对活前缀1是有效的,其条件是存在规范推导 。 11. 形式上我们说一个LR(1)项目[A→,a]对于活前缀是有效的,如果存在规范推导 。 12. LR(k)分析方法中项目类型可分为四类 、 、 和 。 13. 所谓算符优先分析法就是仿照算术四则运算的运算过程设计的一种语法分析方法。它首先要规定 ,然后利用这种关系确定 ,并进行 。 14. 如图所示的语法树中,a,b不在同一句柄中, 先归约,所以 的优先级高于 。
P
b R …… a … Q
15. 对于句型η的语法树,若它的一棵子树的根标记为A,且将此子树的末端结点标记从左至右排列起来所形成的符号串为β,则β是 ;此时文法中必有推导 。 16. LR(0)每个项目中圆点的左部表示在分析过程中,要用该产生式归约时, ,右部表示 。 17. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别 的NFA的一个状态。 编译原理作业集 第五章 自下而上语法分析 西安理工大学计算机科学与工程学院 张发存编写 4/27/2022 7:31:03 AM - 4 - 二.答案: 1. 寻找或确定一个句型的句柄;2. 从左到右扫描输入串,构造一个最右推导的逆过程;3. 归约,接受;4. T*F;5. 开始符号;6. 最左素短语,句柄;7. 移进项目和归约项目并存,多个归约项目并存;8. 文法活前缀和可归前缀;9. 活前缀,规范句型;10.
21
*'RRAS;11. RRAS*',其中=,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. ×;