编译原理平时作业答案0415160740.docx

上传人:b****8 文档编号:9002243 上传时间:2023-02-02 格式:DOCX 页数:42 大小:232.84KB
下载 相关 举报
编译原理平时作业答案0415160740.docx_第1页
第1页 / 共42页
编译原理平时作业答案0415160740.docx_第2页
第2页 / 共42页
编译原理平时作业答案0415160740.docx_第3页
第3页 / 共42页
编译原理平时作业答案0415160740.docx_第4页
第4页 / 共42页
编译原理平时作业答案0415160740.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

编译原理平时作业答案0415160740.docx

《编译原理平时作业答案0415160740.docx》由会员分享,可在线阅读,更多相关《编译原理平时作业答案0415160740.docx(42页珍藏版)》请在冰豆网上搜索。

编译原理平时作业答案0415160740.docx

编译原理平时作业答案0415160740

平时作业

1对于下列语言分别写出它们的正规表达式。

(1)英文字母组成的所有符号串,要求符号串中顺序包含五个元音。

答:

令Letter表示除这五个元音外的其它字母。

((letter)A(letter)E(letter)l(letter)O(letter)U(letter))

(2)英文字母组成的所有符号串,要求符号串中的字母依照词典顺序排列

***

答:

AB....Z

工={0,1}上的含偶数个1的所有串。

答:

(0|10*1)*

工={0,1}上的含奇数个1的所有串。

答:

(0|10*1)*1

具有偶数个0和奇数个1的有0和1组成的符号串的全体

答:

设S是符合要求的串,|S|=2k+1(k>0)。

则S~SiO|S2l,|Si|=2k(k>0),|S2|=2k(k>0)。

且S是{0,1}上的串,含有奇数个0和奇数个1。

S2是{0,1}上的串,含有偶数个0和偶数个1。

考虑有一个自动机M接受S1,那么自动机M如下:

C1I10

Q0I11

和L(M1)等价的正规表达式,即S1为:

((011)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*

类似的考虑有一个自动机M接受S2,那么自动机M如下:

和L(M2)等价的正规表达式,即S2为:

((00|11)|(01|10)(00|11)*(01|10))*

因此,S为:

⑹答:

不包含子串011的由0和1组成的符号串的全体。

1*|1*0(0|10)*(1|£)

⑺答:

由0和1组成的符号串,把它看成二进制数,能被3整除的符号串的全体。

假设w的自动机如下:

((00|11)|(01|10)(00|11)

((00|11)|(01|10)(00|11)

(01|10))(01|10)(00|11)0|

(01|10))1

对应的正规表达式:

(1(01*0)1|0)

(1)

⑵答:

所有以00结束的符号串的集合。

所有具有3个0的符号串的集合。

2给出接受下列在字母表{0,1}上的语言的DFA

qo,{q2},3)

{qo,qi,q2},

