2022年编译原理实验 .pdf
《2022年编译原理实验 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理实验 .pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理实验报告一.实 验题目使用编译构造工具实现一个扩充PL0 语言的编译器。二. 实验成员 * 0456* * 0456* * 0456* 三. 实验内容 使用编译构造工具实现一个扩充PL0 语言的编译器。扩 充PL0语 言 是 在PL0语 言 的 基 础 上 增 加 对 整 型 一 维 数 组 的 支 持 、 扩 充IF-THEN-ELSE条件语句、增加REPEAT 语句、支持带参数的过程和增加注释,如下所示:(1)整型一维数组,数组的定义格式为:VAR (:) z其中上界和下界可以是整数或者常量标识名。z访问数组元素的时候,数组下标是整型的表达式,包括整数、 常量或者变量和它们的组合。
2、例如,假设a 是常量, b 是整型变量, c 是数组,这些访问方式都应该可以使用:c(1),c(a),c(b),c(b+c(1) 。(2)扩充条件语句,格式为::= IF THEN ELSE (3)增加 REPEAT 语句,格式为: := REPEAT UNTIL (4) 支持带参数(传值参数 )的过程,定义和调用形式如下: := PROCEDURE (, ) ; := CALL ( , ) (5) 注释单行注释以 开始,以 结束,注释内容不包括 和 . 四系统设计 PL/0 语言的编译过程采用一趟扫描的方式,以语法分析程序为核心, 词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需
3、要读单词就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外, 用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系;用出错1名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 24 页 - - - - - - - - - 处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质;当源程序编译正确时, PL/0 编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序要求输入数据和输出运行结果。本程序编译和解
4、释执行的结构图如下所示:PL/0 编译程序词法分析的设计与实现识别的单词:保留字或关键字:如:BEGIN 、 END 、 IF 、 THEN等运算符:如: +、-、* 、/、 :=、#、=、=等标识符:用户定义的变量名、常数名、过程名常数:如: 10、25、100 等整数界符:如: , 、. 、 ; 、( 、) 等词法分析完成的功能1. 滤空格2. 识别保留字3. 识别标识符5. 拼数6. 拼复合词7. 输出源程序PL/0 编译程序语法分析的设计与实现语法分析程序采用自顶向下的语法分析递归子程序法:对应每个非终结符语法单元,编一个独立的处理过程(或子程序)。语法分析从读入第一个单词开始,由非终
5、结符(即开始符)出发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相应的处理过程,从语法描述图看,也就进2名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 24 页 - - - - - - - - - 入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。当遇到描述图中是终结符时, 则判断当前读入的单词是否与图中的终结符相匹配,若匹配, 再读取下一个单词继续分析。 遇到分支点时, 将当前的单词与分支点上多个终结符逐个相比较,若都不匹配时可能是
6、进入下一个非终结符语法单位或是出错。3名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 24 页 - - - - - - - - - 4名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 24 页 - - - - - - - - - 5名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心
7、整理 - - - - - - - 第 5 页,共 24 页 - - - - - - - - - 语法分析,语句部分的处理int statement(bool* fsys,int* ptx,int lev) int i,cx1,cx2; bool nxtlevsymnum; if(sym=ident) i=position(id,*ptx); if(i=0) error(11); else if(tablei.kind!=variable) error(12); i=0; else 6名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
8、 名师精心整理 - - - - - - - 第 6 页,共 24 页 - - - - - - - - - getsymdo; if(sym=becomes) getsymdo; else error(13); memcpy(nxtlev,fsys,sizeof(bool)*symnum); expressiondo(nxtlev,ptx,lev); if(i!=0) gendo(sto,lev-tablei.level,tablei.adr); /if(i=0) else if(sym=readsym) getsymdo; if(sym!=lparen) error(34); else do
9、getsymdo; if(sym=ident) i=position(id,*ptx); else i=0; if(i=0) error(35); 7名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 24 页 - - - - - - - - - else gendo(opr,0,16); gendo(sto,lev-tablei.level,tablei.adr); getsymdo; while(sym=comma); if(sym!=rparen) error(33);
10、 while(!inset(sym,fsys) getsymdo; else getsymdo; else if(sym=writesym) getsymdo; if(sym=lparen) do getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevrparen=true; nxtlevcomma=true; expressiondo(nxtlev,ptx,lev); gendo(opr,0,14); while(sym=comma); if(sym!=rparen) error(33); else getsymdo; 8名师资料总
11、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 24 页 - - - - - - - - - gendo(opr,0,15); else if(sym=callsym) getsymdo; if(sym!=ident) error(14); else i=position(id,*ptx); if(i=0) error(11); else if(tablei.kind=procedur) gendo(cal,lev-tablei.level,tablei.adr); else er
12、ror(15); getsymdo; else if(sym=ifsym) getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevthensym=true; nxtlevdosym=true; conditiondo(nxtlev,ptx,lev); if(sym=thensym) 9名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 24 页 - - - - - - - - - getsymdo; else err
13、or(16); cx1=cx; gendo(jpc,0,0); statementdo(fsys,ptx,lev); codecx1.a=cx; if(sym=thensym) getsymdo; else error(16); cx1=cx; gendo(jpc,0,0); statementdo(fsys,ptx,lev); if( sym=elsesym ) codecx1.a=cx+1; statementdo(fsys,ptx,lev); else codecx1.a=cx; else if(sym=beginsym) getsymdo; memcpy(nxtlev,fsys,siz
14、eof(bool)*symnum); nxtlevsemicolon=true; nxtlevendsym=true; statementdo(nxtlev,ptx,lev); while(inset(sym,statbegsys)|sym=semicolon) if(sym=semicolon) getsymdo; else 10名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 24 页 - - - - - - - - - error(10); statementdo(
15、nxtlev,ptx,lev); if(sym=endsym) getsymdo; else error(17); else if(sym=whilesym) cx1=cx; getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevdosym=true; conditiondo(nxtlev,ptx,lev); cx2=cx; gendo(jpc,0,0); if(sym=dosym) getsymdo; else error(18); statementdo(fsys,ptx,lev); gendo(jmp,0,cx1); codec
16、x2.a=cx; else if( sym=repeatsym ) cx1=cx; getsymdo; statementdo(fsys,ptx,lev); 11名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 24 页 - - - - - - - - - if( sym=untilsym ) getsymdo; condition(fsys,ptx,lev); gendo(jpc,0,cx1); else memset(nxtlev,0,sizeof(bool)*sym
17、num); testdo(fsys,nxtlev,19); return 0; 表达式分析处理int expression(bool* fsys,int* ptx,int lev) enum symbol addop; bool nxtlevsymnum; if(sym=plus|sym=minus) addop=sym; getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevplus=true; nxtlevminus=true; termdo(nxtlev,ptx,lev); if(addop=minus) gendo(opr,0
18、,1); else memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevplus=true; nxtlevminus=true; 12名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 24 页 - - - - - - - - - termdo(nxtlev,ptx,lev); while(sym=plus|sym=minus) addop=sym; getsymdo; memcpy(nxtlev,fsys,sizeof(bool)
19、*symnum); nxtlevplus=true; nxtlevminus=true; termdo(nxtlev,ptx,lev); if(addop=plus) gendo(opr,0,2); else gendo(opr,0,3); return 0; /expression 项分析处理过程int term(bool* fsys,int* ptx,int lev) enum symbol mulop; bool nxtlevsymnum; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevtimes=true; nxtlevslash=tru
20、e; factordo(nxtlev,ptx,lev); while(sym=times|sym=slash) mulop=sym; getsymdo; factordo(nxtlev,ptx,lev); if(mulop=times) gendo(opr,0,4); else gendo(opr,0,5); 13名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 24 页 - - - - - - - - - return 0; /term 因子分析处理int factor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年编译原理实验 2022 编译 原理 实验
限制150内