21460227 段国助.docx
- 文档编号:30680688
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:18
- 大小:881.95KB
21460227 段国助.docx
《21460227 段国助.docx》由会员分享,可在线阅读,更多相关《21460227 段国助.docx(18页珍藏版)》请在冰豆网上搜索。
21460227段国助
编译原理
201921460227段国助19级计科2班
第一章
2.高级语言程序有哪两种执行方式?
阐述其主要异同点。
描述编译方式执行程序的过程。
答:
高级语言程序有编译程序和解释程旭两种执行方式。
异同点:
编译程序:
将高级程序语言翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。
解释程序:
将高级程序设计语言写的源程序作为输入,边解释边执行源程序本身,而不产生目标程序的翻译程序。
一个源程序到一个可执行程序的过程:
预编译、编译、汇编、链接。
其中,编译是主要部分,其中又分为六个部分:
词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
4.编译程序有哪些主要构成成分?
各自的主要功能是什么?
答:
编译程序的主要构成成分有:
词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。
功能:
(1)词法分析程序:
从左到右扫描源程序,识别单词及其有关属性;
(2)语法分析程序:
分析源程序的结构,判别它是否为相应程序设计语言中的一个合法程序;(3)语义分析程序:
审查源程序有无语义错误,为代码生成阶段收集类型信息;(4)中间代码生成程序:
将源程序变成一种内部表示形式;(5)代码优化程序:
对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效;(6)目标代码生成程序:
把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码;(7)表格管理程序:
保存编译过程中的各种信息;(8)出错处理程序:
若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。
7.编译技术可应用在哪些领域?
答:
(1)各种软件工具的开发,如:
语言的结构化编辑器,程序的格式化工具,语言程序的调试工具,预言程序的测试工具,程序理解工具。
(2)程序翻译,如:
高级语言之间的程序转换,交叉编译程序,硬件合称,数据库查询语言解释器。
(3)新型体系结构的设计。
第二章
4.画出下面的状态转换图,并给出相应的识别函数。
(1)C语言中字符常量是由一对单引号括起来的单个字符,或者以\开头的两个字符表示的转义字符;
解答:
(2)C语言中以/开头的单词有多种,如/、/=、//、/*等,其中前两种表示除法运算和除法赋值运算,它们需要返回单词本身;后两种表示注释:
以/*和*/括起来的多行注释、以//标记的单行注释,后两种识别后不需要返回单词,直接跳过;
解答:
(3)C语言中的整数有多种形式:
十进制、八进制和十六进制;
解答:
(4)C语言中不带指数的浮点数;
解答:
6.试写出以下各描述中所表示的正则表达式:
(1)以01结尾的二进制数串;
答:
(0|1)*01
(2)不以0开头,能被5整除的十进制整数;
答:
((1|2|…|9)(0|1|2|…|9)*|ε)(0|5)
(3)包含子串011的由0和1组成的符号串的全体;
答:
(0|1)*(011)(0|1)*
(4)不包含子串011的由0和1组成的符号串的全体;
答:
1*(01|0)*|1*0(0|10)*(1|ε)
(5)按字典序递增排列的所有小写字母串;
答:
a*b*c*…z*
(6)Σ={0,1}上的含奇数个1的所有串。
答:
(0|10*1)*1
(7)包含偶数个0和1的二进制串;
答:
(00|11)|(00|11)*((01|10)(00|11)*(01|10)(00|11)*)*
(8)具有偶数个0和奇数个1的由0和1组成的符号串的全体;
答:
((00|11)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*0|((00|11)|(01|10)(00|11)*(01|10))*1
(9)由/*和*/括起来的注释的串,且串中没有在双引号中的*/;
答:
\/\*([^*”]”.*”|\*+[^/])*\*\/
(10)有些语言是大小写敏感的,因此这些语义中的关键字只有一种写法,描述它的正则表达式比较简单,但SQL语言是大小写不敏感的,如select和SeLect、SELECt等都是一样的,试描述SQL中的关键字select的大小写不敏感的正则表达式。
答:
select->[Ss][Ee][Ll][Ee][Cc][Tt]
9.给出识别下列在字母表{0,1}上的语言的最小化DFA,并以状态转换图和状态转换表表示。
(1)所有以00结尾的符号串的集合。
(1)DFA M=({0,1},{q0,q1,q2},q0,{q2},δ)
其中δ定义如下:
δ(q0,0)=q1 δ(q0,1)=q0
δ(q1,0)=q2 δ(q1,1)=q0
δ(q2,0)=q2 δ(q2,1)=q0
状态转换图为:
(2)所有具有3个0的符号串的集合。
解答:
正规式:
1*01*01*01*
DFA M=({0,1},{q0,q1,q2,q3},q0,{q3},δ),其中δ定义如下:
δ(q0,0)=q1 δ(q0,1)=q0
δ(q1,0)=q2 δ(q1,1)=q1
δ(q2,0)=q3 δ(q2,1)=q2
δ(q3,1)=q3
状态转换图为:
(3)含有偶数个0或偶数个1的字符串。
解答:
0
1
Q0*
Q1
Q2
Q3
Q2
Q3
Q0
Q1
Q1
Q0
Q3
Q2
10.构造与下列正则表达式等价的最小状态的DFA。
(1)10|(0|11)0*1
解答:
(1) DFA M=({0,1},{q0,q1,q2,q3},q0,{q3},δ),其中δ定义如下:
δ(q0,0)=q1 δ(q0,1)=q2
δ(q1,0)=q1 δ(q1,1)=q3
δ(q2,0)=q3 δ(q2,1)=q1
状态转换图为:
(2)((0|1)*|(11))*
解答:
DFA M=({0,1},{q0},q0,{q0},δ),其中δ定义如下:
δ(q0,0)=q0 δ(q0,1)=q0
状态转换图为:
(3)(a|b)*a(a|b)
解答:
(a|b)*a(a|b)
①求出NFAM:
②确定化,得到DFAM:
③化简:
在第②步中求出的DFAM中没有等价状态,因此它就是最小化的DFAM。
如上
(4)(a|b)*a(a|b)(a|b)
解答:
(a)b)*a(a|b)(a|b)
①求NFAM:
②确定化,得到DFAM:
③化简,在第②步中求出的DFAM中没有等价状态,因此它已经是最小化的DFAM了。
如上
第三章
6.已知某算术表达式的文法G为:
(1)
(2)
(3)
给出i+i+i和i+i*i的最左推导、最右推导和语法树
最左推导:
E=>E+T=>E+T+T=>T+T+T=>F+T+T=>i+T+T=>i+F+T=>i+i+T
=>i+i+F=>i+i+i
E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i
最右推导:
E=>E+T=>E+F=>E+i=>E+T+i=>E+F+i=>E+i+i=>T+i+i
=>F+i+i=>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
i+i+i和i+i*i的语法树如下图所示。
13.已知文法G[S],其产生式如下:
S→(L)|a
L→L,S|S
消除左递归,如果是LL
(1)文法,构造分析表。
说明对输入符号串(a,(a,a))的分析过程。
13.解答:
消除所给文法的左递归,得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))做出的分析动作如下:
步骤
栈
剩余输入串
输出
1
#S
(a,(a,a))#
#
2
#)L(
a,(a,a))#
S→(L)
3
#)L
a,(a,a))#
4
#)L'S
a,(a,a))#
L→SL'
5
#)L'a
a,(a,a))#
S→a
6
#)L'
(a,a))#
7
#)L'S,
(a,a))#
L'→,SL'
8
#)L'S
(a,a))#
9
#)L')L(
(a,a))#
S→(L)
10
#)L')L
a,a))#
11
#)L')L'S
a,a))#
L→SL'
12
#)L')L'a
a,a))#
S→a
13
#)L')L'
a))#
14
#)L')L'S,
a))#
L'→,SL'
15
#)L')L'S
a))#
16
#)L')L'a
a))#
S→a
17
#)L')L'
))#
18
#)L')
))#
L'→ε
19
#)L'
)#
20
#)
)#
L'→ε
21
#
#
14.求下述文法中各个非终结符的First集、Follow集,各候选式的First集。
(1)S→AB|bC
(2)A→b|ε
(3)B→aD|ε
(4)C→AD|b
(5)D→aS|c
14.解答:
各非终结符的First集:
First(S)={First(A)\{ε}}∪{First(B)\{ε}}∪{ε}∪{b}={a,b,ε}
First(A)={b}∪{ε}={b,ε}
First(B)={ε}∪{a}={a,ε}
First(C)={First(A)\{ε}}∪First(D)∪First(b)={a,b,c}
First(D)={a}∪{c}={a,c}
各个候选式的First集为:
First(AB)={a,b,ε}First(bC)={b}
First(ε)={ε}First(b)={b}
First(aD)={a}First(AD)={a,b,c}
First(b)={b}First(aS)={a}
First(c)={c}
各非终结符的Follow集的计算:
Follow(S)={#}∪Follow(D)={#}
Follow(A)=(First(B)\{ε})∪Follow(S)∪First(D)={a,#,c}
Follow(B)=Follow(S)={#}
Follow(C)=Follow(S)={#}
Follow(D)=Follow(B)∪Follow(C)={#}
15.对下面的文法G:
E→TE'
E'→+E|ε
T→FT'
T'→T|ε
F→PF'
F'→*F'|ε
P→(E)|a|b|∧
(1)计算这个文法的每个非终结符的First和Follow;
(2)证明这个文法是LL
(1)的;
(3)构造它的预测分析表。
15.解答:
(1)求First和Follow集
First(E)=First(T)={(,a,b,∧}⑦
First(E')={+,ε}⑥
First(T)=First(F)={(,a,b,∧}④
First(T')={(,a,b,∧,ε}⑤
First(F)=First(P)={(,a,b,∧}③
First(F')={*,ε}②
First(P)={(,a,b,∧}①(计算顺序)
Follow(E)={#,)}(1,7)
Follow(E')=Follow(E)={#,)}
(1)(使用的产生式)
Follow(T)=First(E')\{ε}∪Follow(T')(1,4)
={+}∪{),#}={+,),#}
Follow(T')=Follow(T)={+,},#}(3)
Follow(F)=First(T')\{ε}∪Follow(T)(3,4)
={(,a,b,∧,+,),#}
Follow(F')=Follow(F)(5)
={(,a,b,∧,+,),#}
Follow(P)=First(F')\{ε}∪Follow(F)(5,6)
={*,(,a,b,∧,+,),#}
(2)证明:
∵a.文法不含左递归;
b.每个非终结符的各个侯选式的First集不相交;
c.First(E')∩Follow(E')={+,ε}∩{#,),}=Φ
First(T')∩Follow(T')={(,a,b,∧,ε}∩{+,)}=Φ
First(F')∩Follow(F')={*,ε}∩{,a,(∧,+,},#}=Φ
∴改造后的文法满足LL
(1)文法的三个条件,是LL
(1)文法。
(3)预测分析表如下所示。
a
b
*
+
∧
(
)
#
E
E→TE'
E→TE'
E→TE'
E→TE'
E'
E'→+E
E'→ε
E'→ε
T
T→FT'
T→FT'
T→FT'
T→FT'
T'
T'→T
T'→T
T'→ε
T'→T
T'→T
T'→ε
T'→ε
F
F→PF'
F→PF'
F→PF'
F→PF'
F'
F'→ε
F'→ε
F'→*F'
F'→ε
F'→ε
F'→ε
F'→ε
F'→ε
P
P→a
P→b
P→∧
P→(E)
第四章
/*程序段4.3*/
intx;
main()
{
inta;
while(a){
charx;
if(x>y){charx,y;
a=a+x;
func1=a*y;“func1”未声明,出错
}
printf(“Helloworld!
”);
}
chary;
intfunc1(inta,intb)
{
do{
charx;
int*y;
if(x>y){不允许指针与整数比较
if(y){
intz;
printf(“Inputnumbers”);
y=y-1;
continue;
}
a=a+x;
}
……
printf(“theresultis%d”,*var1);
}
第五章
4.文法G及相应的语法制导的翻译规则为:
P→bQb{print(“1”)}
Q→cR{print(“2”)}
Q→a{print(“3”)}
R→Qad{print(“4”)}
若输入串为bcccaadadadb时,其输出是什么?
4.解答:
输入串为bcccaadadadb时的语法树为:
采用修剪语法树的方法,按句柄方式自下而上归约该语法树,在归约时调用相应的语义规则,由此得到最终的翻译结果为:
34242421.
5.请把逆波兰表示ab+cde3-/+8*+复原成中缀表达式。
5.解答:
(a+b)+(c+d/(e-3))*8
7.分别给出下述表达式的三元式、四元式序列和DAG。
(1)-(a+b)*(c+d)-(a+b+c)
(2)A||(B&&!
(C||D))
7.解答:
(1)
三元式
四元式
①(+,a,b)
1.(+,a,b,T1)
②(-,1,-)
2.(-,T,-,T2)
③(+,c,d)
3.(+,c,d,T3)
④(*,2,3)
4.(*,T2,T3,T4)
⑤(+,a,b)
5.(+,a,b,T5)
⑥(+,c,5)
6.(+,T5,c,T6)
⑦(-,4,6)
7.(-,T4,,T6,T7)
7.解答:
(2)
四元式代码为:
1.(jnz,A,_,x)
2.(j,_,_,3)
3.(jnz,B,_,5)
4.(j,_,_,y)
5.(jnz,C,_,y)
6.(j,_,_,7)
7.(jnz,D,_,y)
8.(j,_,_,x)
11.解答:
(1)四元式序列为:
1.(j<,A,C,3)
8.(:
=,T,-,C)
2.(j,-,-,14)
9.(j,-,-,14)
3.(j<,B,D,5)
11.(j,-,-,14)
4.(j,-,-,14)
12.(+,A,2,T2)
5.(j=,A,1,7)
13.(:
=,T2,-,A)
6.(j,-,-,10)
14.
7.(+,c,1,T1)
(2)四元式序列为:
1.(j>0,x,0,3)
7.(j,_,_,12)
2.(j,_,_,8)
8.(+,x,2,T2)
3.(j>,y,0,5)
9.(:
=,T2,_,x)
4.(j,_,_,8)
10.(+,y,3,T3)
5.(+,x,y,T1)
11.(:
=,T3,_,y)
6.(:
=,T1,_,z)
12.
(3)四元式序列为:
0.(+,A,3,t0)
1.(:
=,t0,,t1)
2.(*,C,A,t2)
3.(*,t2,2,t3)
4.(:
=,t3,,B)
5.(j<,X,0,7)
6.(j,,,0)
7.
(4)四元式序列为:
0.(*,b,2,t0)
1.(:
=,t0,,i)
2.(:
=,100,,t1)
3.(j,,,6)
4.(+,i,1,t2)
5.(:
=,t2,,i)
6.(j>,i,t1,15)
7.(+,a,b,t3)
8.(+,c,d,t4)
9.(*,t3,t4,t5)
10.(+,a,b,t6)
11.(+,t6c,t7)
12.(-,t5,t7,t8)
13.(:
=,t8,,x)
14.(j,,,4)
15.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 21460227 段国助