(1)DFAM=({0,1},

其中3定义如下:

3(qo,0)=q1

3(q1,0)=q2

3(q0,1)=q0

3(q1,1)=q0

3(q2,0)=q2

3(q2,1)=q0

⑵正则表达式:

1*01*01*01

DFAM=({0,1},

{q。

,q1,q2,qs},q0,{q3},

3)

其中3定义如下:

3(q0,0)=q1

3(q1,0)=q2

3(q2,0)=qs

3(q0,1)=q0

3(q1,1)=q1

3(q2,1)=q2

 

3(qs,1)=qs

 

 

3下面是用正规式表示的变量声明:

(int|float)id(,id)*;

请改用上下文无关文法表示,也就是写一个上下文无关文法,它和该正规式等价。

答:

DTL;

Tint|float

LL,id|id

4试分析下面给出的if-then-else语句的文法,它的提出原本是为了矫正dangling-else(悬而未

决的-else)文法的二义性:

stmtfifexprthenstmt

|matched-stmt

matched-stmtfifexprthenmatched-stmtelsestmt

|other

试说明此文法仍然是二义性的。

答:

考虑句子ifethenifethenotherelseifethenotherelseother它具有如下所示的

两种分析树stmtexprtheneifstmtifmatched-stmtexprthenmatched-stmteotherifeslestmtmatched-stmtexprthenmatched-stmteothereslestmtmatched-stmtotherstmtmatched-stmtifexprthenmatched-stmteifeslestmteslestmtmatched-stmtexprthenestmtotherexprthenmatched-stmteotherifmatched-stmtother

则上面给出的if-then-else文法仍是二义性的。

5证明下面文法是SLR⑴文法,并构造其SLR分析表

EfE+T|T

TfTF|F

FfF*|a|b

答:

该文法的拓广文法G'为

(0)

E'fE

(1)E

f

E+T

⑵E

fT

(3)T

f

TF

⑷T

fF

(5)F

f

F*

⑹F

fa

(7)F

f

b

其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:

10={E'f・E,Ef・E+T,Ef・T,Tf・TF,Tf・F,Ff・F*,Ff・a,Ff・b}

11={E'fE-,EfE•+T}I2={EfT•,TfT•F,Ff・F*,Ff・a,Ff・b}

13={TfF•,FfF•*}I4={Ffa•}I5={Ffb•}

I6={EfE+•T,Tf・TF,Tf・F,Ff・F*,Ff・a,Ff・b}I7={TfTF•,FfF•*}I8={FfF*•}

求FOLLOW集:

FOLLOW(E)={+,$}

I9={EfE+T-,TfT•F,Ff・F*,Ff・a,Ff・b}

FOLLOW(T)={+,$,a,b}

FOLLOW(F)={+,$,a,b,*}

构造的SLR分析表如下:

狀态

action

aot»

+

a

b

$

E

T

F

0

34

35

1

2

3

1

S6

acc

r2

r2

S41

S5

rr2

「7

3

SB

「4

r4

「4

4

r6

「6

r6

rG

「6

r?

r7

r7n

r7

Pr7

6

S4

S5

9

3

7

r3

SB

r3

r3

r3

8

r5

r5

r5

r5

Pr5

9

r1

S4

S5

rl

7

显然,此分析表无多重定义入口,所以此文法是SLR文法。

6为下面的文法构造LALR⑴分析表

S—E

iE+T|T

T—(E)|a

答:

其拓广文法G':

(0)S'—S

(1)S—E

(2)E—E+T(3)E—T

⑷T—(E)⑸T—a

I0={[S'—•S,$],[S|1={[S'—S•,$]}II4={[T—(•E),$/+],[E

I5={[T—a•,$/+]}

|7={[T—(E•),$/+],[EI9={[T—(•E),)/+},[E

110={[T—a•,)/+]}

I13={[E—E+-T,)/+],[T

构造其LR

(1)项目集规范族和goto函数(识别活前缀的DFA)如下:

[T—•(E),$/+],[T—•a,$/+]}

3={[E—T•,$/+]}

(E),)/+],[T—•a,)/+]}

—•a,$/+]}

—•E,$],[E—•E+T,$/+],[E—•T,$/+],

2={[S—E-,$],[E—E-+T,$/+]}I

—•E+T,)/+],[E—•T,)/+],[T—•

I6={[E—E+-T,$/+],[T—•(E),$/+],[T

—E-+T,)/+]}I8={[E—T-,)/+]}

—•E+T,)/+],[E—•T,)/+],[T—•(E),)/+],[T—•a,)/+]}

11={[E—E+T-,$/+]}I12={[T—(E)•,$/+]}

—•(E),)/+],[T—•a,)/+]}I14={[T—(E-),)/+],[E—E-+T,)/+]}

合并同心的LR

(1)项目集,得到LALR的项目集和转移函数如下:

I0={[S't・S,$],[SfE,$],[EfE+T,$/+],[EfT,$/+],[T宀…(E),$/+],[Ta,$/+]}

1=

{[S'tS-,$]}I2

={[Ste-,$],[Ete-+T,$/+]}

I3,8={[ETT•,$/+/)]}

4,9

={[Tt(•E),$/+/)],[E

t・E+T,)/+],[Et・t,)/+],

[TT.(E),)/+],[T

T.

a,)/+]}

5,10

={[Tta•,$/+/)]}

I6,13={[EtE+-T,$/+/)],[Tt-

(E),$/+/)],[Tt

•a,$

/+/)]}

7,14

={[Tt(E•),$/+/)],[E

tE-+T,)/+]}I11,15={[EtE+T-,$/+/)]}

12,16

={[Tt(E)•,$/+/)]}

 

LALR分析表如下:

STATE

action

goto

A

4

$

s

E

T

0

55,10

S4.9

1

2

1

acc

2

S6J3

r1

