您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子科技大学-计算机学院-编译原理实验-语法分析
//SyntaxAnalyzer.cpp:定义控制台应用程序的入口点。//#includestdio.h#includestring.h#includeWindows.h#defineMAX_COUNT1024#defineSIGN_UNDEFINED_ERR1#defineSIGN_REDEFINED_ERR2#defineSIGN_EXECUTE_ERR3#defineNO_SIGN_ERR4#defineSIGN_RESERVE_ERR5#defineNO_PARA_ERR6/*types是支持类型的集合*/typedefenum{integer}types;/*记录变量信息的结构体*/typedefstruct{charvname[17];charvproc[17];boolvkind;typesvtype;intvlev;intvadr;}varRecord;/*记录过程信息的结构体*/typedefstruct{charpname[17];typesptype;intplev;intvarNum;intfadr;intladr;intparameter;boolparameterIsDefined;}proRecord;/**********文法产生式如下**********A:程序A-BB:分程序B-beginC;MendC:说明与句表C-DC'C'-;DC'|εD:说明语句D-E|JE:变量说明E-integerFF:变量F-GG:标识符G-HG'G'-HG'|IG'|εH:字母H-a|...|z|A|...|ZI:数字I-0|1|...|9J:函数说明J-integerfunctionG(K);LK:参数K-FL:函数体L-beginC;MendM:执行语句表M-NM'M'-;NM'|εN:执行语句N-O|P|Q|WO:读语句O-read(F)P:写语句P-write(F)Q:赋值语句Q-F:=RR:算术表达式R-SR'R'--SR'|εS:项S-TS'S'-*TS'|εT:因子T-F|U|ZU:常数U-VV:无符号整数V-IV'V'-IV'|εW:条件语句W-ifXthenNelseNX:条件表达式X-RYRY:关系运算符Y-|=||=|=|Z:函数调用Z-G(R)**********************************/voidA();voidB();voidC();voidC_();voidD();voidE();voidF();voidG();voidJ();voidK();voidL();voidM();voidM_();voidN();voidO();voidP();voidQ();voidR();voidR_();voidS();voidS_();voidT();voidU();voidW();voidX();voidY();voidZ();/*初始化函数:从输入文件读取数据,建立各个文件,初始化全局变量*/boolinit(intargc,char*argv[]);/*结束处理函数,将var和pro数组中的元素输出到相应文件,填充输出文件*/boolfinal();/*错误处理函数,参数分别为行号、错误码和错误符号*/boolerror(intlineNum,interrNum,constchar*sign);/*获得所处目录路径,包括最后斜杠,或者为空*/voidgetPath(char*in,char*out);/*获得文件名,不包括扩展*/voidgetFilename(char*in,char*out);/*获得下一符号,true表示已到队尾,false表示还未到队尾*/boolnextToken();/*获得当前符号的下一字符,true表示已到'\0'*/boolnextChar();/*判断变量是否已存在*/boolisVarExisted(char*vname,char*vproc,boolvkind);/*判断过程是否已存在,参数为过程名*/boolisProExisted(char*vname);/*获得下一符号,指针不变*/intgetNextToken();charinput[MAX_COUNT][17];//存放输入文件所有符号的数组intkind[MAX_COUNT];intinputCount;//输入符号的数量intpToken;//指向当前输入符号intpChar;//指向当前输入符号中的当前字符varRecordcurrentVar;//存放当前变量的信息proRecordcurrentPro;//存放当前过程的信息intlineNum;//当前行号varRecordvar[MAX_COUNT];//存放变量名表项数组proRecordpro[MAX_COUNT];//存放过程名表项数组intvarCount;//变量的数量intproCount;//过程的数量FILE*inFile;//输入文件句柄FILE*outFile;//输出文件句柄FILE*errFile;//错误文件句柄FILE*varFile;//变量文件句柄FILE*proFile;//过程文件句柄/*主函数*/intmain(intargc,char*argv[]){if(init(argc,argv)){A();final();}return0;}boolinit(intargc,char*argv[]){if(argc!=2){returnfalse;}else{char*inFilename=argv[1];charoutFilename[MAX_COUNT]=;charerrFilename[MAX_COUNT]=;charvarFilename[MAX_COUNT]=;charproFilename[MAX_COUNT]=;charfilename[MAX_COUNT]=;charpath[MAX_COUNT]=;//获得文件名(不包括扩展名)和路径getFilename(inFilename,filename);getPath(inFilename,path);//生成输出文件全部路径strcat(outFilename,path);//strcat(outFilename,\\);strcat(outFilename,filename);strcat(outFilename,.dys);//生成错误文件全部路径strcat(errFilename,path);//strcat(errFilename,\\);strcat(errFilename,filename);strcat(errFilename,.err);//生成变量文件全部路径strcat(varFilename,path);//strcat(varFilename,\\);strcat(varFilename,filename);strcat(varFilename,.var);//生成过程文件全部路径strcat(proFilename,path);//strcat(proFilename,\\);strcat(proFilename,filename);strcat(proFilename,.pro);//打开文件句柄if((inFile=fopen(inFilename,r))&&(outFile=fopen(outFilename,w))&&(errFile=fopen(errFilename,w))&&(varFile=fopen(varFilename,w))&&(proFile=fopen(proFilename,w))){//初始化单词指针、字符指针、行号、层次inputCount=0;pToken=0;pChar=0;lineNum=1;//当前行号//level=0;//当前层次//varCountInPro=0;strcpy(currentPro.pname,);currentPro.plev=0;currentPro.varNum=0;currentPro.parameter=-1;varCount=0;proCount=0;//读取输入文件内容,初始化input数组while(!feof(inFile)){charstringOfLine[MAX_COUNT];if(fgets(stringOfLine,MAX_COUNT,inFile)){charlineString[20]=;strncpy(lineString,stringOfLine,19);char*kindString=strrchr(lineString,'');kind[inputCount]=atoi(kindString+1);charstring[17]=;strncpy(string,stringOfLine,16);char*lastString=strrchr(string,'');strcpy(input[inputCount],lastString+1);inputCount++;}}returntrue;}else{fclose(inFile);fclose(outFile);fclose(errFile);fclose(varFile);fclose(proFile);returnfalse;}}}boolfinal(){for(inti=0;ivarCount;i++){intvkind=var[i].vkind?1:0;char*vtype=(var[i].vtype==integer)?integer:;fprintf(varFile,%16s%16s%d%s%d%d\n,var[i].vname,var[i].vproc,vkind,vtype,var[i].vlev,var[i].vadr);}for(inti=0;iproCount;i++){char*ptype=(pro[i].ptype==integer)?integer:;fprintf(proFile,%16s%s%d%d%d\n,pro[i].pname,ptype,pro[i].plev,pro[i].fadr,pro[i].ladr);}if(fseek(inFile,0,0)==0){while(!feof(inFile))fputc(fgetc(inFile),outFile);}boolval;val=fclose(inFile);val=fclose(outFile);val=fclose(errFile);val=fclose(varFile);val=fclose(proFile);returnval;}boolerror(interrNum,constchar*symbol){char*errInfo;switch(errNum){caseSIGN_UNDEFINED_ERR:fprintf(errFile,***LINE:%d%s符号无定义\n,lineNum,input[pToken]);break;caseSIGN_REDEFINED_ERR:fprintf(errFile,***LINE:%d%s符号重定义\n,lineNum,input[pToken]);break;caseSIGN_EXECUTE_ERR:fprintf(errFile,***LINE:%d%s处不能匹配执行语句\n,lineNum,input[pToken]);break;caseNO_SIGN_ERR:fprintf(errFile,***LINE:%d%s处缺少%s\n,lineNum,input[pToken],symbol);break;caseSIGN_RESERVE_ERR:errInfo=以保留字开头;break;caseNO_PARA_ERR:fprintf(errFile,***LINE:%d缺
本文标题:电子科技大学-计算机学院-编译原理实验-语法分析
链接地址:https://www.777doc.com/doc-6428418 .html