东农17春《编译原理》离线作业-编译原理
东北农业大学网络教育学院编译原理网上作业题
第一章 编译概述
一、多项选择题:
1.编译程序各阶段的工作都涉及到( )。(﹡﹡)
A.语法分析 B.表格管理 C.出错处理D.语义分析E.词法分析
2.编译程序工作时,通常有( )阶段。?(﹡)
A.词法分析 B.语法分析 C.中间代码生成 D.语义检查 E.目标代码生成
二、填空题:
1.解释程序和编译程序的区别在于( )。(﹡)
2.编译过程通常可分为5个阶段,分别是( )、( )、( )、( )和( )生成。(﹡)
3.编译程序工作过程中,第一段输入是( ),最后阶段的输出为( )程序。(﹡)
4.编译程序是指将( )程序翻译成( )程序的程序。(﹡)
三、综合题:
1.画出编译程序的总体结构图,简述各部分的主要功能。(﹡﹡﹡)
第二章 文法和语言的基本知识
一、多项选择题:
1.下面哪些说法是错误的( )。(﹡﹡)
A.有向图是一个状态转换图? B.状态转换图是一个有向图?
C.有向图是一个DFA? D.DFA可以用状态转换图表示?
2.对无二义性文法来说,一棵语法树往往代表了( )。(﹡﹡)
A.多种推导过程? B.多种最左推导过程?
C.一种最左推导过程 D.仅一种推导过程? E.一种最左推导过程?
3.如果文法G存在一个句子,满足下列条件( )之一时,则称该文法是二义文法。(﹡﹡)?
A.该句子的最左推导与最右推导相同??B.该句子有两个不同的最左推导??
C.该句子有两棵不同的最右推导?D.该句子有两棵不同的语法树??E.该句子的语法树只有一个?
4.有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不产生下面( )集合?(﹡﹡)
A.{anbmcsup>ndm|n,m≥0}??B.{anbncsup>mdm|n,m>0}??
C.{anbmcsup>mdn|n,m≥0}??D.{anbncsup>mdm|n,m≥0}?E.{anbncsup>ndm|n,n≥0}?
5.自下而上的语法分析中,应从( )开始分析。?(﹡)?
A.句型 B.句子 C.以单词为单位的程序 D.文法的开始符 E.句柄?
6.对正规文法描述的语言,以下( )有能力描述它。?(﹡﹡)?
A.0型文法 B.1型文法 C.上下文无关文法 D.右线性文法 E.左线性文法
二、填空题:
1.文法中的终结符和非终结符的交集是( )。词法分析器交给语法分析器的文法符号一定是( ),它一定只出现在产生式的( )部。(﹡)
2.最左推导是指每次都对句型中的( )非终结符进行扩展。(﹡)
3.在语法分析中,最常见的两种方法一定是( )分析法,另一是( )分析法。(﹡)
4.采用( )语法分析时,必须消除文法的左递归。(﹡)
5.( )树代表推导过程,( )树代表归约过程。(﹡)
6.自下而上分析法采用( )、归约、错误处理、( )等四种操作。(﹡﹡)
7.Chomsky把文法分为( )种类型,编译器构造中采用 () 和( )文法,它们分别产生( )和( )语言,并分别用( )和( )自动机识别所产生的语言。(﹡﹡)
三、判断题:?
1.文法 S→aS|bR|ε R→cS。描述的语言是(a|bc)* (﹡)
2.在自下而上的语法分析中,语法树与分析树一定相同。(﹡)
3.二义文法不是上下文无关文法。(﹡)
4.语法分析时必须先消除文法中的左递归。(﹡)
5.规范归约和规范推导是互逆的两个过程。(﹡)
6.一个文法所有句型的集合形成该文法所能接受的语言。(﹡)
7.有穷自动机接受的语言是正则语言。(﹡)
8.若r1和r2是Σ上的正规式,则r1|r2也是。(﹡)
9.令Σ={a,b},则Σ上所有以b为首的字构成的正规集的正规式为b*(a|b)*。(﹡)
四、简答题
句柄:(﹡)
2.素短语:(﹡﹡)
3.语法树:(﹡﹡)
4.归约:(﹡﹡)
5.推导:(﹡﹡)
五、问答题
1.给出上下文无关文法的定义。(﹡﹡)
2.文法G:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?(﹡﹡﹡)
3.按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。(﹡﹡)
4.有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)写出句子acabcbbdcc的最左推导过程。(﹡﹡﹡)
5.对于文法G:
S→(L)|aS|a
L→L, S|S
(1)画出句型(S,(a))的语法树。
(2)写出上述句型的所有短语、直接短语、句柄和素短语。(﹡﹡﹡)
6. 考虑文法G,其产生式如下:
S→(L)|a
L→L,S|S
(a)试指出此文法的终结符号、非终结符号。
(b)给出句子(a,(a,a))的分析树。
(c)构造句子(a,(a,a))的一个最左推导。
(d)构造句子(a,(a,a))的一个最右推导。
(e)这个文法生成的语言是什么?(﹡﹡)
7.考虑文法G:
T→T*F|F
F→F↑P|P
P→(T)|i
证明T*P↑(T*F)是该文法的一个句型,并指出直接短语和句柄。(﹡﹡)
8.试描述下列文法产生的语言L(G)(﹡﹡)
S→10S0|aA
A→bA|a
9.已知语言L(G)={abnc |n≥1} 试对该语言构造相应文法。(﹡﹡)
10.证明下列文法的二义性 (﹡﹡﹡)
1.G 2.G
Z→aZbZ|aZ|a S→AB
A→bB|bC|ba
B→Sb|ba|a
C→Bb|b
11.有文法G:S→iSeS|iS|i
该文法是否是二义的。试证明之。(﹡﹡)
12.文法G:T→aR,R→Tb|d生成的语言是什么?G是否为3型文法?(﹡﹡)
13.试写出能够描述下列电话号码格式的文法。(﹡﹡)
67391742
010-67391742
(010)67391742
试构造生成语言的上下文无关文法。(﹡﹡﹡)
(1) { anbnci | n≥1,i≥0 }
(2) { w | w∈{a,b}+,且w中a的个数恰好比b多1 }
下面的二义性文法描述命题演算公式,为它写一个等价的非二义性文法。G:S -> S AND S |S OR S | NOT S | p | q | (S) (﹡﹡)
16. 对于下列语言分别写出它们的正规表达式。 (﹡﹡)
(1)?英文字母组成的所有符号串,要求符号串中顺序包含五个元音。
(2)?英文字母组成的所有符号串,要求符号串中的字母依照词典顺序排列。
第三章 词法分析与有穷自动机
一、多项选择题:
1.在词法分析中,能识别出( )。(﹡﹡)
A.基本字? B.四元式 ?C.运算符 ?D.逆波兰式? E.常数
2.令∑={a,b},则∑上所有以b开头,后跟若干个ab的字的全体对应的正规式为( )。(﹡﹡)
?A.b(ab)* ?B.b(ab)+ ?C.(ba)*b?D.(ba)+b?E.b(a|b)
二、填空题:
1.确定有限自动机DFA是( )的一个特例。(﹡)
2.若二个正规式所表示的( )相同,则认为二者是等价的。(﹡)
3.一个字集是正规的,当且仅当它可由( )所 ( ) 。(﹡)
三、判断题:
1.一个有限状态自动机中,有且仅有一个惟一终态。()
2.设r和s分别是正规式,则有L(r|s)=L(r)|L(s)。()
3.自动机M和M′的状态数不同,则二者必不等价。()
4.确定的自动机以及不确定的自动机都能正确地识别正规集。()
5.对任意一个右线性文法G,都存在一个NFA M,满足L(G)=L(M)。()
6.对任意一个右线性文法G,都存在一个DFA M,满足L(G)=L(M)。()
7.对任何正规表达式e,都存在一个NFA M,满足L(G)=L(e)。()
8.对任何正规表达式e,都存在一个DFA M,满足L(G)=L(e)。()
9. 设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。()
10.对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。()
四、综合题:
1.设M=({x,y}, {a,b}, f,x,{y})为一非确定的有限自动机,其中f定义如下:
f(x,a)={x,y} f(a,b)={y}
f(y,a)=φ f(y,b)={x,y}
试构造相应的确定有限自动机M′。(﹡﹡)
2.对给定正规式b*(d|ad)(b|ab)+,构造其NFAM。(﹡﹡)
3.字母表{a,b}上的正规式R=(ba|a)*,构造R的相应DFA。(﹡﹡)
4.请写出在∑=(a,b)上,不是a开头的,但以aa结尾的字符串集合的正规表达式,并构造与之等价状态最少的DFA。(﹡﹡﹡)
人运狼、羊、菜过河,一次运一件,不让羊吃掉菜,也不让狼吃掉羊,画出渡河的状态转换图。可否将其抽象为一个有限自动机。(﹡﹡﹡)
6.对于正规表达式 (a|b)*a(a|b) 构造最小状态的DFA。(﹡﹡)
第四章 语法分析
一、多项选择题:
1.一个LR分析器包括( )。(﹡﹡)
A.一个总控程序 B.一个项目集 C.一个活前缀 D.一张分析表 E.一个分析栈
2.LR分析器核心部分是一张分析表,该表包括( )等子表。(﹡﹡)
A.LL(1)分析 B.优先关系 C.GOTO D.LR E.ACTION
3.每一项ACTION所规定的动作包括( )。(﹡﹡)
A.移进 B.比较 C.接受 ?D.归约?E.报错
4.对LR分析表的构造,有可能存在( )动作冲突。(﹡﹡)
?A.移进 B.归约 ?C.移进/归约?D.移进/移进?E.归约/归约
5.对LR分析器来说,存在( )等分析表的构造方法。(﹡﹡)
?A.LALR?B.LR(0)?C.SLR(1)?D.SLR(0)?E.LR(1)
6.自上而下的语法分析方法有( )。(﹡﹡)
?A.算符优先分析法 ?B.LL(1)分析法?C.SLR(1)分析法 ?D.LR(0)分析法 ?E.LALR(1)分析法
二、填空题:
1.对于一个文法,如果能够构造 ( ) 。使得它的 ( ) 均是唯一确定的,则称该文法为LR文法。(﹡)
2.字的前缀是指该字的 ( ) 。(﹡)
3.活前缀是指 ( ) 的一个前缀,这种前缀不含 ( ) 之后的任何符号。(﹡)
4.在LR分析过程中,只要 ( ) 的已扫描部分保持可归约成一个 ( ) ,则扫描过的部分正确。
5.将识别 ( ) 的NFA确定化,使其成为以 ( ) 为状态的DFA,这个DFA就是建立 ( ) 的基础。(﹡﹡)
6.A→α·称为 ( ) 项目;对文法开始符S′→α·为 ( ) 项目;若a为终结符,则称A→α·aβ为 ( ) 项目;若B为非终结符,则称A→α·aβ为 ( ) 项目。(﹡﹡)
7.LR(0)分析法的名字中“L”表示 ( ) ,“R”表示 ( ) ,“0”表示 ( ) 。
三、判断题:
1.对一个右线性文法G,必存在一个左线性文法G',使得L(G)=L(G'),反之亦然。(﹡)
四、综合题:
1.构造下面文法的LL(1)分析表。(﹡﹡﹡)
D→TL
T→int | real
L→id R
R→, id R | ε
2.下面文法G是否为LL(1)文法?说明理由。(﹡﹡)
S→AB|PQx A→xy B→bc
P→dP|ε Q→aQ|ε
3.设有以下文法:(﹡﹡﹡)
G:S→aAbDe|d
A→BSD|e
B→SAc|cD|ε
D→Se|ε
(1)求出该文法的每一个非终结符U的FOLLOW集。
(2)该文法是LL(1)文法吗?
(3)构造C的LL(1)分析表。
4.将文法G改造成为LL(1)的。(﹡﹡﹡)
G:V→N|N
E→V|V+E
N→i
5.已知文法:(﹡﹡﹡)
G: A→aAa|ε
(1)该文法是LL(1)文法吗?为什么?
(2)若采用LL(1)方法进行语法分析,如何得到该文法的LL(1)分析表?
(3)若输入符号串“aaaa”,请给出语法分析过程。
6.设有文法G为:(﹡﹡﹡)
S→a|b|(A)
A→SdA|S
(1)完成下列算符优先关系表,见下表,并判断G是否为算符优先文法。
表 算符优先关系表
(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语。
(3)给出输入串(adb)#的分析过程。
7.设有文法G为:(﹡﹡﹡)
S→a|b|(A)
A→SdA|S
(1)完成下列算符优先关系表,见下表,并判断G是否为算符优先文法。
表 算符优先关系表
(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语。
(3)给出输入串(adb)#的分析过程。
8.对于文法G: S→AS|b
A→SA|a
(1)列出所有LR(0)项目;
(2)列出构成文法LR(0)项目集规范族。(﹡﹡﹡)
9.有文法G
S→a|∧|(T)
T→T,S|S 该文法是否是LL(1)文法,若不是,请进行改写。并给出它的分析表。(﹡﹡﹡)
10.有文法G
(1)S→A
(2)S→B
(3)A→aAb
(4)A→c
(5)B→aBb
(6)B→d
试构造相应的LR(0)项目集规范族及相应的分析表。(﹡﹡﹡)
11. 已知文法G,其产生式如下:
????????S→(L)|a ???L→ L,S|S
????从G中消除左递归,并为之构造一个非递归预测分析器LL(1)分析表。请说明在句子(a,(a,a))上的分析器的动作。 (﹡﹡﹡)
12. 证明下面文法是SLR(1)文法,并构造其SLR分析表。
?????E→E+T|T ????????T→TF|F ????????F→F*|a|b(﹡﹡﹡)
第五章语法制导翻译技术和中间代码生成
一、多项选择题:
1.中间代码主要有( )。(﹡﹡)
? ? A.四元式 B.二元式 C.三元式 D.后缀式 E.间接三元式
? 2.在下面的( )语法制导翻译中,采用拉链-回填技术。(﹡﹡)
? ? A.赋值语句 B.goto语句? C.条件语句 D.循环语句
? 3.下列( )中间代码形式有益于优化处理。(﹡﹡)
? ? A.三元式 B.四元式 C.间接三元式 D.逆波兰表示法 E.树形表示法
? 4.在编译程序中安排中间代码生成的目的是( )。(﹡﹡)
? ? A.便于进行存储空间的组织 B.利于目标代码的优化
? ? C.利于编译程序的移植 D.利于目标代码的移植 E.利于提高目标代码的质量
? 5.三地址代码语句具体实现通常有( )表示方法。(﹡﹡)
? ? A.逆波兰表示 B.三元式 C.间接三元式 D.树形表示 E.四元式
二、填空题:
1.中间代码有 ( )、( )、( )、( ) 等形式,生成中间代码主要是为了使 ( ) 。
2.语法制导翻译既可以用来产生 ( ) 代码,也可以用来产生 ( ) 指令,甚至可用来对输入串进行 ( ) 。(﹡)
3.当源程序中的标号出现“先引用后定义”时,中间代码的转移地址须持 ( ) 时才能确定,因而要进行 ( ) 。(﹡)
4.文法符号的属性有两种,一种称为 ( ) ,另一种称为 ( ) 。(﹡﹡)
5.后缀式abc-/所代表的表达式是( ),表达式(a-b)*c可用后缀式( )表示。(﹡﹡)
6.用一张 ( ) 辅以 ( ) 的办法来表示中间代码,这种表示法称为间接三元式。(﹡﹡)
三、问答题:
1.给出下列表达式的逆波兰表示(后缀式):(﹡﹡)
①a*(-b+c)
②(A∨B)∧(C∨┑D∧E)
2.写出算术表达式:A+B*(C-D)+E/(C-D)↑N的:(﹡﹡﹡)
①四元式序列;
②三元式序列;
③间接三元式序列
3.写出下面算术表达式E值的语义描述: (﹡﹡)
(1)E→E1+E2
(2)E→0
(3)E→1
4.给出下列表达式的逆波兰表式。(﹡﹡)
(1)a≤b+c∧a>d∨a+b≠e
(2)a=c∧b=d
(3)(a*b-c)**n+b*(a+d/e)
5. 分别写出语句a:=b*-c+b*-c的四元式、三元式和间接三元式的表示。(﹡﹡﹡)
6. 文法及其翻译方案为:
P:=bQb {print: ”1”} Q:=cR{print: ”2”}
Q:=a {print: ”3”} R:=Qad {print: ”4”}
当输入串为bccaadadb 时,该翻译方案的输出是什么?(﹡﹡)
7. 给定文法G :
E:=T+E | T T:=F*T | F F:=i | (E)
则求i+i+(i*i)*i 的逆波兰表示。(﹡﹡)
第六章 符号表的组织和管理
一、多项选择题:
1.符号表的每一项均包含()。(﹡﹡)
A.名字栏 B.类型栏 C.信息栏D.值栏 E.a~d均包含
2.对编译程序所用到的符号表,涉及的操作有( )。(﹡﹡)
?A.填写或更新信息栏内容 B.填入新名 C.给定名字,访问它的有关信息
?D.杂凑技术 E.线性表和排序二叉树
3.源程序中的错误一般有( )。(﹡﹡)
? A.词法错误 B.语法错误 C.语义错误 D.编译错误? E.违反环境限制的错误
二、填空题:
1.符号表中名字栏内容有两种填写方式,它们是 ( ) 填写和 ( ) 填写。(﹡﹡)
2.词法分析阶段的错误主要是 ( ) ,可通过 ( ) 的办法纠正错误。(﹡﹡)
3.符号表中名字的有关信息在 ( ) 和 ( ) 过程中陆续填入。(﹡)
4.在目标代码生成阶段,符号表是 ( ) 的依据。(﹡)
三、简答题:
1.在编译过程中为什么要建立符号表?(﹡﹡)
2. 一个过程的活动记录中一般包含那些数据。(﹡﹡)
第七章 运行时的存储组织与管理
一、多项选择题:
1.下面( )需要在运行阶段分配存储空间。(﹡﹡)
?A.数组 B.指针变量?C.动态数组?D.静态变量 ?E.动态变量
2.栈式动态分配允许( )。(﹡﹡)
?A.递归过程?B.分程序结构?C.动态变量?D.动态数组?E.静态数组
3.动态存储分配可采用的分配方案有( )。(﹡﹡)
?A.队式存储分配?B.栈式存储分配?C.链式存储分配?D.堆式存储分配?E.线性存储分配
4.栈式动态分配与管理因调用而进入过程之后,要做的工作是( )。(﹡﹡)
?A.定义新的活动记录的SP?B.保护返回地址
?C.传递参数值? D.建立DISPLAY表 ?E.定义新的活动记录的TOP
5.静态分配不允许程序出现( )。(﹡﹡)
?A.递归过程?B.静态数组?C.可变体积的数据项目?D.待定性质的名字?E.静态变量
6.活动记录包括( )。(﹡﹡)
?A.局部变量?B.连接数据?C.形式单元?D.局部数组的内情变量?E.临时工作单元
?
第八章 目标代码生成
一、多项选择题:
1.根据优化所涉及的范围,可将优化分为( )。(﹡﹡)
?A.局部优化?B.过程优化?C.全局优化?D.循环优化?E.四元式优化
2.下列优化中,属于循环优化的有( )。(﹡﹡)
?A.强度削弱?B.合并已知量?C.删除无用赋值?D.删除归纳变量?E.代码外提
3.如果a→b是程序流图中的一条边,则由这条回边构成的循环由( )结点组成。(﹡﹡)
?A.a? B.b ?C.有通路到达b的结点
?D.有通路到达a且该通路上不经过b的结点 ?E.有通路到达b且该通路上不经过a的结点?
4.采用无环有向图(DAG),可以实现的优化有( )。(﹡﹡)
?A.合并已知量 ?B.删除公共子表达式?C.强度削弱?D.删除无用赋值 ?E.删除归纳变量
5.编译程序的输出结果可以是( )。(﹡﹡)
?A.目标代码?B.汇编语言代码?C.中间代码?D.优化后的中间代码?E.可重定位代码
二、填空题:
1.局部优化是 ( ) 范围内进行的一种优化。(﹡)
2.在一个基本块内,可实行3种优化方法,即合并已知量、 ( ) 、 ( ) 。(﹡﹡)
3.优化就是对程序进行各种 ( ) 变换,使之能生成更有效的 ( ) 。(﹡)
4.在优化中,可把循环中的 ( ) 提到循环外面去,这种方法称为 ( ) 。(﹡﹡)
东北农业大学网络教育学院
编译原理作业题参考答案
第一章 编译概述
多项选择题:
1.编译程序各阶段的工作都涉及到(BC)。(﹡﹡)
A.语法分析 B.表格管理 C.出错处理D.语义分析E.词法分析
2.编译程序工作时,通常有(ABCE)阶段。?(﹡)
A.词法分析 B.语法分析 C.中间代码生成 D.语义检查 E.目标代码生成
填空题:
1.解释程序和编译程序的区别在于(是否生成目标程序)。(﹡)
2.编译过程通常可分为5个阶段,分别是(词法分析)、(语法分析)、(中间代码生成)、(代码优化)和(目标代码)生成。(﹡)
3.编译程序工作过程中,第一段输入是(源程序),最后阶段的输出为(目标代码生成)程序。(﹡)
4.编译程序是指将(高级语言编写的)程序翻译成(目标语言)程序的程序。(﹡)
综合题:
1.画出编译程序的总体结构图,简述各部分的主要功能。(﹡﹡﹡)
解答:编译程序的总体结构如下图所示:
词法分析程序:输入源程序,进行词法分析,输出单词符号。
语法分析程序:在词法分析的基础上,根据语言的语法规则(方法规则)把单词符号串分解成各类语法单位,并判断输入串是否构成语法上正确的“程序”。
中间代码生成程序:按照语义规则把语法分析程序归约(或推导)出的语法单位翻译成一定形式的中间代码,比如说四元式。
优化程序:对中间代码进行优化处理。
目标代码生成程序:把中间代码翻译成目标语言程序。
表格管理模块保存一系列的表格,登记源程序的各类信息和编译各阶段的进展情况。编译程序各阶段所产生的中间结果都记录在表格中,所需信息多数都需从表格中获取,整个编译过程中都在不断地和表格打交道。
出错处理程序对出现在源程序中的错误进行处理。此外,编译的各个阶段都可能出现错误。出错处理程序对发现的错误都及时进行处理。
第二章 文法和语言的基本知识
多项选择题:
1. ABC 2. ACE 3. BCD 4. AC 5. BC
?填空题:
1.文法中的终结符和非终结符的交集是(空集)。词法分析器交给语法分析器的文法符号一定是(终结符),它一定只出现在产生式的(右)部。(﹡)
2.最左推导是指每次都对句型中的(最左)非终结符进行扩展。(﹡)
3.在语法分析中,最常见的两种方法一定是(自上而上)分析法,另一是(自下而上)分析法。(﹡)
4.采用(自上而下)语法分析时,必须消除文法的左递归。(﹡)
5.(语法)树代表推导过程,(分析)树代表归约过程。(﹡)
6.自下而上分析法采用(移进)、归约、错误处理、(接受)等四种操作。(﹡﹡)
7.Chomsky把文法分为(4)种类型,编译器构造中采用 (2型) 和(3型)文法,它们分别产生(上下文无关语言)和(正规语言)语言,并分别用(下推自动机)和(有限)自动机识别所产生的语言。(﹡﹡)
判断题:?
1.正确 2.错误 3.错误 4.错误 5.错误
6. 错误7.正确 8.正确 9.错误
简答题
1句柄:(﹡)
解答:一个句型的最左直接短语称为该句型的句柄。
2.素短语:(﹡﹡)
解答:至少含有一个终结符的素短语, 并且除它自身之外不再含任何更小的素短语。
3.语法树:(﹡﹡)
解答:满足下面4个条件的树称之为文法G的一棵语法树。
①每一终结均有一标记,此标记为VN∪VT中的一个符号;
②树的根结点以文法G的开始符S标记;
③若一结点至少有一个直接后继,则此结点上的标记为VN中的一个符号;
④若一个以A为标记的结点有K个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,Xk,则A→X1,X2,…,Xk, 必然是G的一个产生式。
4.归约:(﹡﹡)
解答:我们称αγβ直接归约出αAβ,仅当A→γ 是一个产生式, 且α、β∈(VN∪VT)*。归约过程就是从输入串开始,反复用产生式右部的符号替换成产生式左部符号,直至文法开始符。
5.推导:(﹡﹡)
解答:我们称αAβ直接推出αγβ,即αAβTαγβ,仅当A→ γ是一个产生式,且α、β∈(VN∪VT)*。如果α1α2…αn,则我们称这个序列是从α1至α2的一个推导。若存在一个从α1αn的推导,则称α1可推导出αn。推导是归约的逆过程。
问答题
1.给出上下文无关文法的定义。(﹡﹡)
解答:
一个上下文无关文法G是一个四元式(VT,VN,S, P),其中:
●VT是一个非空有限集,它的每个元素称为终结符号;
●VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=Φ;
●S是一个非终结符号,称为开始符号;
●P是一个产生式集合(有限),每个产生式的形式是P→α,其中,P∈VN,α∈(VT∪VN)*。开始符号S至少必须在某个产生式的左部出现一次。
2.文法G:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?(﹡﹡﹡)
解答:
(1)由于产生式左部存在终结符号,且所有产生式左部符号的长度均小于等于产生式右部的符号长度,所以文法G是Chomsky1型文法,即上下文有关文法。
(2)按产生式出现的顺序规定优先级由高到低(否则无法推出句子),我们可以得到:
SabQabc
SaSPQaabQPQaabPQQaabbQQaabbcQ aabbcc
SaSPQaaSPQPQaaabQPQPQaaabPQQPQaaabPQPQQaaaPPQQQaaabbPqqqaaabbQQQaaabbbcQQaaabbbccQaaabbbccc
……
于是得到文法G生成的语言L={anbncn|n≥1}
3.按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。(﹡﹡)
解答:
由L={aibj|j>i≥1}知,所求该语言对应的上下文无关文法首先应有S→aSb型产生式,以保证b的个数不少于a的个数;其次,还需有S→Sb或S→bS型的产生式,用以保证b的个数多于a的个数;也即所求上下文无关文法G为:
G:S→aSb|Sb|b
4.有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)写出句子acabcbbdcc的最左推导过程。(﹡﹡﹡)
解答:
(1)分别画出对应两句型的语法树,如下图所示
句柄:AaB Bd
图 语法树
(2)句子acabcbbdcc的最左推导如下:
STaAcBaAaBcBacaBcBacabcBacabcbScAacabcbBdcAacabcbbdcAacabcbbdcc
5.对于文法G:
S→(L)|aS|a
L→L, S|S
(1)画出句型(S,(a))的语法树。
(2)写出上述句型的所有短语、直接短语、句柄和素短语。(﹡﹡﹡)
解答:
(1)句型(S,(a))的语法树如下图所示。
图 句型(S,(a))的语法树
(2)由上图可知:
①短语:S、a、(a)、S,(a)、(S,(a));
②直接短语:a、S;
③句柄:S;
④素短语:素短语可由图2-8-3中相邻终结符之间的优先关系求得,即;
因此素短语为a。
6. 考虑文法G,其产生式如下:
S→(L)|a
L→L,S|S
(a)试指出此文法的终结符号、非终结符号。
(b)给出句子(a,(a,a))的分析树。
(c)构造句子(a,(a,a))的一个最左推导。
(d)构造句子(a,(a,a))的一个最右推导。
(e)这个文法生成的语言是什么?(﹡﹡)
解答:(a) 终结符号为:{(,),a,,,}
??? 非终结符号为:{S,L}
??? 开始符号为:S
(b)分析树
(c)??? S (L) (L,S) (S,S) (a,S) (a,(L) (a,(L,S))
??? ? (a,(S,S)) (a,(a,S)) (a,(a,a))
(d) S (L) (L,S) (L,(L)) (L,(L,S)) (L,(L,a))
??? ? (L,(S,a)) (L,(a,a)) (S,(a,a)) (a,(a,a))
(e) L(G) = (α1,α2,...,αn)或a
??? 其中αi(1≤i≤n)是L(G)。即L(G)产生一个以a为原子的纯表,但不包括空表。
7.考虑文法G:
T→T*F|F
F→F↑P|P
P→(T)|i
证明T*P↑(T*F)是该文法的一个句型,并指出直接短语和句柄。(﹡﹡)
解答:
首先构造T*P↑(T*F)的语法树如下图所示。
图 句型T*P↑(T*F)的语法树
由上图可知,T*P↑(T*F)是文法G的一个句型。
直接短语有两个,即P和T*F;句柄为P。
8.试描述下列文法产生的语言L(G)(﹡﹡)
S→10S0|aA
A→bA|a
解答:L(G)={(10)iabna0i n≥0 i≥0}
9.已知语言L(G)={abnc |n≥1} 试对该语言构造相应文法。(﹡﹡)
解答:G:
Z→aBC
B→Bb|b
10.证明下列文法的二义性 (﹡﹡﹡)
1.G 2.G
Z→aZbZ|aZ|a S→AB
A→bB|bC|ba
B→Sb|ba|a
C→Bb|b
解答:(1)
对于句子aaaba,画出二棵不同的语法树,因而是二义的。
(2)
G
对于句子baba,画出二棵不同的语法树,因而是二义的。
11.有文法G:S→iSeS|iS|i
该文法是否是二义的。试证明之。(﹡﹡)
解答:
对于句子iiiei,有两棵不同的语法树,故文法是二义的。
12.文法G:T→aR,R→Tb|d生成的语言是什么?G是否为3型文法?(﹡﹡)
解答:
不是3型文法。
13.试写出能够描述下列电话号码格式的文法。(﹡﹡)
67391742
010-67391742
(010)67391742
解答: 文法产生式规则如下:
<电话号码> →<局代码> <本机码>
<电话号码> →<区前缀> <局代码> <本机码>
<区前缀> →<地区码>‘-’
<区前缀> → ‘(’<地区码>‘)’
<地区码> →DIG DIG
<地区码> →DIG DIG DIG
<局代码> →DIG DIG DIG DIG
<本机码> →DIG DIG DIG DIG
试构造生成语言的上下文无关文法。(﹡﹡﹡)
(1) { anbnci | n≥1,i≥0 }
(2) { w | w∈{a,b}+,且w中a的个数恰好比b多1 }
解答:(1)把anbnci分成anbn和ci两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:
S → AB
A → aAb|ab
B → cB|ε
(2)令S为开始符号,产生的w中a的个数恰好比b多一个,令E为一个非终结符号,产生含相同个数的a和b的所有串,则产生式如下:
S → aE|Ea|bSS|SbS|SSb
E → aEbE|bEaE|ε
下面的二义性文法描述命题演算公式,为它写一个等价的非二义性文法。G:S -> S AND S |S OR S | NOT S | p | q | (S) (﹡﹡)
解答:G:
S -> S AND A | A
A -> A OR B | B
B -> NOT B |p | q | (S)
16. 对于下列语言分别写出它们的正规表达式。 (﹡﹡)
(1)?英文字母组成的所有符号串,要求符号串中顺序包含五个元音。
(2)?英文字母组成的所有符号串,要求符号串中的字母依照词典顺序排列。
解答:(1)?令Letter表示除这五个元音外的其它字母。
((letter)*A(letter)*E(letter)*I(letter)*O(letter)*U(letter))*
(2)?A*B*....Z*
第三章 词法分析与有穷自动机
多项选择题:
1. ACE 2. ABD
填空题:
1.确定有限自动机DFA是( NFA )的一个特例。(﹡)
2.若二个正规式所表示的( 正规集 )相同,则认为二者是等价的。(﹡)
3.一个字集是正规的,当且仅当它可由( DFA/NFA)所 (识别) 。(﹡)
判断题:
1. 错误 2.错误 3. 错误 4.正确 5.正确
6.正确 7.正确 8.正确 9.错误 10.正确
综合题:
1.设M=({x,y}, {a,b}, f,x,{y})为一非确定的有限自动机,其中f定义如下:
f(x,a)={x,y} f(a,b)={y}
f(y,a)=φ f(y,b)={x,y}
试构造相应的确定有限自动机M′。(﹡﹡)
解答:对照自动机的定义M=(S,Σ,f,S0,Z), 由f的定义可知f(x,a)、f(y,b)均为多值函数,所以是一非确定有限自动机,先画出NFAM相应的状态图,如图下所示。
图 NFAM
用子集法构造状态转换矩阵下表所示。
将转换矩阵中的所有子集重新命名而形成下表所示的状态转换矩阵。
表状态转换矩阵
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其状态转换图如下图所示。
将上图的DFAM′ 最小化。首先,将M′的状态分成终态组{1,2}与非终态组{0};其次,考察{1,2}。由于{1,2}a={1,2}b={2}{1,2}, 所以不再将其划分了,也即整个划分只有两组{0},{1,2}:令状态1代表{1,2},即把原来到达2的弧都导向1,并删除状态2。 最后,得到如下图所示化简DFAM′。
图 化简后的DFAM′
2.对给定正规式b*(d|ad)(b|ab)+,构造其NFAM。(﹡﹡)
解答:首先用A+=AA*改造正规式得:b*(d|ad)(b|ab)(b|ab)*; 其次,构造该正规式的NFAM,如下图所示。
图 NFAM
3.字母表{a,b}上的正规式R=(ba|a)*,构造R的相应DFA。(﹡﹡)
解答:
I
Ia
Ib
x1y
1y
2
1y
1y
2
2
1y
?
I
Ia
Ib
1
2
3
2
2
3
3
2
?
4.请写出在∑=(a,b)上,不是a开头的,但以aa结尾的字符串集合的正规表达式,并构造与之等价状态最少的DFA。(﹡﹡﹡)
解答:根据题意,不以a开头就意味着以b开头,且以aa结尾的正规式为:b(a|b)* aa
根将图1所示的NFA确定化,如图2所示。
NFA将图1所示的NFA确定化,如图
从图2可知已为最简状态,由于开始状态0只能输入字符b而不能与状态1合并,而状态2和状态3面对输入符号的下一状态相同,但两者一为非终态、一为终态,故也不有合并,故图2所示的状态转换矩阵已是最简的DFA,如图3所示据正规式画出NFA,如图1所示。
图2 状态转换矩阵
图3 最简DFA
人运狼、羊、菜过河,一次运一件,不让羊吃掉菜,也不让狼吃掉羊,画出渡河的状态转换图。可否将其抽象为一个有限自动机。(﹡﹡﹡)
解答:先写出渡河的方法,串中对象顺序为人来回渡河时所运的货物的顺序:
①羊空菜羊狼空羊
②羊空狼羊菜空羊
现给出一个NFA:
M=(Σ,Q,0,{9},δ)
其中Σ={羊,空,菜,狼}
Q={0,1,2,3,4,5,6,7,8,9}
转形函数
δ(0,羊)=1,??δ(1,空)=2,??δ(2,菜)=3,??δ(2,狼)=5
δ(3,羊)=4,??δ(5,羊)=6,??δ(4,狼)=7,??δ(6,菜)=7
δ(7,空)=8,??δ(8,羊)=9
6.对于正规表达式 (a|b)*a(a|b) 构造最小状态的DFA。(﹡﹡)
解答:①NFA M:
②DFA M:
③化简: ??②中的DFA M中没有等价状态,因此为最小化的DFA M。
第四章 语法分析
多项选择题:
1. AD 2. CE 3. ACDE 4. CE 5. ABCE 6. ACDE
填空题:
1.对于一个文法,如果能够构造 (LR(0)文法) 。使得它的 (每个入口) 均是唯一确定的,则称该文法为LR文法。(﹡)
2.字的前缀是指该字的 (任意首部) 。(﹡)
3.活前缀是指 (规范句型) 的一个前缀,这种前缀不含 (句柄) 之后的任何符号。(﹡)
4.在LR分析过程中,只要 (输入串) 的已扫描部分保持可归约成一个 (活前缀) ,则扫描过的部分正确。(﹡)
5.将识别 (活前缀) 的NFA确定化,使其成为以 (项目集合) 为状态的DFA,这个DFA就是建立 (LR分析算法) 的基础。(﹡﹡)
6.A→α·称为 (归约) 项目;对文法开始符S′→α·为 (接受) 项目;若a为终结符,则称A→α·aβ为 (移进) 项目;若B为非终结符,则称A→α·aβ为 (待约) 项目。(﹡﹡)
7.LR(0)分析法的名字中“L”表示 (自左至右分析) ,“R”表示 (采用最右推导的逆过程即最左归约) ,“0”表示 (向右查看0个字符) 。(﹡﹡)
判断题:
1.正确
简答题:
综合题:
1.构造下面文法的LL(1)分析表。(﹡﹡﹡)
D→TL
T→int | real
L→id R
R→, id R | ε
解答:LL(1)分析表见下表。
分析 虽然这个文法很简单,我们还是从求开始符号集合和后继符号集合开始。
FIRST(D)=FIRST(T)={int, real} FOLLOW(D)=FOLLOW(L)
={#}
FIRST(L)={id} FOLLOW(T)={id}
FIRST(R)={,, ε} FOLLOW(R)={#}
有了上面每个非终结符的FIRST集合,填分析表时要计算一个产生式右部α的FIRST(α)就不是件难事了。
填表时唯一要小心的时,ε是产生式R→ε右部的一个开始符号,而#在FOLLOW(R)中,所以R→ε填在输入符号#的栏目中。
表 LL(1)分析表
2.下面文法G是否为LL(1)文法?说明理由。(﹡﹡)
S→AB|PQx A→xy B→bc
P→dP|ε Q→aQ|ε
解答:该文法不是LL(1)文法,见下面分析中的说明。
分析 只有三个非终结符有两个选择。
(1)P的两个右部dP和ε的开始符号肯定不相交。
(2)Q的两个右部aQ和ε的开始符号肯定不相交。
(3)对S来说,由于x∈FIRST(AB),同时也有x∈FIRST(PQx)(因为P和Q都可能为空)。所以该文法不是LL(1)文法。
3.设有以下文法:(﹡﹡﹡)
G:S→aAbDe|d
A→BSD|e
B→SAc|cD|ε
D→Se|ε
(1)求出该文法的每一个非终结符U的FOLLOW集。
(2)该文法是LL(1)文法吗?
(3)构造C的LL(1)分析表。
解答:(1)求文法的每一个非终结符U的FOLLOW集的过程如下:
因为:
①S是识别符号,且有A→BSD、B→SAc、D→Se,所以FOLLOW(S)应包含
FIRST(D)∪FIRST(Ac) ∪FIRST(e) ∪{#}
={a,d}∪{a,d,c,e}∪{e}∪{#}
={a,c,d,e#}
②又因为A→BSD和D→ε,所以FOLLOW中还包含FOLLOW(A)。
因为S→aAbDe和B→SAc,所以
FOLLOW(A)=FIRST(bDe)∪FIRST(c)={b,c}
综合①、②得FOLLOW(S)={a,d,c,e,#}∪{a,b,c,d,e,#}
因为A→BSD,所以 FOLLOW(B)=FIRST(SD)={a,d}
因为S→aAbDe | d、A→BSD| e和B→SAc | cD,所以
FOLLOW(D)=FIRST(e)∪FOLLOW(A)∪FOLLOW(B)
={e}∪{b,c}∪{a,d}={a,b,c,d,e}
(2)G不是LL(1)文法。
因为产生式B→SAc|cD|ε中
FIRST(SAc)∩FOLLOW(B)={a,d}≠
(3)构造G的LL(1)分析表。
按照LL(1)分析表的构造算法构造方法G的LL(1)分析表如下表所示。
表 G的LL(1)分析表
4.将文法G改造成为LL(1)的。(﹡﹡﹡)
G:V→N|N
E→V|V+E
N→i
解答:对文法G提取公共左因子后得到文法:
G′:V→NA
A→ε|
E→VB
B→ε|+E
N→i
求出文法G′中每一个非终结符号的FIRST集:
FIRST(V)={i} FIRST(A)={[,ε}
FIRST(E)={i} FIRST(B)={+,ε}
FIRST(N)={i}
求出文法G′中每一个非终结符号的FOLLOW集:
FOLLOW(V)={#}∪FIRST(B)\{ε}∪FOLLOW(E)={#,+,]}
FOLLOW(A)= FOLLOW(V)={+,,#}
FOLLOW(E)= FIRST(])\{ε}∪FOLLOW(B)= FIRST(])\{ε}∪FOLLOW(E)={]}
FOLLOW(B)= FOLLOW(E)={ ]}
FOLLOW(N)= FIRST(A)\{ε}∪FOLLOW(V)={[,],+,#}
可以看到,对文法G′的产生式A→ε|,有
FIRST()∩FOLLOW(A)={[}∩{+,],#}=
对产生式B→ε|+E,有
FIRST(+E)∩FOLLOW(B)={+}∩{]}=
而文法的其他产生式都只有一个不为ε的右部,所以文法G′是LL(1)文法。
5.已知文法:(﹡﹡﹡)
G: A→aAa|ε
(1)该文法是LL(1)文法吗?为什么?
(2)若采用LL(1)方法进行语法分析,如何得到该文法的LL(1)分析表?
(3)若输入符号串“aaaa”,请给出语法分析过程。
解答:(1)因为产生式A→aAa|ε有空产生式右部,而
FOLLOW(A)={#}∪FIRST(a)={a, #}
造成FIRST(A)∩FOLLOW(A)={A,ε}∩{a, #}≠
所以该文法不是LL(1)文法。
(2)若采用LL(1)方法进行语法分析,必须修改该文法。
因该文法产生偶数(可以为0)个a,所以得到文法
G′:A→aaA|ε
此时对产生式A→aaA|ε,有FOLLOW(A)={#}∪FOLLOW(A)={#},因而
FIRST(A)∩FOLLOW(A)={a,ε}∩{#}=
所以文法G′是LL(1)文法, 按LL(1)分析表构造算法构造该文法的LL(1)分析表如下表所示。
表 文法G′的LL(1)分析表
(3)若采用LL(1)方法进行语法分析, 对符号串“aaaa”的分析过程如下表所示。
表 对符号串“aaaa”的分析过程
6.设有文法G为:(﹡﹡﹡)
S→a|b|(A)
A→SdA|S
(1)完成下列算符优先关系表,见下表,并判断G是否为算符优先文法。
表 算符优先关系表
(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语。
(3)给出输入串(adb)#的分析过程。
解答:(1)先求文法G的FIRSTVT集和LASTVT集:
由S→a|b|(A)得:FIRSTVT(S)={a,b,( );
由A→Sd…得:FIRSTVT(A)={d};又由A→S…得:FIRSTVT(S)FIRSTVT(A),即FIRSTVT(A)={d,a,b,(};
由S→a|b|(A)得;LASTVT(S)={a,b,}};
由A→…dA得:LASTVT(A)={d},又由A→S得:LASTVT(S) LASTVT(A),即LASTVT(A)={d,a,b,)}。
构造优先关系表方法如下:
①对P→…ab…,或P→…aQb…,有ab;
②对P→…aR…,而b∈FIRSTVT(R),有ab;
③对P→…Rb…,而a∈FIRSTVT(R),有ab。
由此得到:
①由S→(A)得:();
②由S→(A…得:(FIRSTVT(A),即:(d,(a,(b,((;由A→…dA得:dFIRSTVT(A),即:dd,da,db,d(;
③ 由S→A)得,LASTVT(A)),即:d),a),b),));由A→Sd…得:LASTVT(S)d,即:ad,bd,)d;
此外,由#S#得:##;
由#FIRSTVT(S)得:#a,#b,#(;由LASTVT(S)#得: d#,a#,b#,)#。
最后得到算符优先关系表,见下表。
表 算符优先关系表
由上表可以看出,任何两个终结符之间至少只满足、、三种优先关系之一,故G为算符优先文法。
(2)为求出句型(SdSdS)的短语、简单短语、句柄,我们先画出该句型对应的语法树,如下图所示。由图得到:
短语:S,SdS,SdSdS,(SdSdS)
简单短语(即直接短语):S
句柄(即最左直接短语):S
素短语:SdS,它同时也是该句型的最左素短语。
图 句型(SdSdS)的语法树
(3)输入串(adb)#的分析过程见下表。
表 输入串(adb)#的分析过程
7.设有文法G为:(﹡﹡﹡)
S→a|b|(A)
A→SdA|S
(1)完成下列算符优先关系表,见下表,并判断G是否为算符优先文法。
表 算符优先关系表
(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语。
(3)给出输入串(adb)#的分析过程。
解答:(1)先求文法G的FIRSTVT集和LASTVT集:
由S→a|b|(A)得:FIRSTVT(S)={a,b,( );
由A→Sd…得:FIRSTVT(A)={d};又由A→S…得:FIRSTVT(S)FIRSTVT(A),即FIRSTVT(A)={d,a,b,(};
由S→a|b|(A)得;LASTVT(S)={a,b,}};
由A→…dA得:LASTVT(A)={d},又由A→S得:LASTVT(S) LASTVT(A),即LASTVT(A)={d,a,b,)}。
构造优先关系表方法如下:
①对P→…ab…,或P→…aQb…,有ab;
②对P→…aR…,而b∈FIRSTVT(R),有ab;
③对P→…Rb…,而a∈FIRSTVT(R),有ab。
由此得到:
①由S→(A)得:();
②由S→(A…得:(FIRSTVT(A),即:(d,(a,(b,((;由A→…dA得:dFIRSTVT(A),即:dd,da,db,d(;
③ 由S→A)得,LASTVT(A)),即:d),a),b),));由A→Sd…得:LASTVT(S)d,即:ad,bd,)d;
此外,由#S#得:##;
由#FIRSTVT(S)得:#a,#b,#(;由LASTVT(S)#得: d#,a#,b#,)#。
最后得到算符优先关系表,见下表。
表 算符优先关系表
由上表可以看出,任何两个终结符之间至少只满足、、三种优先关系之一,故G为算符优先文法。
(2)为求出句型(SdSdS)的短语、简单短语、句柄,我们先画出该句型对应的语法树,如下图所示。由图得到:
短语:S,SdS,SdSdS,(SdSdS)
简单短语(即直接短语):S
句柄(即最左直接短语):S
素短语:SdS,它同时也是该句型的最左素短语。
图 句型(SdSdS)的语法树
(3)输入串(adb)#的分析过程见下表。
表 输入串(adb)#的分析过程
8.对于文法G: S→AS|b
A→SA|a
(1)列出所有LR(0)项目;
(2)列出构成文法LR(0)项目集规范族。(﹡﹡﹡)
解答:首先将文法G拓广为G:
S′→S
S→AS|b
A→SA|a
(1)文法G的LR(0)项目是:
1.S′→·S 5.S→AS· 9.A→S·A
2.S′→S· 6.S→·b 10.A→SA·
3.S→·AS 7.S→b· 11.A→·a
4.S→A·S 8.A→·SA 12.A→a·
(2)用ε-CLOSURE(闭包)办法构造文法G′的LR(0)项目集规范族如下:
I0:1.S′→·S I3:9.A→S·A I6:12.A→a·
3.S→·AS 8.A→·SA I7: 7.S→b·
8.A→·SA 3.S→·AS
11.A→·a 6.S→·b
6.S→·b 11.A→·a
I1:2.S′→S· I4:10.A→SA·
9.A→S·A 4.S→A·S
8.A→·SA 3.S→·AS
11.A→·a 6.S→·b
3.S→·AS 8.A→·SA
6.S→·b 11.A→·a
I2:4.S→A·S I5: 5.S→AS·
3.S→·AS 9.A→S·A
6.S→·b 8.A→·SA
8.A→·SA 11.A→·a
11.A→·a 3.S→·AS
6.S→·b
注意:I1中的S′→S·和A→·SA是由状态I0中的1和3读入一个S字符后得到的下一个项目;,而I4中的A→SA和A→A·S则是由I3中的9和3读入一个A字符后得到的下一个项目;I5中的S→AS·和A→S·A 则是由I4中的4和8读入一个S字符后得到的下一个项目。
状态全体构成了文法G′的LR(0)规范族。
9.有文法G
S→a|∧|(T)
T→T,S|S 该文法是否是LL(1)文法,若不是,请进行改写。并给出它的分析表。(﹡﹡﹡)
解答:不是。
T→ST'
T'→T,S|S
FIRST(S)=FIRST(T)={a,∧,(}
FIRST(T')={,,ε}
FOLLOW(S)={#,,,)}
FOLLOW(T')=FOLLOW(T)={ )}
分析表如下:
10.有文法G
(1)S→A
(2)S→B
(3)A→aAb
(4)A→c
(5)B→aBb
(6)B→d
试构造相应的LR(0)项目集规范族及相应的分析表。(﹡﹡﹡)
解答:
11. 已知文法G,其产生式如下:
????????S→(L)|a ???L→ L,S|S
????从G中消除左递归,并为之构造一个非递归预测分析器LL(1)分析表。请说明在句子(a,(a,a))上的分析器的动作。 (﹡﹡﹡)
答:
将所给文法消除左递归得G':
????????S →(L)|a
????????L → SL'
????????L'→ ,SL' | ε
实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:
根据文法G'有
FIRST(s) = { ( , a )
FOLLOW(S) = { ) , ', ' , $ }
FIRST(L) = { ( , a )
FOLLOW(L) = { ) }
FIRST(L’) = { ', ' }
FOLLOW(L’) = { ) }
按以上结果,构造预测分析表M如下:
文法G’是LL(1)的,因为它的LL(1)分析表不含多重定义入口。
预测分析器对输入符号串(a, (a, a))做出的分析动作如下:
12. 证明下面文法是SLR(1)文法,并构造其SLR分析表。
?????E→E+T|T ????????T→TF|F ????????F→F*|a|b(﹡﹡﹡)
答:
该文法的拓广文法G'为
(0) E' → E
(1) E → E+T
(2) E → T
(3) T → TF
(4) T → F
(5) F → F*
(6) F → a
(7) F → b
其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:
I0 = {E'→·E, E→·E+T, E→·T, T→·TF, T→·F, F→·F*,
????????F→·a, F→·b}
I1 = {E'→E·, E→E·+T}
I2 = {E→T·, T→T·F, F→·F*, F→·a, F→·b}
I3 = {T→F·, F→F·*}
I4 = {F→a·}
I5 = {F→b·}
I6 = {E→E+·T, T→·TF, T→·F, F→·F*, F→·a, F→·b}
I7 = {T→TF·, F→F·*}
I8 = {F→F*·}
I9 = {E→E+T·, T→T·F, F→·F*, F→·a, F→·b}
求FOLLOW集:
????FOLLOW(E)={+, $}
????FOLLOW(T)={+, $, a, b}
????FOLLOW(F)={+, $, a, b, *}
构造的SLR分析表如下:
显然,此分析表无多重定义入口,所以此文法是SLR文法
第五章语法制导翻译技术和中间代码生成
多项选择题:
1. ACDE2. BCD 3. BC 4. BD 5. BCE
填空题:
1.中间代码有 (逆波兰记号)、(树形表示)、(三元式)、(四元式) 等形式,生成中间代码主要是为了使 (目标代码的优化容易实现) 。(﹡)
2.语法制导翻译既可以用来产生 (中间) 代码,也可以用来产生 (目标) 指令,甚至可用来对输入串进行 (解释执行) 。(﹡)
3.当源程序中的标号出现“先引用后定义”时,中间代码的转移地址须持 (标号定义) 时才能确定,因而要进行 (回填) 。(﹡)
4.文法符号的属性有两种,一种称为 (继承属性) ,另一种称为 (综合属性) 。(﹡﹡)
5.后缀式abc-/所代表的表达式是( a/(b-c) ),表达式(a-b)*c可用后缀式( ab-c* )表示。(﹡﹡)
6.用一张 (间接码表) 辅以 (三元式表) 的办法来表示中间代码,这种表示法称为间接三元式。(﹡﹡)
问答题:
1.给出下列表达式的逆波兰表示(后缀式):(﹡﹡)
①a*(-b+c)
②(A∨B)∧(C∨┑D∧E)
解答:.①ab@c+*;
②AB∨CD┑E∧∨∧
2.写出算术表达式:A+B*(C-D)+E/(C-D)↑N的:(﹡﹡﹡)
①四元式序列;
②三元式序列;
③间接三元式序列
解答:
3.写出下面算术表达式E值的语义描述: (﹡﹡)
(1)E→E1+E2
(2)E→0
(3)E→1
解答:
E.Val:=E'.Val‘+’E2.Val
E.Val:=‘0’
E.Val:=‘1’
4.给出下列表达式的逆波兰表式。(﹡﹡)
(1)a≤b+c∧a>d∨a+b≠e
(2)a=c∧b=d
(3)(a*b-c)**n+b*(a+d/e)
解答:
(1)abc+≤ad>∧ab+e≠∨
(2)ac=bd=∧
(3)ab*c-n**bade/+*+
5. 分别写出语句a:=b*-c+b*-c的四元式、三元式和间接三元式的表示。(﹡﹡﹡)
解答:
三地址语句的四元式表示
op
Arg1
Arg2
Result
(0)
(1)
(2)
(3)
(4)
(5)
uminus
*
uminus
*
+
assign
c
b
c
b
t2
t5
t1
t3
t4
t1
t2
t3
t4
t5
a
三地址语句的三元式表示
op
Arg1
Arg2
(0)
(1)
(2)
(3)
(4)
(5)
uminus
*
uminus
*
+
assign
c
b
c
b
(1)
a
(0)
(2)
(3)
(4)
三地址语句的间接三元式表示
(0)
(1)
(2)
(3)
(4)
(5)
(14)
(15)
(16)
(17)
(18)
(19)
op
Arg1
Arg2
(14)
(15)
(16)
(17)
(18)
(19)
uminus
*
uminus
*
+
assign
c
b
c
b
(15)
a
(14)
(16)
(17)
(18)
6. 文法及其翻译方案为:
P:=bQb {print: ”1”} Q:=cR{print: ”2”}
Q:=a {print: ”3”} R:=Qad {print: ”4”}
当输入串为bccaadadb 时,该翻译方案的输出是什么?(﹡﹡)
答:342421
7. 给定文法G :
E:=T+E | T T:=F*T | F F:=i | (E)
则求i+i+(i*i)*i 的逆波兰表示。(﹡﹡)
解答:iiii*i*++
第六章 符号表的组织和管理
多项选择题:
1. AC 2. ABC 3. ABCE
填空题:
1.符号表中名字栏内容有两种填写方式,它们是 (标识符) 填写和 (标识符地址及长度) 填写。2.词法分析阶段的错误主要是 (拼写错误) ,可通过 (最小距离匹配) 的办法纠正错误。(﹡﹡)
3.符号表中名字的有关信息在 (词法分析) 和 (语法语义分析) 过程中陆续填入。(﹡)
4.在目标代码生成阶段,符号表是 (地址分配) 的依据。(﹡)
简答题:
1.在编译过程中为什么要建立符号表?(﹡﹡)
解答:在编译过程中始终要涉及到对一些语法符号的处理,这就需要用到语法符号的相关属性。为了在需要时能找到这些语法成分及其相关属性,就必须使用一些表格来保存这些语法成分及其属性,这些表格就是符号表。
2. 一个过程的活动记录中一般包含那些数据。(﹡﹡)
解答: 控制链:指向调用过程活动的活动记录。
访问链:指向本活动要访问的非局部数据所在的活动记录。
保存机器状态:调用过程活动在调用点的机器状态,包括计数器,各种寄存器的值。
局部数据:过程中定义的局部量。
临时变量:编译产生的临时变量。
第七章 运行时的存储组织与管理
多项选择题:
1. CE 2. ABDE3. BD4. ABDE5. ACD6. ABCDE
第八章 目标代码生成
多项选择题:
1. ACD 2. ABE 3. ABD 4. ABD 5. BCDE
填空题:
1.局部优化是 (基本块) 范围内进行的一种优化。(﹡)
2.在一个基本块内,可实行3种优化方法,即合并已知量、 (删除无用赋值) 、 (删除多余运算) 。
3.优化就是对程序进行各种 (等价) 变换,使之能生成更有效的 (目标代码) 。(﹡)
4.在优化中,可把循环中的 (不变运算) 提到循环外面去,这种方法称为 (代码外提) 。(﹡﹡)
页:
[1]