小型编译程序高级语言到四元式的编译_第1页
小型编译程序高级语言到四元式的编译_第2页
小型编译程序高级语言到四元式的编译_第3页
小型编译程序高级语言到四元式的编译_第4页
小型编译程序高级语言到四元式的编译_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、小型编译程序:高级语言到四元式的编译#include "stdio.h" /*如果使用TC的话,需要配置头文件路径*/#include "string.h"#define ACC -2/*/#define sy_if 0#define sy_then 1#define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#define S

2、11#define L 12#define tempsy 15#define EA 18 /*E and*/#define E0 19 /E or*/#define plus 34#define times 36#define becomes 38#define op_and 39#define op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 57/*/char ch='0' /*从字符缓冲区读取当前字符*/in

3、t count=0; /*词法分析结果缓冲区计数器*/static char spelling10="" /*存放识别的字*/static char line81="" /*一行字符缓冲区,最多80个字符*/char *pline; /*字符缓冲区指针*/static char ntab110010; /*变量名表,共100项,每项长度10*/struct ntabint tc; /*真值*/int fc; /*假值*/ntab2200; /*在布尔表达式E中保存有关布尔变量的真、假值*/int label=0; /*指向ntab2的指针*/struct

4、 rwords /*存放临时变量的表的定义*/char sp10;int sy;/*(保留字表)匹配表的结构,用来与输入缓冲区中的单词进行匹配*/*匹配表初始化,大小为10*/struct rwords reswords10="if",sy_if,"do",sy_do,"else",sy_else,"while",sy_while,"then",sy_then,"begin",sy_begin,"end",sy_end,"and",op

5、_and,"or",op_or,"not",op_not;struct aaint sy1; /*存放名字*/int pos; /*存放名字所对应的地址*/buf1000, /*词法分析结果缓冲区*/n, /*读取二元式的当前字符*/n1, /*当前表达式中的字符*/E, /*非终结符*/sstack100, /*算术或布尔表达式加工处理使用的符号栈*/ibuf100, /*算术或布尔表达式使用的缓冲区*/stack1000; /*语法分析加工处理使用的符号栈*/struct aa oth; /*四元式中空白位置*/struct fourexpchar

6、op10;struct aa arg1;struct aa arg2;int result;fexp200; /*四元式的结构定义*/int ssp=0; /*指向sstack栈指针*/struct aa *pbuf=buf; /*指向词法分析缓冲区的指针*/int nlength=0; /*词法分析中记录单词的长度*/int lnum=0; /*源程序行数记数,源程序长度*/int tt1=0; /*变量名表指针*/FILE *cfile; /*源程序文件,为结束符*/*FILE *mfile;*/int newt=0; /*临时变量计数器*/int nxq=100; /*nxq指向下一个形

7、成的四元式的地址*/*每次执行gen()时,地址自动增1*/ int lr; /*扫描LR分析表1过程中保存的当前状态值*/int lr1; /*扫描LR分析表2或表3所保存的当前状态值*/int sp=0; /*查找LR分析表时状态栈的栈顶指针*/int stack1100; /*状态栈1的定义*/int sp1=0; /*状态栈1的栈顶指针*/int num=0; /*算术或布尔表达式缓冲区指针*/struct llint nxq1; /*记录下一条四元式的地址*/int tc1; /*真值链*/int fc1; /*假值链*/labelmark10; /*记录语句嵌套层次的数组,*/*即

8、记录嵌套中每层的布尔表达式E的首地址*/int labeltemp10; /*记录语句嵌套层次的数组,*/*即记录每层else之前的四元式地址*/int pointmark=-1, /*labelmark数组指针*/pointtemp=-1; /*labeltemp数组指针*/int sign=0; /*sign=1,为赋值语句;sign=2,为布尔表达式。*/*程序语句LR分析表*/static int action1913=/*0*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,-1,-1,/*1*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,

9、-1,/*2*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1,/*3*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,/*4*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8,/*5*/ -1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1,/*6*/ -1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,/*7*/ -1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1,/*8*/ -1,-1,-1,-1,-1,-1,12,-1,-

