


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、小型编译程序:高级语言到四元式的编译#inelude "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_do5#define sy_end6#define a7#define semicolon 8#define e9#define jinghao10#define S11#define
2、 L12#define tempsy15#define EA18 /*E and*/#define E019 /E or*/#define plus34#define times36#define becomes 38#define op_and39#define op_or40#define op_not41#define rop42#define lparent48#define rparent49#define ident56#define intconst57*char ch='0'int count=0;static char spelling10="&qu
3、ot; /* static char line81=""char *pline;/* 从字符缓冲区读取当前字符*/* 词法分析结果缓冲区计数器*/存放识别的字 */* 一行字符缓冲区,最多 80 个字符 */* 字符缓冲区指针 */static char ntab110010; struct ntab int tc; int fc;ntab2200; int label=0;/* 真值 */* 假值 */* 在布尔表达式 E 中保存有关布尔变量的真、假值 */ /* 指向 ntab2 的指针 */* 变量名表,共 100 项,每项长度 10*/* 存放临时变量的表的定义 *
4、/struct 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&q
5、uot;,op_and, "or",op_or, "not",op_not;struct aaint sy1;/*存放名字 */int pos;/*存放名字所对应的地址 */buf1000,/*词法分析结果缓冲区 */n,/* 读取二元式的当前字符 */n1,/* 当前表达式中的字符 */E,/* 非终结符 */sstack100,/* 算术或布尔表达式加工处理使用的符号栈*/ibuf100,/* 算术或布尔表达式使用的缓冲区 */stack1000;/* 语法分析加工处理使用的符号栈 */struct aa oth;/* 四元式中空白位置 */ str
6、uct fourexpchar 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;
7、/* 临时变量计数器 */int nxq=100; /*nxq 指向下一个形成的四元式的地址 */ /* 每次执行 gen ()时,地址自动增1*/int Ir;/*扫描LR分析表1过程中保存的当前状态值 */int lr1;/*扫描LR分析表2或表3所保存的当前状态值*/int sp=O;/*查找LR分析表时状态栈的栈顶指针*/int stack1100; int sp1=0;int num=0; struct llint nxq1;int tc1;int fc1; labelmark10;/*int labeltemp10;/*int pointmark=-1, pointtemp=-1;
8、int sign=0;/* 状态栈 1 的定义 */* 状态栈 1 的栈顶指针 */* 算术或布尔表达式缓冲区指针 */* 记录下一条四元式的地址 */* 真值链 */* 假值链 */* 记录语句嵌套层次的数组, */即记录嵌套中每层的布尔表达式E的首地址*/* 记录语句嵌套层次的数组, */ 即记录每层 else 之前的四元式地址 */*labelmark数组指针 */*labeltemp数组指针 */*程序语句LR分析表 */*sign=1 ,为赋值语句; sign=2 ,为布尔表达式。 */ static int action1913=/*0*/2,-1,-1,3,4,-1,-1,5,-
9、1,-1,-1,-1,-1,/*1*/-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-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
10、,-1,-1,-1,-1,-1,-1,/*8*/-1,-1,-1,-1,-1,-1,12,-1,-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,
11、-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,/*15*/ -1,-1,102,-1,-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,
12、ACC,-1,/*2*/ 3,-1,-1,2,-1,-1,6,/*3*/ -1,104,104,-1,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
13、*/ -1,2,-1,101,-1,101,101,101,-1,-1,-1,/*2*/ 3,-1,-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*/
14、 105,-1,105,-1,105,-1,-1,-1,-1,-1,-1,/*10*/ 107,-1,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;*从文件读一行到缓冲区*voi
15、d readline()char ch1; pline=line; ch1=fgetc(cfile); 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 spel)int ss1=0;int ii=0;while(ss1=0)&&(ii<n
16、length)if(!strcmp(spel,ntab1ii) ss1=1;ii+;if(ss1=1) return ii-1;else return -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)
17、&&(iii<10) if(!strcmp(spelling,reswordsiii.sp) ss=1; iii+;/* 关键字匹配 */if(ss=1) bufcount.sy1=reswordsiii-1.sy;elsebufcount.sy1=ident; j=find(spelling);if(j=-1)bufcount.pos=tt1; strcpy(ntab1tt1,spelling); tt1+;nlength+;else bufcount.pos=j; count+;for(k=0;k<10;k+) spellingk=' '*数字的
18、识别 *void number()int ivalue=0; int digit;dodigit=ch-'0' ivalue=ivalue*10+digit; readch();while(ch>='0')&&(ch<='9');bufcount.sy1=intconst;bufcount.pos=ivalue;count+; pline-;扫描主函数 */* void scan()while(ch!='')switch(ch)case ' ' : break;case 'a
19、39; : case 'b' : case 'c' : case 'd' : case 'e' : case 'f' : case 'g' : case 'h' : case 'i' : case 'j' : case 'k' : case 'l' : case 'm' : case 'n' : case 'o' : case 'p' : case '
20、;q' : case 'r' : case 's' : case 't' : case 'u' : case 'v' : case 'w' : case 'x' : case 'y' : case 'z' : identifier(); break;case '0' : case '1' : case '2' :case '3' :case '4' :case
21、39;5' :case '6' :case '7' :case '8' :case '9' : number(); break;case '<' : readch(); if(ch='=') bufcount.pos=0; elseif(ch='>') bufcount.pos=4; else bufcount.pos=1; pline-; bufcount.sy1=rop; count+; break;case '>' : readch()
22、; if(ch='=') bufcount.pos=2; else bufcount.pos=3; pline-; bufcount.sy1=rop; count+;break;case '(' : bufcount.sy1=lparent; count+;break;case ')' :bufcount.sy1=rparent;count+;break;case '#' :bufcount.sy1=jinghao; count+;break;case '+' : bufcount.sy1=plus; count+
23、; break;case '*' :bufcount.sy1=times; count+;break;case ':' :readch();if(ch='=')bufcount.sy1=becomes;count+;break;case '=' :bufcount.sy1=rop;bufcount.pos=5;count+;break;case '' :bufcount.sy1=semicolon;count+;break;readch();bufcount.sy1=-1;/* void readnu() if(p
24、buf->sy1>=0)n.sy1=pbuf->sy1;n.pos=pbuf->pos;pbuf+;*中间变量的生成 *newtemp()newt+;return newt;生成四元式 */* gen(char op1,struct aa arg11,struct aa arg22,int result1)strcpy(fexpnxq.op,op1);fexpnxq.arg1.sy1=arg11.sy1;fexpnxq.arg1.pos=arg11.pos;fexpnxq.arg2.sy1=arg22.sy1;fexpnxq.arg2.pos=arg22.pos; fe
25、xpnxq.result=result1;nxq+;return nxq-1;/*布尔表示式的匹配 */merg(int p1,int p2)int p;if(p2=0) return p1; else p=p2;while(fexpp.result!=0) p=fexpp.result; fexpp.result=p1;return p2;void backpatch(int p,int t)int tempq;int q;q=p;while(q!=0)tempq=fexpq.result; fexpq.result=t; q=tempq;/* change1(int chan)switch
26、(chan)case 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 chan)switch(chan)case ident:case intconst:return 0;case rop:return 1;case lparent:return 2;case rparent
27、: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 lr1; lr1=action1stack1sp1change1(n1.sy1);if(lr1=-1)printf("n 算术表达式或赋值语句出错! n"); getchar(
28、);/exit(0); if(lr1<10)&&(lr1>=0)sp1+; stack1sp1=lr1;if(n1.sy1!=tempsy) ssp+; num+;sstackssp.sy1=n1.sy1; sstackssp.pos=n1.pos;n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos; lrparse1(num);if(lr1>=100)&&(lr1,105)switch(lr1)case 100:break;case 101:E.pos=newtemp(); gen("+",ssta
29、ckssp-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=sp1-3;break;case 103:E.pos=sstackssp-1.pos; ssp=ssp-2; sstackssp.sy1=t
30、empsy; 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=1)gen(":=",sstackssp,oth,ibuf0.pos); ssp=ssp-3;sp1=sp1-3;*布尔表达式的分析*lrparse2(int num)int templabel;lr1=action2stack1sp1
31、change2(n1.sy1);if(lr1=-1)if(sign=2) printf("nwhile语句出错! n"); 语句出错! n");if(sign=3) printf("nif getchar();/ exit(0); if(lr1<16)&&(lr1>=0)sp1+; stack1sp1=lr1;ssp+;sstackssp.sy1=n1.sy1; sstackssp.pos=n1.pos;if(n1.sy1!=tempsy)&&(n1.sy1!=EA)&&(n1.sy1!=E0)
32、 num+; n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos; lrparse2(num);if(lr1>=100)&&(lr1<109)switch(lr1)case 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;case 102: ntab2label.tc
33、=nxq; ntab2label.fc=nxq+1; switch(sstackssp-1.pos)case 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,0); break;c
34、ase 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 10
35、4:/*B->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*/ la
36、bel=label-2;ntab2label.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; nt
37、ab2label.fc=ntab2label+1.fc; ntab2label.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 value) switch(value)case intconst:case ident:case plus:case times:case b
38、ecomes:case lparent: case rparent: case rop: case op_and: case op_or: case op_not: return 1;default: return 0; /*/ lrparse() /* 程序语句处理 */ int i1=0;int num=0;/* 指向表达式缓冲区 */ if(test(n.sy1) if(stacksp.sy1=sy_while) sign=2; else if(stacksp.sy1=sy_if) sign=3; else sign=1; do ibufi1.sy1=n.sy1; ibufi1.pos=
39、n.pos; readnu(); i1+;while(test(n.sy1);/* 把表达式放入缓冲区 */ ibufi1.sy1=jinghao; pbuf-;/* 指针后退 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 (赋值语句)*/i
40、f(sign=2)|(sign=3) /* 布尔表达式处理 */pointmark+;labelmarkpointmark.nxq1=nxq;sp1=0;stack1sp1=0;num=0;n1.sy1=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;/* 当前文法符
41、号置为 e (布尔表达式) */lr=actionstacksp.posn.sy1;printf("stack%d=%dttn=%5dttlr=%dn",sp,stacksp.pos,n.sy1,lr);if(lr<19)&&(lr>=0) /* 移进 */sp+;stacksp.pos=lr;stacksp.sy1=n.sy1;readnu();lrparse();if(lr<=106)&&(lr>=100) /* 归约 */switch(lr)case 100:/*S'->S*/break;case
42、101:/*S->if e then S else S*/printf("S->if e then Selse S归约 n");sp=sp-6;n.sy1=S;/* 归约完 if 后,填 then 后的无条件转移语句) */fexplabeltemppointtemp.result=nxq;pointtemp-;if(stacksp.sy1=sy_then)gen("j",oth,oth,0); backpatch(labelmarkpointmark.fc1,nxq); pointtemp+;labeltemppointtemp=nxq-1
43、;pointmark-;if(stacksp.sy1=sy_do)gen("j",oth,oth,labelmarkpointmark.nxq1); backpatch(labelmarkpointmark.fc1,nxq);break;case 102:/*S->while e do S*/printf("S->while e do S归约 n");sp=sp-4;n.sy1=S;pointmark-;if(stacksp.sy1=sy_do)gen("j",oth,oth,labelmarkpointmark.nxq1
44、); backpatch(labelmarkpointmark.fc1,nxq);fexplabeltemppointtemp.result=nxq;if(stacksp.sy1=sy_then)gen("j",oth,oth,0); fexplabelmarkpointmark.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(
45、stacksp.sy1=sy_then)gen("j",oth,oth,0); backpatch(labelmarkpointmark.fc1,nxq); pointtemp+;labeltemppointtemp=nxq-1;if(stacksp.sy1=sy_do) gen("j",oth,oth,labelmarkpointmark.nxq1); backpatch(labelmarkpointmark.fc1,nxq);getchar();break;case 104: /*S->a*/printf("S->a 归约 n&
46、quot;);sp=sp-1;n.sy1=S;if(stacksp.sy1=sy_then)gen("j",oth,oth,0); backpatch(labelmarkpointmark.fc1,nxq); pointtemp+;labeltemppointtemp=nxq-1;if(stacksp.sy1=sy_do)gen("j",oth,oth,labelmarkpointmark.nxq1); backpatch(labelmarkpointmark.fc1,nxq);break;case 105: /*L->S*/printf(&quo
47、t;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*词法分析结果);for(temp1=0;temp1<count;temp1+)printf("%5dt%5dn",buftemp1.sy1,buftemp1.pos);if(temp1=20)printf("Press any key to continuen");getchar(); getch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆农业职业技术学院《工程项目管理与技术经济分析》2023-2024学年第二学期期末试卷
- 2024年幼儿园大班年终工作总结
- 2025年保安工作计划范文(33篇)
- 2025法律服务工作计划例文(8篇)
- 初中生关于交通安全演讲稿(32篇)
- 2025年小学老师工作计划范文(9篇)
- 元宵节演讲稿100字
- 中学教师招聘-教师招聘考试《中学政治》考前押题5
- 2024中国电子器件制造行业影响因素分析
- 北郊污水处理厂、超细矿粉厂、净水厂认识实习报告
- 新教科版小学1-6年级科学需做实验目录
- 《智慧旅游认知与实践》课件-第九章 智慧旅行社
- 产业园规划建筑设计说明
- 现场快速反应跟踪管理看板
- 《建筑工程资料管理规程》DB34T918-2019
- 框架核心筒结构办公楼施工测量方案(12页)
- 整体机房维护方案及报价通用
- 北大金融学课程表
- 英国签证户口本翻译模板(共4页)
- 现金调拨业务
- 空白个人简历表格1
评论
0/150
提交评论