3,3

r3

r3

r3

43

S5.10

7,14

5J0

r5

r5

r5

S5.10

54,9

1L15

7J4

S6.13

S12.16

11,15

r2

r2

r2

12.16

r4

「4

rd

7

(1)通过构造识别活前缀的DFA和构造分析表,来证明文法EE+id|id是SLR

(1)文法答:

先给出接受该文法活前缀的DFA如下:

 

再构造SLR分析表如下:

状态

动作

转移

id+$

E

0

s2

1

1

s3acc

2

r2r2

3

s4

4

r1r1

 

表中没有多重定义的条目,因此该文法是

SLR

(1)的。

(2)下面左右两个文法都和

(1)

的文法等价

EE+Mid|id

EME+id|id

M

M

请指出其中有几个文法不是LR

(1)文法,并给出它们不是LR

(1)文法的理由答:

只有文法

EME+id|id

不是LR

(1)文法。

因为对于句子id+id+…+id来说,分析器在面临第一个id时需要做的空归约次数和句子中+id的

个数一样多,而此时句子中+id的个数是未知的。

8根据自上而下的语法分析方法,构造下面文法的LL

(1)分析表

DTL

Tint|real

LidR

R,idR|

答:

先计算FIRST和FOLLOW

FIRST(D)=FIRST(T)={int,real}

FIRST(L)={id}

FIRST(R)={,,门

FOLLOW(D)=FOLLOW(L)={$}

FOLLOW(T)={id}

FOLLOW(R)={$}

LL

(1)分析表如下:

int

real

id

J

$

D

D->TL

D->TL

T

T->int

T->real

L

L->idR

R

R->,idR

R->£

9下面的文法产生的表达式是对整型和实型常数应用算符+形成的。

当两个整数相加时,结果仍为整数,否则就是实数。

iE+T|TT—numnumnum

(a)给出一个语法制导定义以确定每个子表达式的类型。

(b)扩充(a)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。

使用一元算符

inttoreal把整型值转换成相等的实型值,以使得前缀形式中的+的两个操作对象是同类型的。

答:

(a):

产生式

语义规则

EE1+T

IF(E1.type=integer)and(T.type=integer)THEN

E.type:

=integer

ELSE

E.type:

=real

ET

E.type:

=T.type

Tnum.num

T.type:

=real

Tnum

T.type:

=integer

(b):

产生式

语义规则

EE1+T

IF(E1.type=integer)and(T.type=integer)THENBEGIN

E.type:

=integer

Print('+',E1.val,T.val)

END

ELSEBEGIN

E.type:

=real

IFE1.type=integerTHEN

Begin

E1.type:

=real

E1.val:

=inttoreal(E1.val)

End

IFT.type:

=integerTHEN

Begin

T.type:

=real

T.val:

=inttoreal(T.val)

End

Print('+',E1.val,T.val)

END

ET

E.type:

=T.type

E.val:

=T.val

Tnum.num

T.type:

=real

T.val:

=num.numlexval

Tnum

T.type:

=integer

T.val:

=numlexval

10假设说明是由下列文法产生的:

XidL

L—,idL|:

T

T—integer|real

(a)建立一个翻译模式,把每一个标识符的类型加入到符号表中

(b)从(a)中的翻译模式构造一个预翻译程序。

答:

⑻:

产生式

翻译模式

Did

L

{D.Type:

=L.Type}

{addtype(id.entry,D.type)}

L,id

L1

{L.Type:

=L1.Type}

{addtype(id.entry,L.type)}

L:

T

{L.type:

=T.type}

Tinteger

{T.type:

=integer}

Treal

{T.type:

=real}

(b):

ProcedureD;

begin

Iflookahead=idthen

Begin

Match(id);

D.type=L;

addtype(id.entry,D.type)end

else

error

end

FunctionL:

DataType;

Begin

Iflookahead=','then

Begin

Match(',');

Iflookahead=idthen

begin

match(id);

L.Type=L;addtype(id.entry,L.type);return(L.type)

end

Else

error

End

Elseiflookahead=':

'then

Begin

Match(':

');

L.Type=T;return(L.Type)

end

else

error

End

FunctionT:

DataType;Begin

Iflookahead=integerthenBegin

Match(integer);return(integer)end

elseIflookahead=realthen

Begin

Match(real);return(real)end

else

error

end

11为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零

还是小于零)记录在属性E.sign中(属性值分别用POS或NEG表示)。

你可以假定所有的整数都不为零,这样就不用担心零的符号。

EE*E|+E|E|unsigned_integer

答:

_

EE1*E^ifE1.sign=E2.signthenEsign:

=POSelseE.sign:

=NEG}

