编译实验指导书.docx

上传人:b****6 文档编号:6266240 上传时间:2023-01-05 格式:DOCX 页数:48 大小:113.50KB
下载 相关 举报
编译实验指导书.docx_第1页
第1页 / 共48页
编译实验指导书.docx_第2页
第2页 / 共48页
编译实验指导书.docx_第3页
第3页 / 共48页
编译实验指导书.docx_第4页
第4页 / 共48页
编译实验指导书.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

编译实验指导书.docx

《编译实验指导书.docx》由会员分享,可在线阅读,更多相关《编译实验指导书.docx(48页珍藏版)》请在冰豆网上搜索。

编译实验指导书.docx

编译实验指导书

编译原理实验指导书

实验一源程序的输入和预处理

一、实验目的

掌握字符处理的方法,理解设计为独立子程序的好处,为词法分析做好准备。

二、实验内容

首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符号并为一个;去掉注释。

假定要处理的语言采用自由格式书写,空白符作为分隔符,可以使用注解,用/*……*/或者{……}标识,但注解不能插在单词内部,注解要在一行内结束,若一行结束,没有遇到注释后面的结束标记,自动认为注释也结束。

三、实验报告要求

1、写出编程思路、源代码;

2、写出上机调试时发现的问题,以及解决的过程;

3、写出所使用的测试数据;

4、谈谈体会。

四、上交

1、实验报告;

2、程序源文件(老师检查)。

实验二词法分析器(设计性实验)

一、实验目的

掌握词法分析的概念,设计方法,熟悉高级语言中词法的定义,词法分析程序的编写。

二、实验内容

实现PL/0语言的词法分析器,输入源程序,并对其进行扫描和分解,识别出单词符号。

PL/0语言词法规则定义如下:

1、唯一的数据类型是整型;

2、算符和界符有:

’+’,’-‘,’*’,’/’,’>’,’>=’,’<’,’<=’,’=’,’<>’,

’.‘,’(’,’)’,’,’,’;’,’:

=’

3、标识符以字母开头,后跟字母和/或数字组成的字符串;

4、关键字作为保留字,如下所示:

const,var,procedure,call,begin,end,if,then,while,do,odd

三、实验要求

1、单词符号输出形式为(种别编码,单词符号自身值)

种别编码如下:

类别

单词

编码

类别

单词

编码

类别

单词

编码

关键字

const

1

odd

11

<>

21

var

2

算符和界符

+

12

.

22

procedure

3

-

13

23

call

4

*

14

24

begin

5

/

15

25

end

6

>

16

;

26

if

7

>=

17

:

=

27

then

8

<

18

标识符

id

28

while

9

<=

19

整数

num

29

do

10

=

20

附加:

1、检查是否有误单词(ERROR),编码(30)

2、词法分析器要求设计成为独立的子程序。

3、测试数据举例:

constm=7,n=85;

varx,y,z,q,r;

proceduremultiply;

vara,b;

begin

a:

=x;b:

=y;z:

=0;

whileb>0do

begin

ifoddbthenz:

=z+a;

a:

=2*a;b:

=b/2;

end

end;

proceduredivide;

varw;

begin

r:

=x;q:

=0;w:

=y;

whilew>ydo

begin

q:

=2*q;w:

=w/2;

ifw<=rthen

begin

r:

=r-w;

q:

=q+1;

end;

end

end;

proceduregcd;

varf,g;

begin

f:

=x;

g:

=y;

whilef<>gdo

begin

iff

=g-f;

ifg

=f-g;

end

end;

begin

x:

=m;y:

=n;callmultiply;

x:

=25;y:

=3;calldivide;

x:

=34;y:

=36;callgcd;

end.

四、实验报告要求

1、写出编程思路;

2、写出上机调试时发现的问题,以及解决的过程;

3、写出所使用的测试数据及结果;

4、谈谈体会。

五、上交

1、实验报告;

2、程序源文件(老师检查)。

