实验目的与要求Word下载.docx
- 文档编号:21302010
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:44
- 大小:32.17KB
实验目的与要求Word下载.docx
《实验目的与要求Word下载.docx》由会员分享,可在线阅读,更多相关《实验目的与要求Word下载.docx(44页珍藏版)》请在冰豆网上搜索。
/*VARIABLE,PROCEDUR:
*/
};
}TABLE[TXMAX];
(2)运行时存储组织和管理:
解释程序定义一个一维整型数组S作为运行栈,栈顶寄存器(指针)t,基址寄存器(指针)b,程序地址寄存器p,指令寄存器i。
在每个过程调用时在栈顶分配4个联系单元:
由于添加了返回值,所以当前过程的活动记录的栈顶为存放返回值的单元。
SL:
静态链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。
当一个过程引用包围它的过程(或主程序)所定义的标识符时,首先沿静态链跳过个数为层差的数据段,找到定义该标识符过程的数据段地址,再加上给此标识符分配的相对位置,就得出该标识符在整个数据区栈中的绝对位置。
DL:
动态链,指向调用该过程前正在运行过程的数据段基地址。
RA:
返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地址。
动态链和返回地址的作用是当一个过程运行结束后,为了恢复调用该过程前的执行状态而设置的。
(3)自顶向下的语法分析:
递归子程序法:
对应每个非终结符语法单元编一个独立的处理过程(或子程序)。
语法分析从读入第一个单词开始,由非终结符<
程序>
(即开始符)出发,沿语法描述图箭头所指出的方向进行分析。
当遇到非终结符时,则调用相应的处理过程,从语法描述图看,也就进入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。
当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,再读取下一个单词继续分析。
遇到分支点时,将当前的单词与分支点上多个终结符逐个相比较,若都不匹配时可能是进入下一个非终结符语法单位或是出错。
(4)中间代码表示:
由于添加了返回值,增加了一条指令DEL用于返回。
ret0,0与
OPR0,0的区别是ret0,0先把返回值放到活动记录的返回值单元,并把栈顶指针指向返回值单元,当被调用程序返回时,调用程序就可以在当前运行栈栈顶取得被调用程序的返回值。
四.测试用例
基本内容
1.正确符号测试程序:
test1
==========================COMPILEPL0==========================
0{正确符号测试程序TEST1-PL0}
***^0
***^7应是语句开始符
***^11标识符未说明
***^13赋值语句左部标识符后应是赋值号'
:
='
***^19语句后的符号不正确
2
2{CorrectSymbols}
2{Comment}
2{abcdefghijklmnopqrstuvwxyz
2ABCDEFGHIJKLMNOPQRSTUVWXYZ
21234567890!
"
#$%&
'
()*+,-./:
;
<
=>
?
@[\]_~`}
0JMP01
1INI03
2LIT00
3RET00
***^9程序结尾丢了句号'
.'
ERRORINPL/0PROGRAM
4.增加条件语句的ELSE子句
===========================COMPILEPL0==========================
0PROGRAMEOX1;
VARA,B,C;
BEGIN
2A:
=20;
4B:
=30;
6READ(C);
8WRITE(C);
11IFC<
50THENWRITE(A)
17ELSEWRITE(B);
22END.
1INI06
2LIT020
3STO03
4LIT030
5STO04
6OPR016
7STO05
8LOD05
9OPR014
10OPR015
11LOD05
12LIT050
13OPR010
14JPC019
15LOD03
16OPR014
17OPR015
18JMP022
19LOD04
20OPR014
21OPR015
22LIT00
23RET00
-----------------------------RUNPL0-----------------------------
56
56
30
-------------------------ENDPL0-----------------------------
五.设计心得:
1. 通过这个课程设计的学习使我更深地了解了编译原理及其应用。
2. 团体精神-互相合作很重要。
在做设计的过程中遇到了不明白的问题时与同宿舍的同学进行了讨论,可能在有些地方与之有类似之处,请老师理解!
3. 提高了自学能力,buildr 以前是没有怎么学过的,通过了这次的设计,也使多进一步掌握了buildrt的应用!
虽然课程设计不能独自一个人完成,但真的学到了许多!
六.源程序
/***PL0COMPILERWITHCODEGENERATION***/
//---------------------------------------------------------------------------
#include<
vcl.h>
#pragmahdrstop
#include"
Unit1.h"
#pragmapackage(smart_init)
#pragmaresource"
*.dfm"
TForm1*Form1;
intCOD=1;
//0为词法分析
intchoice=1;
//0为IF未改
constAL=10;
/*标示符的长度为10*/
constNORW=20;
/*保留字的个数为20*/
constTXMAX=100;
/*标示符表的最大长度为100*/
constNMAX=14;
/*数字最大位数为14*/
constAMAX=2047;
/*最大寻址为2047*/
constLEVMAX=3;
/*嵌套最大层数为3*/
constCXMAX=200;
/*代码数组最大为200*/
constNumOfSybol=43;
//定义关键保留字33个
typedefint*ERRORPOINT;
typedefenum{NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,
SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,
LPAREN,RPAREN,
QUOT,//单引号
COMMA,SEMICOLON,PERIOD,
BECOMES,
PLUSBECOMES,//+=
MINUSBECOMES,//-=
DOUBLEPLUS,//++
DOUBLEMINUS,//--
BEGINSYM,ENDSYM,IFSYM,THENSYM,
WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,
CONSTSYM,VARSYM,PROCSYM,PROGSYM,CHARSYM,
ELSESYM,//在此加了ELSE
FORSYM,//加了FOR
TOSYM,//加了TO
DOWNTOSYM,//加了DOWM
RETURN//加了RETURN
}SYMBOL;
/*词汇表,其中控制程序结构的保留字14个*/
char*SYMOUT[]={"
NUL"
"
IDENT"
NUMBER"
PLUS"
MINUS"
TIMES"
"
SLASH"
ODDSYM"
EQL"
NEQ"
LSS"
LEQ"
GTR"
GEQ"
LPAREN"
RPAREN"
QUOT"
//单引号
COMMA"
SEMICOLON"
PERIOD"
BECOMES"
PLUSBECOMES"
//+=
MINUSBECOMES"
//-=
DOUBLEPLUS"
//++
DOUBLEMINUS"
//--
BEGINSYM"
ENDSYM"
IFSYM"
THENSYM"
WHILESYM"
WRITESYM"
READSYM"
DOSYM"
CALLSYM"
CONSTSYM"
VARSYM"
PROCSYM"
PROGSYM"
CHARSYM"
ELSESYM"
//在此加了ELSE
FORSYM"
//加了FOR
TOSYM"
//加了TO
DOWNTOSYM"
//加了DOWM
RETURN"
//加了RETURN
typedefint*SYMSET;
//字符集;
typedefcharALFA[11];
typedefenum{CONSTANT,VARIABLE,PROCEDUR,CHARACTOR}OBJECTS;
typedefenum{LIT,OPR,LOD,STO,CAL,RET,INI,JMP,JPC}FCT;
typedefstruct{
FCTF;
/*函数命令*/
intL;
/*0..LEVMAXLEVEL*/
intA;
/*0..AMAXDISPLACEMENTADDR*/
}INSTRUCTION;
/*
LIT0A将常数值取到栈顶,A为常数值
LODLA将变量值取到栈顶,A为偏移量,L为层差
STOLA将栈顶内容送入某一变量单元中,A为偏移量,L为层差
CALLA调用过程,A为过程地址,L为层差
INT0A在运行栈中为被调用的过程开辟A个单元的数据区
JMP0A无条件跳转到A地址
JPC0A条件跳转,当栈顶布尔值非真则跳转到A地址,否则顺序执行
OPR00过程调用结束后,返回调用点并退栈
OPR01栈顶元素取反
OPR02次栈顶与栈顶相加,退两个栈元素,结果值进栈
OPR03次栈顶减去栈顶,退两个栈元素,结果值进栈
OPR04次栈顶乘以栈顶,退两个栈元素,结果值进栈
OPR05次栈顶除以栈顶,退两个栈元素,结果值进栈
OPR06栈顶元素的奇偶判断,结果值在栈顶
OPR07
OPR08次栈顶与栈顶是否相等,退两上栈元素,结果值进栈
OPR09次栈顶与栈顶是否不等,退两个栈元素,结果值进栈
OPR010次栈顶是否小于栈顶,退两个栈元素,结果值进栈
OPR011次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈
OPR012次栈顶是否大于栈顶,退两个栈元素,结果值进栈
OPR013次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈
OPR014栈顶值输出到屏幕
OPR015屏幕输出换行
OPR016从命令行读入一个输入置于栈顶
charCH;
/*最近读进的字符*/
SYMBOLSYM;
/*存放每个单词的类别,用内部编码形式表示*/
ALFAID;
/*存放用户所定义的标识符的值,即字符串的机内表示*/
intNUM;
/*用户所定义的数*/
intCC;
/*CHARACTERCOUNT*/
intLL;
/*缓冲器的长度*/
intCX;
/*CODE数组的下标索引*/
charLINE[81];
INSTRUCTIONCODE[CXMAX];
ALFAKWORD[NORW+1];
SYMBOLWSYM[NORW+1];
//存放保留字
SYMBOLSSYM['
^'
+1];
//在'
'
到'
才是可用
ALFAMNEMONIC[9];
SYMSETDECLBEGSYS,STATBEGSYS,FACBEGSYS;
//名称
//类型
/*常量*/
struct{
intLEVEL,ADR,SIZE;
/*变量或者过程*/
//即TABLE[100]
FILE*FIN,*FOUT;
//输入输出文件的指针
intERR;
//错误个数统计
StringERRORKIND[34]={"
常数说明中的'
写成'
//1
后应是数字"
//2
常数说明中的标识符后应是=号"
//3
CHAR,CONST,VAR,PROCEDURE后应为标识符"
//4
漏掉了'
'
或'
//5
过程说明后的符号不正确"
//6
应是语句开始符"
//7
程序体内语句部分的后跟符不正确"
//8
程序结尾丢了句号'
//9
语句之间漏了'
//10
标识符未说明"
//11
赋值语句中,赋值号左部标识符属性应是变量"
//12
赋值语句左部标识符后应是赋值号'
//13
CALL后应为标识符"
//14
CALL后标识符属性应为过程"
//15
条件语句中丢了'
THEN'
ELSE'
//16
丢了'
END'
//17
WHILE型循环语句中丢了'
DO'
//18
语句后的符号不正确"
//19
应为关系运算符"
//20
表达式内标识符属性不能是过程"
//21
表达式中漏掉右括号'
)'
//22
因子后的非法符号"
//23
表达式的开始符不能是此符号"
//24
FOR语句后应有TO或DOWN"
//25
字符类型不符"
//26
字符类型漏了'
单引号"
//27
READ函数内的标识符没定义"
//28
//~30
数越界"
//31
READ语句括号中的标识符不是变量"
//32
//33
//34
voidEXPRESSION(SYMSETFSYS,intLEV,int&
TX);
voidTERM(SYMSETFSYS,intLEV,int&
intSymIn(SYMBOLSYM,SYMSETS1){
returnS1[SYM];
}
SYMSETSymSetUnion(SYMSETS1,SYMSETS2){
SYMSETS=(SYMSET)malloc(sizeof(int)*NumOfSybol);
for(inti=0;
i<
NumOfSybol;
i++)
if(S1[i]||S2[i])S[i]=1;
elseS[i]=0;
returnS;
SYMSETSymSetAdd(SYMBOLSY,SYMSETS){
SYMSETS1;
S1=(SYMSET)malloc(sizeof(int)*NumOfSybol);
i++)S1[i]=S[i];
S1[SY]=1;
returnS1;
SYMSETSymSetNew(SYMBOLa){
SYMSETS;
inti,k;
S=(SYMSET)malloc(sizeof(int)*NumOfSybol);
for(i=0;
i++)S[i]=0;
S[a]=1;
SYMSETSymSetNew(SYMBOLa,SYMBOLb){
S[b]=1;
SYMSETSymSetNew(SYMBOLa,SYMBOLb,SYMBOLc){
S[c]=1;
SYMSETSymSetNew(SYMBOLa,SYMBOLb,SYMBOLc,SYMBOLd){
S[d]=1;
SYMSETSymSetNew(SYMBOLa,SYMBOLb,SYMBOLc,SYMBOLd,SYMBOLe){
S[e]=1;
SYMSETSymSetNew(SYMBOLa,SYMBOLb,SYMBOLc,SYMBOLd,SYMBOLe,SYMBOLf){
S[f]=1;
SYMSETSymSetNULL(){
inti,n,k;
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 目的 要求