编译原理复习资料1讲课稿.docx
- 文档编号:397700
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:25
- 大小:167.34KB
编译原理复习资料1讲课稿.docx
《编译原理复习资料1讲课稿.docx》由会员分享,可在线阅读,更多相关《编译原理复习资料1讲课稿.docx(25页珍藏版)》请在冰豆网上搜索。
编译原理复习资料1讲课稿
编译原理复习资料
1、某操作系统下合法的文件名为:
device:
name.extension,其中第一部分(device:
)和第三部分(.extension)可缺省,若device,name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的DFA。
用标记d表示任意字母。
2、用两个不同最左推导来说明下面的文法是二义的。
S→AS|b
A→SA|a
答:
句型aSAS的两个不同最左推导如下:
S⇒AS⇒aS⇒aAS⇒aSAS
S⇒AS⇒SAS⇒ASAS⇒aSAS
3、证明下面的文法
S→SA|A
A→a
不是LL
(1)文法,但是SLR
(1)文法,并画出SLR
(1)分析表。
答:
该文法的第一个产生式表现出直接左递归,因此该文法不是LL
(1)。
接受该文法的活前缀的DFA见下面右边;Follow(S')={$},Follow(S)={$,a},Follow(A)={$,a};SLR
(1)分析表见下面左边。
该表无冲突,所以该文法是SLR
(1)的。
状态
动作
转移
a$
SA
0
s3
12
1
s3acc
4
2
r2r2
3
r3r3
4
r1r1
4、用SLR
(1)文法能定义的语言集合、用LR
(1)文法能定义的语言集合和用LALR
(1)文法能定义的语言集合之间有什么关系?
答:
用SLR
(1)文法能定义的语言集合⊂用LALR
(1)文法能定义的语言集合,
用LALR
(1)文法能定义的语言集合⊂用LR
(1)文法能定义的语言集合。
5、下面是inti,j,k这样的类型声明的两种不同语法:
D→TLD→TL
T→int|realT→int|real
L→L,id|idL→id,L|id
如果用LL
(1)分析方法,应该选择哪个文法?
如果用某种LR分析方法,选择哪个文法更好?
简要说明理由。
答:
对于LL
(1)分析方法,两个文法都不合适,左边的文法是左递归的,右边文法有公共左因子。
修改右边文法来适应LL
(1)分析的要求,相对来说比较容易一些,因为只要提公共左因子。
对于LR的各种分析方法,两个文法都适用,但是采用左边的文法更好一些。
用左边的文法时,分析器一边扫描一边归约,占用分析栈的空间较少。
而用右边的文法时,分析器要把所有的标识符都移进栈后才进行归约,因此使用较多的分析栈空间。
(结合语法制导的翻译,采用左边的文法还有好处:
便于确定T的类型属性在栈中的位置。
)
6、在C语言中,3++和(id+id)++这样的表达式被编译时,编译器都会报告如下的错误:
invalidlvalueinincrement
说明左值不能为数值或表达式。
现有如下简化的C语言表达式文法:
E→E+E|(E)|E++|id|num
请写一个语法制导定义或翻译方案,检查++的运算对象是否合法。
答:
给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值标识符和右值表达式,那么语法制导定义如下(无输出则表示无错):
E'→E
E→E1+E2E.v:
=rvalue
E→(E1)E.v:
=E1.v
E→E1++ifE1.v=rvaluethenprintf(“invalidlvalueinincrement”);
E.v:
=rvalue
E→idE.v:
=lvalue
E→numE.v:
=rvalue
7、E→E+T|T
T→num.num|num
给出一个语法制导定义以确定每个子表达式的类型int/real。
答:
E→E1+T{if(E1.type=realorT.type=real)
thenE.type=realelseE.type=integer}
E→T{E.type=T.type;}
T→num.num{T.type=real;}
T→num{T.type=integer;}
8、把下列C语言程序的可执行语句翻译为:
main()
{inti;inta[10];
while(i<=10)a[i]=0;}
(a)三地址代码
(b)后缀式
答:
(a)L0:
ifi<=10gotoL1
gotoL2
L1:
a[i]:
=0
gotoL0
L2:
(b)后缀式:
i10<=a[i]0assignwhile
9、试构造下面的程序的流图,并找出其中所有回边及循环。
readP
x:
=1
c:
=P*P
ifc<100gotoL1
B:
=P*P
x:
=x+1
B:
=B+x
writex
halt
L1:
B:
=10
x:
=x+2
B:
=B+x
writeB
ifB<100gotoL2
halt
L2:
x:
=x+1
gotoL1
答:
程序的流图如下
10、对本题中所示的流图,求出其各结点n的控制结点集D(n)、回边及循环(n0为首结点)。
答:
各结点n的控制结点集D(n)如下:
D(n0)={n0}
D(n1)={n0,n1}
D(n2)={n0,n1,n2}
D(n3)={n0,n1,n2,n3}
D(n4)={n0,n1,n2,n4}
D(n5)={n0,n1,n2,n5}
D(n6)={n0,n1,n2,n5,n6}
D(n7)={n0,n1,n2,n5,n6,n7}
回边和循环:
因为D(n5)={n0,n1,n2,n5},且n5->n2,所以n5->n2为一条回边。
根据它求出的循环L1={n2,n5,n3,n4}。
因为D(n6)={n0,n1,n2,n5,n6},且n6->n1,所以n6->n1为一条回边。
根据这条回边,求出的循环L2={n6,n1,n5,n3,n4,n2}。
11、考虑下面求矩阵A、B成绩的程序片段:
BEGIN
FORi:
=1TOnDO
FORj:
=1TOnDO
FORk=1TOnDO
c[i,j]:
=c[i,j]+A[i,k}*B[k,j]
END
(1)假定对数组A、B、C采用静态存储分配,每个字占用4个字节,存储器以字节为单位编址。
给出该程序的三地址代码序列。
(2)构造该程序相应的流图。
(3)删除流图中各基本块内的公共子表达式
(4)指出流图中所有回边及其相应循环,并且进行循环优化。
答:
(1)设数组元素按行存放,A、B、C数组都是n*n的二维数组,各维的下界均为0,每个元素占一个字(4个字节),则数组元素(如A[i,j])的地址计算公式为:
D(A[i,j])=addr(A)+((i-0)*n+(j-0))*4
=addr(A)+4*(i*n+j)
该程序的三地址代码序列被划分成基本块后如下:
(2)程序流图如下:
(3)仅基本块B7中有公共子表达式,删除公共子表达式后基本块B7变换成:
(4)根据
(2)的程序流图,每个结点的控制结点集如下:
D(B1)={B1}
D(B2)={B1,B2}
D(B3)={B1,B2,B3}
D(B4)={B1,B2,B3,B4}
D(B5)={B1,B2,B3,B4,B5}
D(B6)={B1,B2,B3,B4,B5,B6}
D(B7)={B1,B2,B3,B4,B5,B6,B7}
D(B8)={B1,B2,B3,B4,B5,B6,B8}
D(B9)={B1,B2,B3,B4,B9}
根据回边B7->B6,循环L1为:
L1={B7,B6}
根据回边B8->B4,循环L2为:
L2={B8,B6,B7,B5,B4}
根据回边B9->B2,循环L3为:
L3={B9,B4,B5,B6,B7,B8,B3,B2}
经循环优化后三地址代码序列变为:
12、试求出如下四元式程序中的循环并进行循环优化.
I:
=1
readJ,K
L:
A:
=K*I
B:
=J*I
C:
=A*B
writeC
I:
=I+1
ifI<100gotoL
halt
答:
把本题的三地址代码划分成基本块并画出其程序流图显示在图9.4
(1)中,其中有三个基本块B1,B2,B3,有一条回边B2->B2,相应的循环是{B2}。
(1)代码外提:
由于循环中没有不变运算,故不做此项优化
(2)强度削弱:
B2中A和B都是I的归纳变量。
优化结果显示在图9.4
(2)中。
(3)删除归纳变量:
变换循环控制条件,删除归纳变量I后的流图显示在图9.4(3)中
13、下面是应用筛法求2到N之间素数的程序:
begin
readN;
fori:
=2toNdo
A[i]:
=true; /*置初值*/
fori:
=2toN**0.5do /*运算符**代表幂乘*/
ifA[i]then /*i是一个素数*/
forj:
=2*itoNby
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 复习资料 讲课