实验三算符优先分析器(综合性实验)

一、实验目的

掌握FirstVT和LastVT集的算法,算符优先分析表的构造算法及其分析过程,并掌握中间代码产生过程。

二、实验内容

算术表达式和赋值语句的文法可以是(可以根据需要适当改变):

S→i=E

E→E+E|E-E|E*E|E/E|(E)|i

根据算符优先分析法,将赋值语句进行语法语义分析,翻译成等价的一组基本操作,每一基本操作用四元式表示。

三、实验过程和指导

1、构造FirstVT和LastVT集合

给定一个上下文无关文法,根据算法设计一个程序,求文法中每个非终结符的FirstVT集和LastVT集。

算符描述如下:

/*求FirstVT集的算法*/

PROCEDUREinsert(P,a);

IFnotF[P,a]then

begin

f[p,a]=true;(P,a)进栈

end;

ProcedureFirstVT;

Begin

for对每个非终结符P和终结符ado

F[P,a]=false

for对每个形如P→a…或P→Qa…的产生式do

Insert(P,a)

whilestack非空

begin

栈顶项出栈,记为(Q,a)

for对每条形如P→Q…的产生式do

insert(P,a)

end;

end.

2、构造算符优先分析表

依据文法和求出的相应FirstVT和LastVT集生成算符优先分析表。

算法描述如下:

for每个形如P->X1X2…Xn的产生式do

fori=1ton-1do

begin

ifXi和Xi+1都是终结符then

Xi=Xi+1

ifi<=n-2,Xi和Xi+2是终结符,但Xi+1为非终结符then

Xi=Xi+2

ifXi为终结符,Xi+1为非终结符then

forFirstVT中的每个元素ado

Xi

ifXi为非终结符,Xi+1为终结符then

forLastVT中的每个元素ado

a>Xi+1;

end;

3、构造算符优先分析和中间代码产生过程。

四、输入数据和输出数据

若输入文法:

E->E+T|T

T->T*F|F

F->(E)|i

将得到如下所示的FirstVT集和LastVT数组。

输出的优先关系表如下:

若输入的语句是

a:

=b+c*(e-a)

则输出:

(-,e,a,T1)

(*,c,T1,T2)

(+,b,T2,T3)

(:

=,T3,_,a)

实验四PL/0编译器的分析和理解

一、实验目的

通过阅读PL/0编译器,理解整个编译过程,掌握编译每一阶段的实现方法;并加深对理论知识的认识。

二、实验要求

阅读PL/0编译器,完成以下任务:

1、画出整个程序流程图及各编译阶段处理的流程图;

2、写出每一编译阶段实现中用到的主要理论,及对该理论的理解;

3、写出你的心得和体会。

4、就上述部分写出实验报告,A4纸(10页以内)。

(初步这样定)

三、实验提示

(一)PL/0语言的语法图

1、程序

2、程序体

3、语句序列

4、语句

5、条件

6、表达式

7、项

8、因子

(二)语法分析

这里采用递归下降的方法来设计PL/0编译器。

以下我们给出该语言的FIRST和FOLLOW集合。

非终结符(S)

FIRST(S)

FOLLOW(S)

程序体

constvarprocedureidentcallifbeginwhile

.;

语句

identcallbeginifwhile

.;end

条件

