资源描述:
《编译原理词法分析器代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#include#include#include#defineKEYWORD_LEN32//保留字个数#defineSTR_MAX_LEN300//标识符最大长度#definePRO_MAX_LEN20480//源程序最大长度#defineSTB_MAX_LEN1000//符号表最大容量#defineCTB_MAX_LEN1000//常数表最大容量#defineERROR0//错误#defineID(KEYWORD_LEN+1)//标识符#def
2、ineCONST(KEYWORD_LEN+2)//常量#defineOPERAT(KEYWORD_LEN+3)//运算符#defineDIVIDE(KEYWORD_LEN+4)//界符interrorLine=0;charproBuffer[PRO_MAX_LEN]="";//存储程序代码的全局缓冲区charch;//读出来的当前字符charwordget[STR_MAX_LEN];//标识符或常量intpoint=0;//源程序当前位置指针charsignTab[STB_MAX_LEN][STR_MAX_LEN];//符号表intpointSTB=0;//符号表指针c
3、harconstTab[CTB_MAX_LEN][STR_MAX_LEN];//常量表intpointCTB=0;//常数表指针charkwTab[KEYWORD_LEN][10]={//保留字表C语言一共有32个保留字[关键字]"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","s
4、izeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};charerrorTab[][50]={//错误代码表/*0*/"未知错误",/*1*/"非法的字符",/*2*/"不正确的字符常量表达",/*3*/"不正确的字符串表达",/*4*/"不正确的数字表达",/*5*/"注释丢失'*/'"};typedefstructsignDuality{intkind;intvalue;}*pDualistic,Dualistic;voidpretreatm
5、ent();//预处理voidProcError(intid);//错误boolGetChar();//获得一个字符不包括结束标记boolGetBC();//获得一个非空白字符voidConcat(char*str);//将ch连接到str后intReserve(char*str);//对str字符串查找保留字表若是一个保留字-返回其编码否则返回0voidRetract();//将搜索指示器回调一个字符位置intInsertId(char*str);//将str串以标识符插入符号表,并返回符号表指针intInsertConst(char*str);//将str串以常数插
6、入符号表,并返回常数表指针boolwordAnalyse(pDualisticpDu);//词法分析true正常//预处理将缓冲区内的源代码去掉注释和无效空格voidpretreatment(){intlines=0;chartmp[PRO_MAX_LEN];//先将处理结果保存到临时空间inttmpp=0;//这个临时空间的末尾指针boolflg;chartmpc;//去掉注释先//注释有两种一种是//另一种是/**/point=0;do{flg=GetChar();if(ch=='/'){flg=GetChar();switch(ch){case'/':do{flg
7、=GetChar();}while(!(ch==''
8、
9、flg==false));//注释一直到行尾或文件结束if(ch=='')Retract();//归还换行break;case'*':do{flg=GetChar();tmpc=ch;//为了保证出错处理程序能正确定位出错位置保留注释中的换行if(tmpc=='')tmp[tmpp++]=tmpc;flg=GetChar();Retract();//归还一个字符}while(flg&&!(flg&&tmpc=='*'&&ch=='/'));flg=GetChar();if