E+E{E.sign:

=E1.sign}

EE1{ifE1.sign=POSthenE.sign:

=NEGelseE.sign:

=POS}

Eunsigned_integer{E.sign:

=POS}

12为下面文法写一个语法制导的定义,用S的综合属性val给出下面文法中S产生的二进制数的值。

例如,输入101.101时,

S.val:

=5.625

(不得修改文法。

SL.R|L

LLB|B

RBR|B

B0|1

答:

S

L.R

S.val

:

=L.

val+R.

val

S

L

S.val

:

=L.

val

L

L1B

L.

val:

=

=L1.val

2+B.val

L

B

L.val

:

=B.

val

R

BR1

R.

val:

=(R

1.val+B.val)/2

R

B

R.

val:

=B.

val/2

B

0

B.

val:

=0

B

1

B.

val:

=1

13试问下面的程序将有怎样的输出?

分别假定:

(a)传值调用(call-by-value);

(b)弓丨用调用(call-by-referenee);

(c)复制恢复(copy-restore);

(d)传名调用(call-by-name)。

programmain(input,output);

procedurep(x,y,z);

begin

y:

=y+1;

z:

=z+x;

end;

begin

a:

=2;

b:

=3;

p(a+b,a,a);

printa

end.

答:

1).传地址:

所谓传地址是指把实在参数的地址传递给相应的形式参数。

在过程段中每

个形式参数都有一对应的单元,称为形式单元。

形式单元将用来存放相应的实在参数的地址。

当调用一个过程时,调用段必须领先把实在参数的地址传递到一个为被调用段可以拿得到的

地方。

当程序控制转入被调用段之后,被调用段首先把实参地址捎进自己相应的形式单元中,

过程体对形式参数的任何引用1或赋值都被处理成对形式单元的间接访问。

当调用段工作完毕返回时,形式单元(它们都是指示器)所指的实在参数单元就持有所指望的值。

2).传结果:

和“传地址”相似(但不等价)的另一种参数传递力法是所谓“传结果”。

这种方法

的实质是,每个形式参数对应有两个申元,第1个单元存放实参的地址,第2个单元

存放实参的值。

在过程体中对形参的任何引用或赋值都看成是对它的第2个单元的直接访

问。

但在过程工作完毕返回前必须把第2个单元的内容行放到第1个单元所指的那个实参单

元之中。

3).传值:

所谓传值,是一种简单的参数传递方法。

调用段把实在参数的值计算出来并

存放在一个被调用段可以拿得到的地方。

被调用段开始丁作时,首先把这些值抄入形式中元

中,然后就好像使用局部名一样使用这些形式单元。

如果实在参数不为指示器,那末,在被调用段中无法改变实参的值。

4).传名:

所谓传名,是一种特殊的形一一实参数结合方式。

解释“传名”参数的意义:

过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把其中任一出现的形式

参数都替换成相应的实在参数(文字替换)。

它与采用“传地址”或“传值”的方式所产生的结果均不相同。

(a)2;

(b)8;

(c)7;

(d)9。

14对以下的Pascal程序画出过程c第二次被激活时的运行栈,控制链和访问链。

说明在c中如何访问变量X。

programenv;

procedurea;

varx:

integer;procedureb;procedurec;

beginx:

=2;bend;{procedurec}begincend;{procedureb}beginbend;{procedurea}

beginaend.{main}

答:

env

I■aaBm'i■■■■■■■ivm■■■■■■■■«■BMarnmaai

controllink

accesslink

controllink

accesslink

x

-b

controllink

accesslink

controllinkaccesslink

controllink

accesslink

controllink

accesslink

说明:

c中沿着存取链向前走两步,到过程a的活动记录中就可以访问到变量x。

15下面给出一个C语言程序及其在SPARC/SUNT作站上经某编译器编译后的运行结果。

从运行结果看,函数func中4个局部变量i1,j1,f1,e1的地址间隔和它们类型的大小是一致的,而4

个形式参数i,j,f,e的地址间隔和它们的类型的大小不一致,试分析不

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

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

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

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