第十一章小型编译程序第十一章小型编译程序11.1高级语言到四元式的编译程序PAS11.2四元式到汇编语言程序的编译程序COMPILER第十一章小型编译程序11.1高级语言到四元式的编译程序PAS/****************************************************//*pas.c *//*高级语言到四元式 *//***************************************************/第十一章小型编译程序#include″tdio.h″#include″string.h″#defineACC-2/****************************************/#definesy_if0#definesy_then1#definesy_else2第十一章小型编译程序#definesy_while3#definesy_begin4#definesy_do5#definesy_end6#definea7#definesemicolon8#definee9第十一章小型编译程序#definejinghao10#defineS11#defineL12#definetempsy15#defineEA18/*Eand*/#defineEO19/*Eor*/第十一章小型编译程序#defineplus34#definetimes36#definebecomes38#defineop_and39#defineop_or40#defineop_not41#definerop42#definelparent4#definerparent49#defineident56#defineintconst57第十一章小型编译程序/******************************************/charch=′\0′;/*当前字符*/intcount=0;staticcharspelling[10]={″″};/*存放识别的字*/staticcharline[81]={″″};/*一行字符缓冲区*/char*pline;/*字符缓冲区指针*/第十一章小型编译程序staticcharntab1[100][10];structntab{inttc;intfc;}ntab2[200];intlabel=0;/*存放临时变量的表的定义*/第十一章小型编译程序structrwords{charsp[10];intsy;};/*存放文件的结构*/structrwordsreswords[10]={{″if″,sy_if},{″do″,sy_do},{″else″,sy_else},{″while″,sy_while},{″then″,sy_then},第十一章小型编译程序{″begin″,sy_begin},{″end″,sy_end},{″and″,op_and},{″or″,op_or},{″not″,op_not}};structaa{intsy1;intpos;}buf[1000];/*词法分析结果缓冲区*/第十一章小型编译程序n;/*当前字符*/n1;/*当前表达式中的字符*/E;/*非终结符*/sstack[100];/*符号栈*/ibuf[100],stack[1000];structaaoth;第十一章小型编译程序structfourexp{charop[10];structaaarg1;structaaarg2;intresult;}fexp[200];/*四元式的结构*/intssp=0;/*指向sstack[100]*/第十一章小型编译程序structaa*pbuf=buf;/*指向词法分析缓冲区*/intnlength=0;intlnum=0;/*源程序长度*/inttt1=0;FILE*cfile;FILE*mfile;第十一章小型编译程序/*********************************************************/intnewt=0;/*临时变量*/intnxq=100;/*nxq指向下一个形成的四元式的地址*/intlr;intlr1;intsp=0;第十一章小型编译程序/*状态栈定义*/intstack1[100];intsp1=0;/*状态栈1的定义*/intnum=0;structll{intnxq1;inttc1;intfc1;}labelmark[10];第十一章小型编译程序intlabeltemp[10];intpointmark=-1,pointtemp=-1;intsign=0;/*sign=1,表达式为赋值语句;sign=2,表达式为布尔表达式。*//***********************************************/staticintaction[19][13]=/*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,-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,-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,-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}};第十一章小型编译程序staticintaction1[10][7]=/*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*/{104,104,104,104,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*/{101,101,5,101,101,101,-1},/*8*/{102,102,102,102,102,102,-1},/*9*/{103,103,103,103,103,103,-1}};第十一章小型编译程序staticintaction2[16][11]=/*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,-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,105,-1,-1,-1},/*10*/{107,-1,107,-1,107,-1,-1,107,-1,-1,-1},第十一章小型编译程序/*11*/{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},/*12*/{-1,103,-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}};/****************从文件读一行到缓冲区***********************************/第十一章小型编译程序readline(){charch1;pline=line;ch1=getc(cfile);while(ch1!=′\n′){*pline=ch1;pline++;ch1=getc(cfile);}第十一章小型编译程序*pline=′\0′;pline=line;}/*****************************从缓冲区读一个字符**********************/readch(){if(ch== ′\0′){readline();lnum++;}第十一章小型编译程序ch=*pline;pline++;}/****************标志符和关键字的识别************************************/find(charspel[]){intss1=0;intii=0;while((ss1==0)&&(iinlength)){第十一章小型编译程序if(!strcmp(spel,ntab1[ii]))ss1=1;ii++;}if(ss1==1)returnii-1;elsereturn-1;}第十一章小型编译程序identifier(){intiii=0,j,k;intss=0;k=0;do{spelling[k]=ch;k++;readch();}while(((ch=′a′)&&(ch=′z′))||((ch=′0′)&&(ch=′9′)));第十一章小型编译程序pline--;spelling[k]=′\0′;while((ss==0)&&(iii10)){if(!strcmp(spelling,reswords[iii].sp))ss=1;iii++;}第十一章小型编译程序/*关键字匹配*/if(ss==1){buf[count].sy1=reswords[iii-1].sy;}else{buf[count].sy1=ident;j=find(spelling);if(j== -1)第十一章小型编译程序{buf[count].pos=tt1;strcpy(ntab1[tt1],spelling);tt1++;nlength++;}elsebuf[count].pos=j;}count++;for(k=0;k10;