编译实验指导书Word格式文档下载.docx
- 文档编号:19273385
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:48
- 大小:113.50KB
编译实验指导书Word格式文档下载.docx
《编译实验指导书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译实验指导书Word格式文档下载.docx(48页珍藏版)》请在冰豆网上搜索。
-
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;
a:
=x;
b:
=y;
z:
=0;
whileb>
0do
begin
ifoddbthenz:
=z+a;
a:
=2*a;
=b/2;
end
end;
proceduredivide;
varw;
r:
q:
w:
whilew>
ydo
q:
=2*q;
=w/2;
ifw<
=rthen
begin
r:
=r-w;
q:
=q+1;
end;
proceduregcd;
varf,g;
f:
g:
whilef<
gdo
iff<
gtheng:
=g-f;
ifg<
fthenf:
=f-g;
x:
=m;
y:
=n;
callmultiply;
=25;
=3;
calldivide;
=34;
=36;
callgcd;
end.
四、实验报告要求
1、写出编程思路;
3、写出所使用的测试数据及结果;
五、上交
实验三算符优先分析器(综合性实验)
掌握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)进栈
ProcedureFirstVT;
Begin
for对每个非终结符P和终结符ado
F[P,a]=false
for对每个形如P→a…或P→Qa…的产生式do
Insert(P,a)
whilestack非空
栈顶项出栈,记为(Q,a)
for对每条形如P→Q…的产生式do
insert(P,a)
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<
a;
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
条件
odd+-(identnumber
thendo
表达式
+-(identnumber
)Rendthendo
项
identnumber(
)R+-endthendo
因子
)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
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<
stdio.h>
#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*/"
/*11*/"
Undeclaredidentifier."
/*12*/"
Illegalassignment."
/*13*/"
/*14*/"
Theremustbeanidentifiertofollowthe'
call'
/*15*/"
Aconstantorvariablecannotbecalled."
/*16*/"
then'
/*17*/"
end'
/*18*/"
do'
/*19*/"
Incorrectsymbol."
/*20*/"
Relativeoperatorsexpected."
/*21*/"
Procedureidentifiercannotbeinanexpression."
/*22*/"
)'
/*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"
charname[MAXIDLEN+1];
intkind;
intvalue;
}comtab;
comtabtable[TXMAX];
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*************/
stdlib.h>
stdarg.h>
#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->
elem<
s2->
elem)
{
p->
elem=s1->
elem;
s1=s1->
}
else
elem=s2->
s2=s2->
}
while(s1)
s1=s1->
while(s2)
s2=s2->
p->
next=NULL;
returns;
}//uniteset
voidsetinsert(symsets,intelem)
snode*p=s;
snode*q;
while(p->
next&
next->
elem)
q=(snode*)malloc(sizeof(snode));
q->
elem=elem;
next=p->
next=q;
}//setinsert
symsetcreateset(intelem,.../*SYM_NULL*/)
va_listlist;
s=(snode*)malloc(sizeof(snode));
s->
va_start(list,elem);
while(elem)
setinsert(s,elem);
elem=va_arg(list,int);
va_end(list);
}//createset
voiddestroyset(symsets)
while(s)
p=s;
s=s->
free(p);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)