编译原理复习资料1讲课稿Word文件下载.docx

上传人:b****2 文档编号:13326182 上传时间:2022-10-09 格式:DOCX 页数:25 大小:167.34KB
下载 相关 举报
编译原理复习资料1讲课稿Word文件下载.docx_第1页
第1页 / 共25页
编译原理复习资料1讲课稿Word文件下载.docx_第2页
第2页 / 共25页
编译原理复习资料1讲课稿Word文件下载.docx_第3页
第3页 / 共25页
编译原理复习资料1讲课稿Word文件下载.docx_第4页
第4页 / 共25页
编译原理复习资料1讲课稿Word文件下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

编译原理复习资料1讲课稿Word文件下载.docx

《编译原理复习资料1讲课稿Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理复习资料1讲课稿Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。

编译原理复习资料1讲课稿Word文件下载.docx

)={$},Follow(S)={$,a},Follow(A)={$,a};

SLR

(1)分析表见下面左边。

该表无冲突,所以该文法是SLR

(1)的。

状态

动作

转移

a$

SA

0

s3

12

1

s3acc

4

2

r2r2

3

r3r3

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:

E→idE.v:

=lvalue

E→numE.v:

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:

=x+1

=B+x

writex

halt

B:

=10

=x+2

writeB

ifB<

100gotoL2

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:

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:

readJ,K

L:

A:

=K*I

=J*I

C:

=A*B

writeC

=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;

/*置初值*/

=2toN**0.5do 

/*运算符**代表幂乘*/

ifA[i]then 

/*i是一个素数*/

forj:

=2*itoNby

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1