编译程序.docx
- 文档编号:2398638
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:14
- 大小:17.79KB
编译程序.docx
《编译程序.docx》由会员分享,可在线阅读,更多相关《编译程序.docx(14页珍藏版)》请在冰豆网上搜索。
编译程序
下面是我设计的一个小型编译器,按照词法分析->语法分析->中间代码生成->代码优化四个步骤完成的,在visualc++6.0和Borlandc++4.5下通过。
#include
#include
#include
#include
#include
#definebuf256
#defineFalse0
#defineN256
#defineTrue1
intMiddlecodeId=0;//中间代码生成函数标志
intOptimizeId=0;//代码优化函数标志
typedefstruct//定义栈
{
intstatck[N][2];
inttop;
}sqs;
//*******************词法分析函数声明*************************************
charalphaprocess(charbuffer);
chardigitprocess(charbuffer);
charotherprocess(charbuffer);
//******************语法分析函数声明*************************************
voidfactor();
voidterm();
voidarithexp();
voidexp();
voidassign_stmt();
voidmatch();
voiderror();
//******************中间代码函数声明******************************************
voidinique(sqs*s);
intpush(sqs*s);
intpop(sqs*s);
voidmiddlecode();
voidprint();
voidoptimizecode();
//*****************************************************************************
//词法分析部分
//*****************************************************************************
FILE*fp;//源文件
char*p;
charfilename[10];
intopenfile=1;
intline=1;
interror1=0;
intsource[buf][2];
intsounum=0;
chardigittp[20];
//关键字
char*key[32]={"and","array","begin","bool","call","case","char","constant","do",
"else","end","false","for","if","input","integer","not","of","or","output","procedure",
"program","read","real","repeat","set","then","true","until","var","while","write"};
//符号表
char*character[21]={"+","-","*","/","(",")",":
=","<>","<=",">=","/*","*/","..",">",
"[","]",";",",","`","<","="};
//常量表
char*integer[buf];
//标志符表
char*label[10];
intconstnum=0,labelnum=0;
//以上有5张表,储存了所有的信息,其中2维数组source储存的源程序的程序内容,
//前面四张表的次序依次为:
保留字表为1,符号表为2,常数表为3,标志符表为4;
charalphaprocess(charbuffer)//关键字和标识符处理子函数;
{
intnewid=1,id=1;
inti=-1;
charalphatp[20];
while((isalpha(buffer))||(isdigit(buffer)))
{
alphatp[++i]=buffer;
buffer=fgetc(fp);
}
alphatp[i+1]='\0';
//寻找保留字
i=0;
intre=0;
while(i<32&&re==0)
{if(strcmp(key[i],alphatp)==0)
{//printf("\n\t保留字:
%s",key[i]);
source[sounum][0]=1;//将保留字的位置放入数组之中
source[sounum][1]=i;
sounum++;
id=0;re=1;
}
i++;
}
//标志符处理
if(id==1)
{for(i=0;i {if(strcmp(label[i],alphatp)==0) {source[sounum][0]=4;//将标志符的位置放入数组之中 source[sounum][1]=i; sounum++; newid=0; } } if(newid==1)//开辟标志符新量 {label[labelnum]=(char*)malloc(sizeof(alphatp)); strcpy(label[labelnum],alphatp); source[sounum][0]=4;//将保留字的位置放入数组之中 source[sounum][1]=labelnum; sounum++; labelnum++; } } return(buffer); } chardigitprocess(charbuffer)//数字处理函数 {intnewnum=1; inti=-1; while((isdigit(buffer))) { digittp[++i]=buffer; buffer=fgetc(fp); } digittp[i+1]='\0'; for(i=0;i {if(strcmp(integer[i],digittp)==0) {source[sounum][0]=3;//将保留字的位置放入数组之中 source[sounum][1]=i; sounum++; newnum=0; } } if(newnum==1) {integer[constnum]=(char*)malloc(sizeof(digittp)); strcpy(integer[constnum],digittp); source[sounum][0]=3;//将保留字的位置放入数组之中 source[sounum][1]=constnum; sounum++; constnum++; } return(buffer); } charotherprocess(charbuffer)//: 其他字符处理函数; { charbuff1; if(buffer=='\n')//将行号标志符存入数组 {line++; source[sounum][0]=5;//行号以5作为标记 source[sounum][1]=line; sounum++; buffer=fgetc(fp);return(buffer); } elseif(buffer=='') {buffer=fgetc(fp); while(buffer=='') {buffer=fgetc(fp); } buff1=buffer;return(buff1); } else {charbuffer1,buffer2,buffer3[3]; buffer1=buffer; buffer2=fgetc(fp); //处理双字符的符号 if(buffer2=='>'||buffer2=='='||buffer2=='.') {buffer3[0]=buffer1; buffer3[1]=buffer2; buffer3[2]='\0'; inti=0;intre=0,id=0; while(i<21&&re==0) {if(strcmp(character[i],buffer3)==0) {//printf("\n\t特殊字符: %s",character[i]); source[sounum][0]=2;//将特殊字符的位置放入数组之中 source[sounum][1]=i; sounum++; re=1;id=1; } i++; } if(id==0) {printf("\n字符错误,在%d行-->%s",line,buffer1);error1++; } buffer1=fgetc(fp);return(buffer1); } //处理单字符的符号 else {buffer3[0]=buffer1; buffer3[1]='\0'; inti=0;intre=0;intid=0; while(i<21&&re==0) {if(strcmp(character[i],buffer3)==0) {//printf("\n\t特殊字符: %s",character[i]); source[sounum][0]=2;//将特殊字符的位置放入数组之中 source[sounum][1]=i; sounum++; re=1;id=1; } i++; } if(id==0) {printf("\n字符错误,在%d行-->%s",line,buffer3);error1++; } return(buffer2); } } } voidscan() {charcbuffer; printf("\n请输入文件名: "); scanf("%s",&filename); p=filename; if((fp=fopen(p,"r"))==NULL) {printf("\n很抱歉,该文件打不开,请选择另一个! \n"); openfile=0; } else {cbuffer=fgetc(fp); while(cbuffer! =EOF) { if(isalpha(cbuffer)) cbuffer=alphaprocess(cbuffer); elseif(isdigit(cbuffer)) cbuffer=digitprocess(cbuffer); elseif(cbuffer=='/')//处理注释 { cbuffer=fgetc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译程序
![提示](https://static.bdocx.com/images/bang_tan.gif)