编译原理4 (2).doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:29 大小:152KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译原理4 (2).doc

编译原理4(2).doc

预览

免费试读已结束,剩余 19 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

南昌航空大学实验报告二0一0年十一月十七日课程名称:编译原理实验名称:扩充的PL\0程序班级:08061130姓名:胡作堃同组人:指导教师评定:签名:实验目的进一步熟悉编译程序的整体框架,给出整个编译程序的流程结构,用C或vc++语言编写程序;并将编制的编译程序进行调试、实现PL/0编译程序。实验要求(1)根据所选的程序设计语言,修改并调试。(2)举出例子程序,在程序中进行编译。(3)用此编译程序对有关语句进行编译,并输出目标指令。(4)书写出合格的实验报告。实验步骤1.输入文件中变量的声明形如:vara,b,c;以var保留字开始,不同变量以”,”分隔,最后以”;”结束。2.read语句格式为read(a)或者read(a,b);3.write语句格式为write(a),括号里面没有字符串常量,注意与书后的形如write(‘a=’,a)是不相同的。4.的声明形如:”procedureproname;”不含参数表。5.一维数组形如:变量类型array数组名[数组下标]。6.条件语句形如:if<条件>then<语句>{;else,语句>}7.扩充的记录型数据类型形如:for循环语句及带参数的过程。参考源代码#include<cstdio>#include<set>#include<cstring>#include<iostream>#include<iostream>#include<vector>#ifndefWIRTH_ZYC_#defineWIRTH_ZYC_usingnamespacestd;constintnorw=16;//no.ofreservedwords保留字的个数constinttxmax=100;//lengthofidentifiertable标示符表的长度(容量)constintal=10;//lengthofidentifiers标示符的最大长度constintnmax=14;//max.no.ofdigitsinnumbers数字的最大长度constintamax=2047;//maximumaddress寻址空间constintlevmax=3;//maximumdepthofblocknesting最大允许的块嵌套层数constintcxmax=200;//sizeofcodearray类PCODE目标代码数组长度(可容纳代码行数)constintlineLength=82;//行缓冲区长度typedefenum{NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,ELSESYM,REPEATSYM,UNTILSYM}symbol;//symobl类型标识了不同类型的词汇typedefcharalfa[al+1];//alfa类型用于标识符typedefenum{CONSTANT,VARIABLE,PROCEDURE,ARRAY}obj0;//三种标识符的类型typedefenum{LIT,OPR,LOD,STO,CAL,INT,JMP,JPC}fct;//functionstypedefset<symbol>symset;structinstruction{fctf;//functioncodeintl;//level,cann'tbigthanlevmaxinta;//displacementaddress,cann'tbigthanamax};//类PCODE指令类型,包含三个字段:指令f、层差l和另一个操作数a/********************************************lit0,a:loadconstanta**opr0,a:executeoperationa**lodl,a:loadvariablel,a**stol,a:storevariablel,a**call,a:callprocedureaatlevell**int0,a:incrementt-registerbya**jmp0,a:jumptoa**jpc0,a:jumpconditionaltoa********************************