编译原理 作业标准答案
编译原理附标准答案五
练习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;
编译原理 全部参考答案
第二章
P-36-6
(1)L(G)是0~9组成的数字串;
(2)最左推导:
N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒01DD⇒012D⇒0127
N⇒ND⇒DD⇒3D⇒34
N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568
最右推导:
N⇒ND⇒N7⇒ND7⇒N27⇒ND27⇒N127⇒D127⇒0127
N⇒ND⇒N4⇒D4⇒34
N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568
P-36-7
G(S):(没有考虑正负符号问题)
S→P|AP
P→1|3|5|7|9
A→AD|N
N→2|4|6|8|P
D→0|N
或者:(1)S→ABC|C
A→1|2|3|4|5|6|7|8|9
B→BA|B0|ε
C→1|3|5|7|9
P-36-8
G(E):E→T|E+T|E-T
T→F|T*F|T/F
F→(E)|i
最左推导:
E⇒E+T⇒T+T⇒F+T⇒i+T⇒i+T*F⇒i+F*F⇒i+i*F⇒i+i*i
E⇒T⇒T*F⇒F*F⇒i*F⇒i*(E)⇒i*(E+T)⇒i*(T+T)⇒i*(F+T)⇒i*(i+T)⇒i*(i+F)⇒i*(i+i)最右推导:
E⇒E+T⇒E+T*F⇒E+T*i⇒E+F*i⇒E+i*i⇒T+i*i⇒F+i*i⇒i+i*i
E⇒T⇒T*F⇒T*(E)⇒T*(E+T)⇒T*(E+F)⇒T*(E+i)⇒T*(T+i)⇒T*(F+i)⇒T*(i+i)
⇒F*(i+i)⇒i*(i+i)
语法树:
S
i
S
e
S
i
S
i
i
S
i
S i S e
S i
i
P-36-9
句子:iiiei 有两个语法树: S ⇒iSeS ⇒iSei ⇒iiSei ⇒iiiei S ⇒iS ⇒iiSeS ⇒iiSei ⇒iiiei
编译原理自测一二三及答案
编译原理自测一
一、是非题(下列各题,你认为正确的,请在题干的括号内打“√”,错的打“×”。每题1
分,共5分)
1、算符优先关系表不一定存在对应的优先函数。正确
2、数组元素的地址计算与数组的存储方式有关。.正确
3、仅考虑一个基本块,不能确定一个赋值是否真是无用的。正确
4、每个文法都能改写为LL(1)文法。不正确
5、对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。不正确
二、填空题
1、从功能上说,程序语言的语句大体可分为(执行性)语句和(说明性)语句两大类。
2、扫描器的任务是从(源程序)中识别出一个个(单词符号)。
3、所谓最右推导是指:(任何一步αβ都是对α中最右非终结符进行替换的)。
4、语法分析最常用的两类方法是(自上而下)和(自下而上)分析法。
5、一个上下文无关文法所含四个组成部分是(一组终结符号,一组非终结符号、一
个开始符号、一组产生式)。
6、所谓语法制导翻译方法是(为每个产生式配上一个翻译子程序,并在语法分析的
同时执行这些子程序)。
7、符号表中的信息栏中登记了每个名字的有关的性质,如(类型、种属、?)等
等。
8、一个过程相应的DISPLAY表的内容为(现行活动记录)。
9、常用的两种动态存贮分配办法是(栈式)动态分配和(堆式)动态分配。
10、产生式是用于定义(语法范畴)的一种书写规则。
三、名词解释
1.遍--指编译程序对源程序或中间代码程序从头到尾扫描一次。
2.无环路有向图(DAG)--如果有向图中任一通路都不是环路,则称庐有向图为无环路有向图,简称DAG。
3.语法分析--按文法的产生式识别输入的符号串是否为一个句子的分析过程。
编译原理第8章作业及习题参考答案
第八章 语法制导翻译和中间代码生成
1.给出下面表达式的逆波兰表示(后缀式): (1) a*(-b+c)
(4) (A ∧B) ∨(⌝C ∨ D)
(7) if(x+y)*z=0 then s ∶=(a+b)*c else s ∶=a*b*c
解(1) ab-c+*
(4) AB ∧C ⌝D ∨∨
(7) xy+z*0=sab+c*:=sab*c*:=¥(注:¥表示if-then-else 运算)
2. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。 答案:三元式
(1) (+ a, b) (2) (+ c, d)
(3) (* (1), (2)) (4) (- (3), /) (5) (+ a, b)
(6) (+,(5),c) (7) (- (4), (6)) 间接三元式
间接三元式序列 间接码表 (1) (+ a, b) (1) (2) (+ c, d) (2) (3) (* (1), (2)) (3) (4) (- (3), /) (4)
¥
= :=
*
:=
+ x
y
z
s +
c
x
a b
s
* c
*
a b
(5) (- (4), (1)) (1)
(6) (- (4), (5)) (5)
(6)
四元式
(1) (+, a, b, t1) (2) (+, c, d, t2) (3) (*, t1, t2, t3) (4) (-, t3, /, t4)
(5) (+, a, b, t5) (6) (+, t5, c, t6) (6) (-, t4, t6, t7)
3. 采用语法制导翻译思想,表达式E 的"值"的描述如下: 产生式 语义动作
编译原理作业与答案
编译原理作业与答案
编译原理独⽴作业
2010.5
⼀、简答题
1、构造⼀个⽂法使其⽣成的语⾔是不允许0打头的偶正整数集合。
2、⽂法][E G :T
T E T E E
-+→,F
F T F T T
/*→,i E F )(→,构造句型i T T T
*+-的
语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。
3、某LL(1)⽂法的预测分析表如下,请在下述分析过程表中填⼊输⼊串( a , a )$ 的分
析过程。
分析过程表:
4、⽂法][S G :R
L S
=→,R S →,R L *→,i L →,L R →,求增⼴⽂法中LR(1)
项⽬集的初态项⽬集I 0。 5、⽂法][S G :G
G S S ;→,()G G t H →,)(S a H →,求出各⾮终结符的FISTVT 和LASTVT
集合。
⼆、分析题:
1、构造⾃动机,使得它能识别字母表{0,1}上以00结尾的符号串,将构造的⾃动机确定化,并写出相应的正规⽂法。
2、⽂法][S G :RT eT S →εDR T →εdR R → bd a D →,写出每个⾮终结符的FIRST 集和FOLLOW 集,并判断该⽂法是否为LL(1)⽂法。
3、若有⽂法][S G :AB S →εaBa A →εb A b B → (1)试证明该⽂法是SLR(1) ⽂法,并构造SLR(1)分析表。(2)给出输⼊串aa # 的分析过程。
参考答案
⼀、简答题
1、构造⼀个⽂法使其⽣成的语⾔是不允许0打头的偶正整数集合。
8|6|4|2|ABC Z → 9|8|7|6|5|4|3|2|1→A ε
编译原理作业参考答案
1(01)*101
1(01)*1 0 1
11 0 1
01
0
11 0 1
1
(2)构造转换矩阵
I
I0
I1
{X}①
{1, 2, 3}②
{1, 2, 3}②
{2, 3}③
{2, 3, 4}④
{2, 3}③
{2, 3}③
{2, 3, 4}④
{2, 3, 4}④
{2, 3, 5}⑤
{2,百度文库3, 4}④
(2)
最左推导:NNDDD3D34
NNDNDDDDD5DD56D568
最右推导:NNDN4D434
NNDN8ND8N68D68568
2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。
答:
SCAB|B(考虑了正负号)
A1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 |
③根据DFA M’的转换矩阵画出对应的状态转换图:
(3)最小化:
①首先将其划分成终态集{2,3}和非终态集{1}
②{2,3}a={2}{2,3},{2,3}b={2}{2,3}
因此{2,3}已是不可再区分的,所以该DFA M’已是最小化的。
2.(P64,7(1))构造正规式1(01)*101相应的DFA M。
编译原理课后作业参考答案
第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; 【答案】
编译原理第二次作业标准答案
【作业1】
已有文法: G[S]: S →SA, S →A, A →SB, A →B, A →(S), A →
(1) 改写文法以满足递归下降分析的要求。
(2) 画出非终结符号B 的递归下降子程序。
答:S →SA|A A →SB|B(S)|() B →[S] 先消除关于S 的直接左递归,得到 S →AS’
S’ →AS’|ε
再将S →AS’代入A →SB
A →AS’B|B|(S)|()
消除关于A 的间接左递归,得到 A →BA’|(S)A’|()A’ A’ →S’BA’|ε b →[S]不变。
【作业2】
已有文法:G[S]: S →aBc|bAB, A →aAb|b|Cc, B →b|ε,C →c (1)
(2) (3)
【作业3】
设已给文法G[S]: S →TaF|F, F →TbP|P , P →c|d, T →e|b.
构造此文法的算符优先矩阵; 先确定P ,根据FIRSTVT 和LASTVT 的定义, c ,d 同时为它的FIRSTVT 和LASTVT ;
同理对T 进行分析。
再根据P 和T 确定F ,首先b 是F 的FIRSTVT , 其次由于F →P ,所以P 的FIRSTVT 和LASTVT 同时也是F 的FIRSTVT 和LASTVT ; 同理可由F 得S 的FIRSTVT 和LASTVT 集合。
根据FIRSTVT 和LASTVT 构造文法的算符优先矩阵。
根据算符优先关系的三个定义,文法中只需关注
S →FaF 和F →TbP 这两个生产式
可得到:
a 小于T 的LASTVT 和F 的FIRSTVT 中的符号
编译原理 作业标准答案
《编译原理》第一次作业参考答案
一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)?
1.b*(ab*ab*)*
所有含有偶数个a的由a和b组成的字符串.
2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*
答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串.
答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串.
说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”.
二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,*,+,?)描述下列语言:
1.不包含子串ab的所有字符串.
b*a*
2.不包含子串abb的所有字符串.
b*(ab?)*
3.不包含子序列abb的所有字符串.
b*a*b?a*
注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容.
~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~
《编译原理》第二次作业参考答案
一、考虑以下NFA:
1.这一NFA接受什么语言(用自然语言描述)?
所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串.
2.构造接受同一语言的DFA.
答案一(直接构造通常得到这一答案):
答案二(由NFA构造DFA得到这一答案):
二、正则语言补运算
编译原理平时作业-答案
平时作业
1 对于下列语言分别写出它们的正规表达式。
(1) 英文字母组成的所有符号串,要求符号串中顺序包含五个元音。
答:令Letter表示除这五个元音外的其它字母。
((letter)*A(letter)*E(letter)*I(letter)*O(letter)*U(letter))*
(2) 英文字母组成的所有符号串,要求符号串中的字母依照词典顺序排列。答:A*B*....Z*
(3) Σ={0,1}上的含偶数个1的所有串。
答: (0|10*1)*
(4) Σ={0,1}上的含奇数个1的所有串。
答:(0|10*1)*1
(5) 具有偶数个0和奇数个1的有0和1组成的符号串的全体。
答:设S是符合要求的串,|S|=2k+1 (k≥0)。
则S→S10|S21,|S1|=2k (k>0),|S2|=2k (k≥0)。
且S1是{0,1}上的串,含有奇数个0和奇数个1。
S2是{0,1}上的串,含有偶数个0和偶数个1。
考虑有一个自动机M1接受S1,那么自动机M1如下:
和L(M1)等价的正规表达式,即S1为:
((00|11)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*
类似的考虑有一个自动机M2接受S2,那么自动机M2如下:
和L(M2)等价的正规表达式,即S2为:
((00|11)|(01|10)(00|11)*(01|10))*
因此,S为:
((00|11)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*0|
((00|11)|(01|10)(00|11)*(01|10))*1
《编译原理》习题参考答案(六)
《编译原理》习题参考答案(六)
第五章
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 ; E
P
→ D ; D | id : T
D
→ list of T | char | integer
T
E
→ ( L ) | literal | num | id
→ E , L | E
L
写一个类似5.3节中的翻译方案,以确定表达式( E )和表( L )的类型。
P→ D ; E
D→ D ; D
D→ 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 ) }
编译原理教程课后习题答案
编译原理教程课后习题答案【篇一:编译原理教程课后习题答案——第一章】
完成下列选择题:
(1) 构造编译程序应掌握
a. 源程序
b. 目标语言
c. 编译方法
d. 以上三项都是
(2) 编译程序绝大多数时间花在上。
a. 出错处理
b. 词法分析
c. 目标代码生成
d. 表格管理
(3) 编译程序是对。
a. 汇编程序的翻译
b. 高级语言程序的解释执行
c. 机器语言的执行
d. 高级语言的翻译
【解答】
(1) d (2) d(3) d
1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。
在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。
在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。因此,编译对源程序的处理是先翻译,后执行。
从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。
这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。
编译原理第三版答案
编译原理第三版答案
编译原理是计算机科学中非常重要的一门课程,它涉及到程序设计语言的语法、语义和编译器的设计与实现等内容。《编译原理》(Compilers: Principles, Techniques, and Tools)是编译原理领域的经典教材,由Alfred V. Aho、Monica S. Lam、Ravi Sethi和Jeffrey D. Ullman合著,已经出版了三个版本。本文将针对《编译原理》第三版中的习题和答案进行整理和总结,以帮助学习者更好地理解和掌握编译原理相关知识。
第一章,引论。
1.1 什么是编译器?
编译器是一种将源程序翻译成目标程序的程序,它包括词法分析、语法分析、
语义分析、中间代码生成、代码优化和目标代码生成等阶段。
1.2 编译器的主要任务是什么?
编译器的主要任务是将高级语言程序翻译成等价的目标程序,同时保持程序的
功能和性能。
1.3 编译器的结构包括哪些部分?
编译器的结构包括前端和后端两部分,前端包括词法分析、语法分析和语义分析,后端包括中间代码生成、代码优化和目标代码生成。
第二章,词法分析。
2.1 什么是词法分析?
词法分析是编译器中的第一个阶段,它将源程序中的字符序列转换成单词(Token)序列。
2.2 词法分析的主要任务是什么?
词法分析的主要任务是识别源程序中的单词,并将其转换成单词符号表中的标
识符。
2.3 词法分析中常见的错误有哪些?
词法分析中常见的错误包括非法字符、非法注释、非法标识符等。
第三章,语法分析。
3.1 什么是语法分析?
语法分析是编译器中的第二个阶段,它将词法分析得到的单词序列转换成抽象
编译原理8参考答案
编译原理8参考答案
编译原理8参考答案
编译原理是计算机科学中的一门重要课程,它研究的是将高级语言转化为机器语言的过程。在编译原理的学习过程中,学生们经常会遇到各种难题,而参考答案则是帮助他们解决这些问题的有力工具。下面是一些编译原理8的参考答案,希望能对学习者有所帮助。
1. 什么是编译器?
编译器是一种将高级语言转化为机器语言的程序。它负责将源代码进行词法分析、语法分析、语义分析等一系列处理,最终生成可执行的目标代码。
2. 请简述编译器的工作原理。
编译器的工作原理主要包括以下几个步骤:
- 词法分析:将源代码分解为一个个的词法单元。
- 语法分析:根据语法规则将词法单元组织成语法树。
- 语义分析:对语法树进行类型检查、语义检查等操作。
- 中间代码生成:将语法树转化为中间代码,比如三地址码、四元式等。
- 代码优化:对中间代码进行优化,提高程序的执行效率。
- 目标代码生成:将优化后的中间代码转化为目标机器代码。
- 目标代码优化:对目标机器代码进行优化,进一步提高执行效率。
3. 什么是词法分析?
词法分析是编译器的第一步,它将源代码分解为一个个的词法单元。词法单元包括关键字、标识符、运算符、常量等。词法分析器通常使用正则表达式、有限自动机等方法进行实现。
4. 什么是语法分析?
语法分析是编译器的第二步,它根据语法规则将词法单元组织成语法树。语法
分析器通常使用上下文无关文法和语法分析算法(如LL(1)、LR(1)等)进行实现。
5. 什么是语义分析?
语义分析是编译器的第三步,它对语法树进行类型检查、语义检查等操作。语
编译原理课后作业参考答案
作业参考答案
第二章 高级语言及其语法描述
6、(1)L (G 6)={0,1,2,......,9}+
(2)最左推导:
N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 N=>ND=>DD=>3D=>34
N=>ND=>NDD=>DDD=>5DD=>56D=>568 最右推导:
N=>ND =>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 N=>ND=>N4=>D4=>34
N=>ND=>N8=>ND8=>N68=>D68=>568 7、G:S →ABC | AC | C
A →1|2|3|4|5|6|7|8|9
B →BB|0|1|2|3|4|5|6|7|8|9
C →1|3|5|7|9
8、(1)最左推导:
E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i
E=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=>i*(i+i) 最右推导:
E=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i=>i+i*i
E=>T=>T*F=>T*(E)=>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=>T*(i+i)=>F*(i+i)=>i*(i+i) (2)
9、证明:该文法存在一个句子iiiei 有两棵不同语法分析树,如下所示,因此该文法是二义的。
第六七章 作业与习题参考答案
第七章 LR分析法
第1题已知文法
A→aAd|aAb|ε
判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。
文法:A→aAd|aAb|ε
拓广文法为G′,增加产生式S′→A
若产生式排序为:
0S' →A
1 A →aAd
2 A →aAb
3 A →ε
由产生式知:
First (S' ) = {ε,a}
First (A ) = {ε,a}
Follow(S' ) = {#}
Follow(A ) = {d,b,#}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I0中:
A →.aAd和A →.aAb为移进项目,A →.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)
文法。
在I0、I2中:
Follow(A) ∩{a}= {d,b,#} ∩{a}=
所以在I0、I2中的移进-归约冲突可以由Follow集解决,所以G是SLR(1)文法。
构造的SLR(1)分析表如下:
题目1的SLR(1)分析表
ab#的分析过程
题目1对输入串
第2题若有定义二进制数的文法如下:
S→L.L|L
L→LB|B
B→0|1
(1) 试为该文法构造LR分析表,并说明属哪类LR分析表。
(2) 给出输入串101.110的分析过程。
解:文法:
S→L.L|L
L→LB|B
B→0|1
拓广文法为G′,增加产生式S′→S
若产生式排序为:
0 S' →S
1 S →L.L
2 S →L
3 L →LB
4 L →B
5 B →0
6 B →1
由产生式知:
First (S' ) = {0,1}
First (S ) = {0,1}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》第一次作业参考答案
一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)?
1.b*(ab*ab*)*
所有含有偶数个a的由a和b组成的字符串.
2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*
答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串.
答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串.
说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”.
二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,*,+,?)描述下列语言:
1.不包含子串ab的所有字符串.
b*a*
2.不包含子串abb的所有字符串.
b*(ab?)*
3.不包含子序列abb的所有字符串.
b*a*b?a*
注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容.
~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~
《编译原理》第二次作业参考答案
一、考虑以下NFA:
1.这一NFA接受什么语言(用自然语言描述)?
所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串.
2.构造接受同一语言的DFA.
答案一(直接构造通常得到这一答案):
答案二(由NFA构造DFA得到这一答案):
二、正则语言补运算
3.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.
1.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.
规律:构造语言L的补语言L’的DFA,可以先构造出接受L的DFA,再把这一DFA的接受状态改为非接受状态,非接受状态改为接受状态,就可以得到识别L’的DFA.
说明:在上述两题中的D状态,无论输入什么符号,都不可能再到达接受状态,这样的状态称为“死状态”.
在画DFA时,有时为了简明起见,“死状态”及其相应的弧(上图中的绿色部分)也可不画出.
2.再证明:对任一正则表达式R,一定存在另一正则表达式R',使得L(R')是L(R)的补集.
证明:根据正则表达式与DFA的等价性,一定存在识别语言L(R)的DFA. 设这一DFA为M,则将M的所有接受状态改为非接受状态,所有非接受状态改为接受状态,得到新的DFA M’. 易知M’识别语言L(R)的补集. 再由正则表达式与DFA的等价性知必存在正则表达式R’,使得L(R’)是L(R)的补集.
三、设有一门小小语言仅含z、o、/(斜杠)3个符号,该语言中的一个注释由/o开始、以o/结束,并且注释
禁止嵌套.
1.请给出单个正则表达式,它仅与一个完整的注释匹配,除此之外不匹配任何其他串. 书写正则表达式时,
要求仅使用最基本的正则表达式算子( ,|,*,+,?).
参考答案一:/o(o*z|/)*o+/
思路:基本思路是除了最后一个o/,在注释中不能出现o后面紧跟着/的情况;还有需要考虑的是最后一个o/之前也可以出现若干个o.
参考答案二(梁晓聪、梁劲、梁伟斌等人提供):/o/*(z/*|o)*o/
2.给出识别上述正则表达式所定义语言的确定有限自动机(DFA). 你可根据问题直接构造DFA,不必运用机
械的算法从上一小题的正则表达式转换得到DFA.
~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~
《编译原理》第三次作业参考答案
一、考虑以下DFA的状态迁移表,其中0,1为输入符号,A~H代表状态:
其中A为初始状态,D为接受状态,请画出与此DFA等价的最小DFA,并在新的DFA状态中标明它对应的原DFA状态的子集.
说明:有些同学没有画出状态H,因为无法从初始状态到达状态H. 从实用上讲,这是没有问题的. 不过,如果根据算法的步骤执行,最后是应该有状态H的.
二、考虑所有含有3个状态(设为p,q,r)的DFA. 设只有r是接受状态. 至于哪一个状态是初始状态与本问题
无关. 输入符号只有0和1. 这样的DFA总共有729种不同的状态迁移函数,因为对于每一状态和每一输入符号,可能迁移到3个状态中的一个,所以总共有3^6=729种可能. 在这729个DFA中,有多少个p和q是不可区分的(indistinguishable)?解释你的答案.
解:考虑对于p和q,在输入符号为0时的情况,在这种情况下有5种可能使p和q无法区分:p和q在输入0时同时迁移到r(1种可能),或者p和q在输入0时,都迁移到p或q(4种可能).
类似地,在输入符号为1时,也有5种可能使p和q无法区分.
如果再考虑r的迁移,r的任何迁移对问题没有影响. 于是r在输入0和输入1时各有3种可能的迁移,总共有3*3=9种迁移.
因此,总共有5*5*9=225个DFA,其中p和q是不可区分的.
三、证明:所有仅含有字符a,且长度为素数的字符串组成的集合不是正则语言.
证明:用反证法.
假设含有素数个a的字符串组成的集合是正则语言,则必存在一个DFA接受这一语言,设此DFA为D. 由于D 的状态数有限,而素数有无限多个,所以必存在两个不同的素数p和q(设p 考虑仅含有字母a,长度为p+p(q-p)的字符串T. T从初始状态出发,经过p个a到达状态s,再经过(q-p)个a仍然到达s;同样,经过p(q-p)个a后仍然到达s. 因此,从初始状态出发,经过p+p(q-p)个a后必然到达状态s. 由于p+p(q-p)=p(q-p+1)是合数,而s为接受状态,因而得出矛盾. 原命题得证. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~