10、1,-1,-1,-1,-1,/*9*/ -1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1,/*10*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1,/*11*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1,/*12*/ -1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1,/*13*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16,/*14*/ -1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,/*15*/ -1,-1,102,-1

11、,-1,-1,102,-1,102,-1,102,-1,-1,/*16*/ -1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1,/*17*/ 2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1,/*18*/ -1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1;/*算术表示式的LR分析表*/static int action1107=/*0*/ 3,-1,-1,2,-1,-1,1,/*1*/ -1,4,5,-1,-1,ACC,-1,/*2*/ 3,-1,-1,2,-1,-1,6,/*3*/ -1,104,104,-1

12、,104,104,-1,/*4*/ 3,-1,-1,2,-1,-1,7,/*5*/ 3,-1,-1,2,-1,-1,8,/*6*/ -1,4,5,-1,9,-1,-1,/*7*/ -1,101,5,-1,101,101,-1,/*8*/ -1,102,102,-1,102,102,-1,/*9*/ -1,103,103,-1,103,103,-1;/*布尔表示式的LR分析表*/static int action21611=/*0*/ 1,-1,4,-1,5,-1,-1,-1,13,7,8,/*1*/ -1,2,-1,101,-1,101,101,101,-1,-1,-1,/*2*/ 3,-1,

13、-1,-1,-1,-1,-1,-1,-1,-1,-1,/*3*/ -1,-1,-1,102,-1,102,102,102,-1,-1,-1,/*4*/ 1,-1,4,-1,5,-1,-1,-1,11,7,8,/*5*/ 1,-1,4,-1,5,-1,-1,-1,6,7,8,/*6*/ -1,-1,-1,104,-1,9,10,104,-1,-1,-1,/*7*/ 1,-1,4,-1,5,-1,-1,-1,14,7,8,/*8*/ 1,-1,4,-1,5,-1,-1,-1,15,7,8,/*9*/ 105,-1,105,-1,105,-1,-1,-1,-1,-1,-1,/*10*/ 107,-1