odd+-(identnumber

thendo

表达式

+-(identnumber

.;)Rendthendo

identnumber(

.;)R+-endthendo

因子

identnumber(

.;)R+-*/endthendo

注:

表中R代表六个关系运算符。

(三)PL/0处理机的指令集

根据PL/0语言的要求,它包括以下的指令:

(1)LIT/*将常数置于栈顶*/

(2)LOD/*将变量值置于栈顶*/

(3)STO/*将栈顶的值赋与某变量*/

(4)CAL/*用于过程调用的指令*/

(5)INT/*在数据栈中分配存贮空间*/

(6)JMP,JPC/*用于if,while语句的条件或无条件控制转移指令*/

(7)OPR/*一组算术或逻辑运算指令*/

F

L

A

上述指令的格式由三部分组成:

其中,f,l,a的含义见下表:

F

L

a

INT

———

常量

LIT

———

常量

LOD

层次差

数据地址

STO

层次差

数据地址

CAL

层次差

程序地址

JMP

———

程序地址

JPC

———

程序地址

OPR

———

运算类别

(四)PL/0语言编译器源程序

PL/0语言编译器源程序包括如下C程序文件,PL0.h、PL0.c、set.h和set.c。

/************PL0.h*************/

#include

#defineNRW11//numberofreservedwords

#defineTXMAX500//lengthofidentifiertable

#defineMAXNUMLEN14//maximumnumberofdigitsinnumbers

#defineNSYM10//maximumnumberofsymbolsinarrayssymandcsym

#defineMAXIDLEN10//lengthofidentifiers

#defineMAXADDRESS32767//maximumaddress

#defineMAXLEVEL32//maximumdepthofnestingblock

#defineCXMAX500//sizeofcodearray

#defineMAXSYM30//maximumnumberofsymbols

#defineSTACKSIZE1000//maximumstorage

enumsymtype

{

SYM_NULL,

SYM_IDENTIFIER,

SYM_NUMBER,

SYM_PLUS,

SYM_MINUS,

SYM_TIMES,

SYM_SLASH,

SYM_ODD,

SYM_EQU,

SYM_NEQ,

SYM_LES,

SYM_LEQ,

SYM_GTR,

SYM_GEQ,

SYM_LPAREN,

SYM_RPAREN,

SYM_COMMA,

SYM_SEMICOLON,

SYM_PERIOD,

SYM_BECOMES,

SYM_BEGIN,

SYM_END,

SYM_IF,

SYM_THEN,

SYM_WHILE,

SYM_DO,

SYM_CALL,

SYM_CONST,

SYM_VAR,

SYM_PROCEDURE

};

enumidtype

{

ID_CONSTANT,ID_VARIABLE,ID_PROCEDURE

};

enumopcode

{

LIT,OPR,LOD,STO,CAL,INT,JMP,JPC

};

enumoprcode

{

OPR_RET,OPR_NEG,OPR_ADD,OPR_MIN,

OPR_MUL,OPR_DIV,OPR_ODD,OPR_EQU,

OPR_NEQ,OPR_LES,OPR_LEQ,OPR_GTR,

OPR_GEQ

};

typedefstruct

{

intf;//functioncode

intl;//level

inta;//displacementaddress

}instruction;

//////////////////////////////////////////////////////////////////////

char*err_msg[]=

{

/*0*/"",

/*1*/"Found':

='whenexpecting'='.",

/*2*/"Theremustbeanumbertofollow'='.",

/*3*/"Theremustbean'='tofollowtheidentifier.",

/*4*/"Theremustbeanidentifiertofollow'const','var',or'procedure'.",

/*5*/"Missing','or';'.",

/*6*/"Incorrectprocedurename.",

/*7*/"Statementexpected.",

/*8*/"Followthestatementisanincorrectsymbol.",

/*9*/"'.'expected.",

/*10*/"';'expected.",

/*11*/"Undeclaredidentifier.",

/*12*/"Illegalassignment.",

/*13*/"':

='expected.",

/*14*/"Theremustbeanidentifiertofollowthe'call'.",

/*15*/"Aconstantorvariablecannotbecalled.",

/*16*/"'then'expected.",

/*17*/"';'or'end'expected.",

/*18*/"'do'expected.",

/*19*/"Incorrectsymbol.",

/*20*/"Relativeoperatorsexpected.",

/*21*/"Procedureidentifiercannotbeinanexpression.",

/*22*/"Missing')'.",

/*23*/"Thesymbolcannotbefollowedbyafactor.",

/*24*/"Thesymbolcannotbeasthebeginningofanexpression.",

/*25*/"Thenumberistoogreat.",

/*26*/"",

/*27*/"",

/*28*/"",

/*29*/"",

/*30*/"",

/*31*/"",

/*32*/"Therearetoomanylevels."

};

//////////////////////////////////////////////////////////////////////

charch;//lastcharacterread

intsym;//lastsymbolread

charid[MAXIDLEN+1];//lastidentifierread

intnum;//lastnumberread

intcc;//charactercount

intll;//linelength

intkk;

interr;

intcx;//indexofcurrentinstructiontobegenerated.

intlevel=0;

inttx=0;

charline[80];

instructioncode[CXMAX];

char*word[NRW+1]=

{

"",/*placeholder*/

"begin","call","const","do","end","if",

"odd","procedure","then","var","while"

};

intwsym[NRW+1]=

{

SYM_NULL,SYM_BEGIN,SYM_CALL,SYM_CONST,SYM_DO,SYM_END,

SYM_IF,SYM_ODD,SYM_PROCEDURE,SYM_THEN,SYM_VAR,SYM_WHILE

};

intssym[NSYM+1]=

{

SYM_NULL,SYM_PLUS,SYM_MINUS,SYM_TIMES,SYM_SLASH,

SYM_LPAREN,SYM_RPAREN,SYM_EQU,SYM_COMMA,SYM_PERIOD,SYM_SEMICOLON

};

charcsym[NSYM+1]=

{

'','+','-','*','/','(',')','=',',','.',';'

};

#defineMAXINS8

char*mnemonic[MAXINS]=

{

"LIT","OPR","LOD","STO","CAL","INT","JMP","JPC"

};

typedefstruct

{

charname[MAXIDLEN+1];

intkind;

intvalue;

}comtab;

comtabtable[TXMAX];

typedefstruct

{

charname[MAXIDLEN+1];

intkind;

shortlevel;

shortaddress;

}mask;

FILE*infile;

//EOFPL0.h

/************SET.h*************/

#ifndefSET_H

#defineSET_H

typedefstructsnode

{

intelem;

structsnode*next;

}snode,*symset;

symsetphi,declbegsys,statbegsys,facbegsys,relset;

symsetcreateset(intdata,.../*SYM_NULL*/);

voiddestroyset(symsets);

symsetuniteset(symsets1,symsets2);

intinset(intelem,symsets);

#endif

//EOFset.h

/************SET.c*************/

#include

#include

#include

#include"set.h"

symsetuniteset(symsets1,symsets2)

{

symsets;

snode*p;

s=p=(snode*)malloc(sizeof(snode));

while(s1&&s2)

{

p->next=(snode*)malloc(sizeof(snode));

p=p->next;

if(s1->elemelem)

{

p->elem=s1->elem;

s1=s1->next;

}

else

{

p->elem=s2->elem;

s2=s2->next;

}

}

while(s1)

{

p->next=(snode*)malloc(sizeof(snode));

p=p->next;

p->elem=s1->elem;

s1=s1->next;

}

while(s2)

{

p->next=(snode*)malloc(sizeof(snode));

p=p->next;

p->elem=s2->elem;

s2=s2->next;

}

p->next=NULL;

returns;

}//uniteset

voidsetinsert(symsets,intelem)

{

snode*p=s;

snode*q;

while(p->next&&p->next->elem

{

p=p->next;

}

q=(snode*)malloc(sizeof(snode));

q->elem=elem;

q->next=p->next;

p->next=q;

}//setinsert

symsetcreateset(intelem,.../*SYM_NULL*/)

{

va_listlist;

symsets;

s=(snode*)malloc(sizeof(snode));

s->next=NULL;

va_start(list,elem);

while(elem)

{

setinsert(s,elem);

elem=va_arg(list,int);

}

va_end(list);

returns;

}//createset

voiddestroyset(symsets)

{

snode*p;

while(s)

{

p=s;

s=s->next;

free(p);

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

当前位置:首页 > 自然科学 > 化学

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

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