一个语法分析程序并生成四元式中间代码

上传人:夏** 文档编号:508034124 上传时间:2022-10-31 格式:DOCX 页数:10 大小:32.39KB
返回 下载 相关 举报
一个语法分析程序并生成四元式中间代码_第1页
第1页 / 共10页
一个语法分析程序并生成四元式中间代码_第2页
第2页 / 共10页
一个语法分析程序并生成四元式中间代码_第3页
第3页 / 共10页
一个语法分析程序并生成四元式中间代码_第4页
第4页 / 共10页
一个语法分析程序并生成四元式中间代码_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《一个语法分析程序并生成四元式中间代码》由会员分享,可在线阅读,更多相关《一个语法分析程序并生成四元式中间代码(10页珍藏版)》请在金锄头文库上搜索。

1、编写一个语法分析程序并生成四元式中间代码班级学号姓名:指导老师:一、实验目的:1、学习编译的基本原理;2、巩固课堂学习的知识;3、会对最基本的语句进行分析,转换成四元式;二、实验内容:编制一个大型程序,可以对小型的EL语言程序进行翻译,可以处理最基本的语句如:if 语句, while 语句等;三、实验硬件和软件平台:INTEL C433MHz Cpu128Mb SDRAMTPWMicrosoft Windows XP SP1四、步骤和算法描述:1、先对输入的语句进行词法分析,建立各种表格;2、对程序进行语法分析,建立四元式; 对部分程序语句进行翻译,生成相应的四元式,及出错处理 五 源程序:p

2、rogram elcompiler(input,output,f);const reser=20; recordname:alfa; type alfa=packed array1.9 of char;level:integer; opr=(jmp,prt,jeq,jne,jgt,jlt,jge,jle,add,sub,mul,did,ass,umi,jsr,ret,inp,out,xxx);case cat:obj of中间代码的操作码符号2 : (val:integer);instruction=record四元式18,7: (addr:integer)op:opr;end;arg1,ar

3、g2,result:integer;mnemonic:arrayopr ofarray1.3end;of char;symset=set of 0.45;obj=1.45;cp,tp,new,nxq:integer;varreserve:array0.reser ofalfa;保留字表cc,ii,i,j,k,num:integer;token,id:alfa;line:array1.80ofchar;kind,l,err:integer;输入缓冲区filename:string;ch,ch1:char;外部文件名quad:array0.300 of instruction;f:text;四元式

4、表proceduregetchar;table:array0.100of从扫描缓冲区取一字符符号表beginif cc=iithenif k10 then如果已取到缓冲区的最后,则从外部 begin k:=k+1; tokenk:=ch end;getchar文件再读一行until not(ch ina.z,0.9);beginretract;if eof(f) thenif k10 thenbeginrepeatwriteln(program incomplete!);k:=k+1;close(f); exittokenk:= end;until k=10;cc:=0;ii:=0;id:=t

5、oken; i:=0; j:=reser; cc is input to bufferpointer;repeat k:=(i+j) div 2; ii is output pointer from buffer;对半查找保留字表while not eoln(f) doif id=reservek then i:=k+1read(f,linecc);until ij;write(linecc)if i-1j then kind:=k else kind:=21end;变量的类别readln(f); writeln;end elsecc:=cc+1; linecc:= ;if ch in 0.9

6、 thenend;beginii:=ii+1; ch:=lineii整数end;k:=0; num:=0; kind:=22;proceduregetnbc;repeat读取非空字符num:=10*num+(ord(ch)-ord(0);label l;k:=k+1; getnbc;beginuntil not(ch in 0.9); retractl:getchar;end elsewhile ch= do getchar;beginif ch= thencase ch ofbegin repeat getchar until ch=;goto+,-:beginl end 跳过注解ch1:=

7、ch; retract;end;retract; getchar;procedureretract;if (ch=) or (ch=()退回一 字符 then区分单目双目算符beginif ch1=+ thenii:=ii-1kind:=32 else kind:=33end;else if ch1=+ thenprocedurescanner;kind:=34 else kind:=35;词法分析过程getcharbeginend;getnbc;*:kind:=36;if ch ina.zthen/:kind:=37;symbol is id or reserve,:kind:=23;beg

8、in.:kind:=26;k:=0;:begin writeln; kind:=24repeatend;(:kind:=27;):kind:=28;:kind:=29;:kind:=30;=:kind:=38;: begingetnbc;if ch= then kind:=44else begin retract;kind:=25 endend;#:kind:=47;:kind:=45;:kind:=46;:begingetnbc;if ch= then kind:=43 else begin retract; kind:=40 endend; then kind:=41else begin

9、kind:=39;retract endend;else;end;endend;procedure error(n:integer);出错处理 beginwrite(*, ,ii-2,s,n:2); err:=err+l;case n of0:writeln(lack program);l:writeln(ought to= );2:writeln(lack=);3:writeln(expected indent);4:writeln(expected factor);5:writeln(expeced ,;);6:writeln(expected begin or functin);7:wr

10、iteln(expected statement) ;8:writeln(expectedbegin); 9:writeln(expect ,); l0:writeln(num is too big); ll:writeln(indent isnt specify); l2:writeln(cant assign to const); l3:writeln(expeced :=); l4:writeln(expected (); l6:writeln(ought to then); l7:writeln(expected endor;); l8:writeln(ought to do); l9

11、:writeln(expected ;on.); 20:writeln(expeced rop); 22:writeln(expected ); 23:writeln(may be to lack*); 25:writeln(to lack type specify); 26:writeln(indent double define) else ;endend;proceduretest(sl,s2:symset;m:integer); 测试单词的合法 beginif not(kind in sl) thenbeginerror(m); sl:=sl+s2;while not (kind in

12、 sl) do scanner end end;procedure gen(op:opr;agl,ag2,result:integer); 生成中间代码begin quadcp.op:=op;quadcp.argl:=agl;quadcp.arg2:=ag2;quadcp.result:=result;cp:=cp+l;nxq:=cp;end;procedure blk(lev,tp:integer;sys:symset);var tp0,cp0,dp:integer; chain:integer;function entry(iden:alfa):integer; var i:integer

13、;begini:=tp;table0.name:=iden;while tablei.nameiden do i:=i+l; entry:=iend;procedurefill(k:obj);填写符号表var i:integer;beginfor i:=tp0 to tp do tp0 本分程序符号表首址if tablei.name=id thenbegin error(26); exit end;tp:=tp+1;with tabletp dobegin name:=id; cat:=k; level:=lev;case k of2: begin if num22767thenconst 说 明 begin e

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号