14、,107,-1,107,-1,-1,-1,-1,-1,-1,/*11*/ -1,-1,-1,12,-1,9,10,-1,-1,-1,-1,/*12*/ -1,-1,-1,103,-1,103,103,103,-1,-1,-1,/*13*/ -1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1,/*14*/ -1,-1,-1,106,-1,9,10,106,-1,-1,-1,/*15*/ -1,-1,-1,108,-1,9,10,108,-1,-1,-1;/*从文件读一行到缓冲区*/void readline(char ch1;pline=line;ch1=fgetc(cfile;

15、while(ch1!='n'*pline=ch1;pline+;ch1=fgetc(cfile; *pline='0'pline=line;/*从缓冲区读取一个字符*/void readch(if(ch='0'readline(;lnum+;ch=*pline;pline+;/*标识符和关键字的识别*/find(char spelint ss1=0;int ii=0;while(ss1=0&&(ii if(!strcmp(spel,ntab1ii ss1=1;ii+;if(ss1=1 return ii-1;else return

16、 -1;void identifier(int iii=0,j,k;int ss=0;k=0;dospellingk=ch;k+;readch(;while(ch>='a'&&(ch<='z'|(ch>='0'&&(ch<='9'pline-;spellingk='0'while(ss=0&&(iii<10if(!strcmp(spelling,reswordsiii.sp ss=1;iii+;/*关键字匹配*/if(ss=1bufcou

17、nt.sy1=reswordsiii-1.sy;elsebufcount.sy1=ident;j=find(spelling;if(j=-1bufcount.pos=tt1;strcpy(ntab1tt1,spelling;tt1+;nlength+;else bufcount.pos=j;count+;for(k=0;k<10;k+ spellingk=' '/*数字的识别*/void number(int ivalue=0;int digit;dodigit=ch-'0'ivalue=ivalue*10+digit;readch(;while(ch&g

18、t;='0'&&(ch<='9'bufcount.sy1=intconst;bufcount.pos=ivalue;count+;pline-;/*扫描主函数*/void scan(while(ch!=''switch(chcase ' ' :break;case 'a' :case 'b' :case 'c' :case 'd' :case 'e' :case 'f' :case 'g' :cas

19、e 'h' :case 'i' :case 'j' :case 'k' :case 'l' :case 'm' :case 'n' :case 'o' :case 'p' :case 'q' :case 'r' :case 's' :case 't' :case 'u' :case 'v' :case 'w' :case 'x'

20、; :case 'y' :case 'z' :identifier(;break;case '0' :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case '7' :case '8' :case '9' :number(;break;case '<' :readch(;if(ch='='buf

21、count.pos=0;elseif(ch='>' bufcount.pos=4;elsebufcount.pos=1;pline-;bufcount.sy1=rop;count+;break;case '>' :readch(;if(ch='='bufcount.pos=2;elsebufcount.pos=3;pline-;bufcount.sy1=rop;count+;break;case '(' :bufcount.sy1=lparent;count+;break;case '' :bufcou

22、nt.sy1=rparent;count+;break;case '#' :bufcount.sy1=jinghao;count+;break;case '+' :bufcount.sy1=plus;count+;break;case '*' :bufcount.sy1=times;count+;break;case ':' :readch(;if(ch='='bufcount.sy1=becomes;count+;break;case '=' :bufcount.sy1=rop;bufcount.

23、pos=5;count+;break;case '' :bufcount.sy1=semicolon;count+;break;readch(;bufcount.sy1=-1;/*/void readnu(if(pbuf->sy1>=0n.sy1=pbuf->sy1;n.pos=pbuf->pos;pbuf+;/*中间变量的生成*/newtemp(newt+;return newt;/*生成四元式*/gen(char op1,struct aa arg11,struct aa arg22,int result1strcpy(fexpnxq.op,op1;

24、fexpnxq.arg1.sy1=arg11.sy1;fexpnxq.arg1.pos=arg11.pos;fexpnxq.arg2.sy1=arg22.sy1;fexpnxq.arg2.pos=arg22.pos;fexpnxq.result=result1;nxq+;return nxq-1;/*布尔表示式的匹配*/merg(int p1,int p2int p;if(p2=0 return p1;elsep=p2;while(fexpp.result!=0 p=fexpp.result;fexpp.result=p1;return p2;void backpatch(int p,int

25、tint tempq;int q;q=p;while(q!=0tempq=fexpq.result;fexpq.result=t;q=tempq;/*/change1(int chanswitch(chancase ident:case intconst:return 0;case plus:return 1;case times:return 2;case lparent:return 3;case rparent:return 4;case jinghao:return 5;case tempsy:return 6;default:return 100;change2(int chansw

26、itch(chancase ident:case intconst:return 0;case rop:return 1;case lparent:return 2;case rparent:return 3;case op_not:return 4;case op_and:return 5;case op_or:return 6;case jinghao:return 7;case tempsy:return 8;case EA:return 9;case E0:return 10;default:return 100;/*赋值语句的分析*/void lrparse1(int num int

27、 lr1;lr1=action1stack1sp1change1(n1.sy1;if(lr1=-1printf("n算术表达式或赋值语句出错!n"getchar(;/exit(0;if(lr1<10&&(lr1>=0sp1+;stack1sp1=lr1;if(n1.sy1!=tempsyssp+;num+;sstackssp.sy1=n1.sy1;sstackssp.pos=n1.pos;n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse1(num;if(lr1>=100&&(lr1,

28、105switch(lr1case 100:break;case 101:E.pos=newtemp(;gen("+",sstackssp-2,sstackssp,E.pos+100;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 102:E.pos=newtemp(;gen("*",sstackssp-2,sstackssp,E.pos+100;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp

29、1-3;break;case 103:E.pos=sstackssp-1.pos;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 104:E.pos=sstackssp.pos;sp1-;break;n1.sy1=tempsy; /*归约后为非终结符*/n1.pos=E.pos;lrparse1(num;if(lr1=ACC&&(stack1sp1=1gen(":=",sstackssp,oth,ibuf0.pos;ssp=ssp-3;sp1=sp1-3;/*布尔

30、表达式的分析*/lrparse2(int numint templabel;lr1=action2stack1sp1change2(n1.sy1;if(lr1=-1if(sign=2 printf("nwhile语句出错!n"if(sign=3 printf("nif语句出错!n"getchar(;/ exit(0;if(lr1<16&&(lr1>=0sp1+;stack1sp1=lr1;ssp+;sstackssp.sy1=n1.sy1;sstackssp.pos=n1.pos;if(n1.sy1!=tempsy&&

31、amp;(n1.sy1!=EA&&(n1.sy1!=E0 num+;n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse2(num;if(lr1>=100&&(lr1<109switch(lr1case 100:break;case 101:ntab2label.tc=nxq;ntab2label.fc=nxq+1;gen("jnz",sstackssp,oth,0;gen("j",oth,oth,0;sp1-;ssp-;label+;n1.sy1=tempsy;break

32、;case 102:ntab2label.tc=nxq;ntab2label.fc=nxq+1;switch(sstackssp-1.poscase 0:gen("j<=",sstackssp-2,sstackssp,0;break;case 1:gen("j<",sstackssp-2,sstackssp,0;break;case 2:gen("j>=",sstackssp-2,sstackssp,0;break;case 3:gen("j>",sstackssp-2,sstackssp,

33、0;break;case 4:gen("j<>",sstackssp-2,sstackssp,0;break;case 5:gen("j=",sstackssp-2,sstackssp,0;break;gen("j",oth,oth,0;ssp=ssp-3;sp1=sp1-3;label+;n1.sy1=tempsy;break;case 103: /*B->(B*/label=label-1;ssp=ssp-3;sp1=sp1-3;label+;n1.sy1=tempsy;break;case 104: /*B-&

34、gt;not B*/label=label-1;templabel=ntab2label.tc;ntab2label.tc=ntab2label.fc;ntab2label.fc=templabel;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=tempsy;break;case 105: /*A->B and*/backpatch(ntab2label-1.tc,nxq;label=label-1;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=EA;break;case 106: /*B->AB*/label=label-2;ntab2

35、label.tc=ntab2label+1.tc;ntab2label.fc=merg(ntab2label.fc,ntab2label+1.fc;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=tempsy;break;case 107: /*0->B or*/backpatch(ntab2label-1.fc,nxq;label=label-1;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=E0;break;case 108: /*B->0B */label=label-2;ntab2label.fc=ntab2label+1.fc;n

36、tab2label.tc=merg(ntab2label.tc,ntab2label+1.tc;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=tempsy;break;lrparse2(num;if(lr1=ACC return 1;else return 0;/* 测试字符是否为表达式中的值(不包括";") */test(int valueswitch(valuecase intconst:case ident:case plus:case times:case becomes:case lparent:case rparent:case rop:c

37、ase op_and:case op_or:case op_not:return 1;default:return 0;/*/lrparse( /*程序语句处理*/int i1=0;int num=0;/*指向表达式缓冲区*/if(test(n.sy1if(stacksp.sy1=sy_while sign=2;elseif(stacksp.sy1=sy_if sign=3;else sign=1;doibufi1.sy1=n.sy1;ibufi1.pos=n.pos;readnu(;i1+;while(test(n.sy1;/*把表达式放入缓冲区*/ibufi1.sy1=jinghao;pb

38、uf-;/*指针后退1,需要吗?*/sstack0.sy1=jinghao;ssp=0;/*符号栈底的初始化*/if(sign=1 /*赋值语句处理*/sp1=0;stack1sp1=0;/*状态栈1的栈底初始化*/num=2;/*指向 := */n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse1(num;n.sy1=a;/*当前文法符号置为a(赋值语句)*/if(sign=2|(sign=3 /*布尔表达式处理*/pointmark+;labelmarkpointmark.nxq1=nxq;sp1=0;stack1sp1=0;num=0;n1.sy1

39、=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse2(num;labelmarkpointmark.tc1=ntab2label-1.tc;labelmarkpointmark.fc1=ntab2label-1.fc;/*在处理完E后,要回填真值链*/backpatch(labelmarkpointmark.tc1,nxq;n.sy1=e;/*当前文法符号置为e(布尔表达式)*/lr=actionstacksp.posn.sy1;printf("stack%d=%dttn=%5dttlr=%dn",sp,stacksp.pos,n.sy1,lr;

40、if(lr<19&&(lr>=0 /*移进*/sp+;stacksp.pos=lr;stacksp.sy1=n.sy1;readnu(;lrparse(;if(lr<=106&&(lr>=100 /*归约*/switch(lrcase 100: /*S'->S*/break;case 101: /*S->if e then S else S*/printf("S->if e then Selse S 归约n"sp=sp-6;n.sy1=S;/*归约完if后,填then后的无条件转移语句)*/f

41、explabeltemppointtemp.result=nxq;pointtemp-;if(stacksp.sy1=sy_thengen("j",oth,oth,0;backpatch(labelmarkpointmark.fc1,nxq;pointtemp+;labeltemppointtemp=nxq-1;pointmark-;if(stacksp.sy1=sy_dogen("j",oth,oth,labelmarkpointmark.nxq1;backpatch(labelmarkpointmark.fc1,nxq;break;case 102:

42、 /*S->while e do S*/printf("S->while e do S 归约n" sp=sp-4;n.sy1=S;pointmark-;if(stacksp.sy1=sy_dogen("j",oth,oth,labelmarkpointmark.nxq1;backpatch(labelmarkpointmark.fc1,nxq;fexplabeltemppointtemp.result=nxq;if(stacksp.sy1=sy_thengen("j",oth,oth,0;fexplabelmarkpoin

43、tmark.fc1.result=nxq;pointtemp+;labeltemppointtemp=nxq-1;break;case 103: /*S->begin L end*/printf("S->begin L end 归约n"sp=sp-3;n.sy1=S;if(stacksp.sy1=sy_thengen("j",oth,oth,0;backpatch(labelmarkpointmark.fc1,nxq;pointtemp+;labeltemppointtemp=nxq-1;if(stacksp.sy1=sy_dogen(&qu

44、ot;j",oth,oth,labelmarkpointmark.nxq1;backpatch(labelmarkpointmark.fc1,nxq;getchar(;break;case 104: /*S->a*/printf("S->a 归约n"sp=sp-1;n.sy1=S;if(stacksp.sy1=sy_thengen("j",oth,oth,0;backpatch(labelmarkpointmark.fc1,nxq;pointtemp+;labeltemppointtemp=nxq-1;if(stacksp.sy1=

45、sy_dogen("j",oth,oth,labelmarkpointmark.nxq1;backpatch(labelmarkpointmark.fc1,nxq;break;case 105: /*L->S*/printf("L->S 归约n"sp=sp-1;n.sy1=L;break;case 106: /*L->S;L*/printf("L->S;S 归约n"sp=sp-3;n.sy1=L;break;getchar(;pbuf-;lrparse(;if(lr=ACC return ACC;else return 0;/*disp1*/void disp1(int temp1=0;printf("n*词法分析结果*n"for(temp1=0;temp1 printf("%5dt%5dn",buftemp1.sy1,buftemp1.pos;if(temp1=20printf("

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论