电子科技大学-计算机学院-编译原理实验-语法分析_第1页
电子科技大学-计算机学院-编译原理实验-语法分析_第2页
电子科技大学-计算机学院-编译原理实验-语法分析_第3页
电子科技大学-计算机学院-编译原理实验-语法分析_第4页
电子科技大学-计算机学院-编译原理实验-语法分析_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/ SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点。/#include #include #include #define MAX_COUNT 1024#define SIGN_UNDEFINED_ERR 1#define SIGN_REDEFINED_ERR 2#define SIGN_EXECUTE_ERR 3#define NO_SIGN_ERR 4#define SIGN_RESERVE_ERR 5#define NO_PARA_ERR 6/*types是支持类型的集合*/typedef enum integer types;/*记录变量信息的结构体*/typedef struct char vname17;char vproc17;bool vkind;types vtype;int vlev;int vadr; varRecord;/*记录过程信息的结构体*/typedef structchar pname17;types ptype;int plev;int varNum;int fadr;int ladr;int parameter;bool parameterIsDefined; proRecord;/*文法产生式如下*A:程序A-BB:分程序B-begin C;M endC:说明与句表C-DCC-;DC|D:说明语句D-E|JE:变量说明E-integer FF:变量F-GG:标识符G-HGG-HG|IG|H:字母H-a|.|z|A|.|ZI:数字I-0|1|.|9J:函数说明J-integer function G(K);LK:参数K-FL:函数体L-begin C;M endM:执行语句表M-NMM-;NM|N:执行语句N-O|P|Q|WO:读语句O-read(F)P:写语句P-write(F)Q:赋值语句Q-F:=RR:算术表达式R-SRR-SR|S:项S-TSS-*TS|T:因子T-F|U|ZU:常数U-VV:无符号整数V-IVV-IV|W:条件语句W-if X then N else NX:条件表达式X-RYRY:关系运算符Y-|=|=|Z:函数调用Z-G(R)*/void A();void B();void C();void C_();void D();void E();void F();void G();void J();void K();void L();void M();void M_();void N();void O();void P();void Q();void R();void R_();void S();void S_();void T();void U();void W();void X();void Y();void Z();/*初始化函数:从输入文件读取数据,建立各个文件,初始化全局变量*/bool init(int argc, char* argv);/*结束处理函数,将var和pro数组中的元素输出到相应文件,填充输出文件*/bool final();/*错误处理函数,参数分别为行号、错误码和错误符号*/bool error(int lineNum, int errNum, const char* sign);/*获得所处目录路径,包括最后斜杠,或者为空*/void getPath(char* in, char* out);/*获得文件名,不包括扩展*/void getFilename(char* in, char* out);/*获得下一符号,true表示已到队尾,false表示还未到队尾*/bool nextToken();/*获得当前符号的下一字符,true表示已到0*/bool nextChar();/*判断变量是否已存在*/bool isVarExisted(char* vname, char* vproc, bool vkind);/*判断过程是否已存在,参数为过程名*/bool isProExisted(char* vname);/*获得下一符号,指针不变*/int getNextToken();char inputMAX_COUNT17;/存放输入文件所有符号的数组int kindMAX_COUNT;int inputCount;/输入符号的数量int pToken;/指向当前输入符号int pChar;/指向当前输入符号中的当前字符varRecord currentVar;/存放当前变量的信息proRecord currentPro;/存放当前过程的信息int lineNum;/当前行号varRecord varMAX_COUNT;/存放变量名表项数组proRecord proMAX_COUNT;/存放过程名表项数组int varCount;/变量的数量int proCount;/过程的数量FILE* inFile;/输入文件句柄FILE* outFile;/输出文件句柄FILE* errFile;/错误文件句柄FILE* varFile;/变量文件句柄FILE* proFile;/过程文件句柄/*主函数*/int main(int argc, char* argv)if (init(argc, argv)A();final();return 0;bool init(int argc, char* argv)if (argc != 2)return false;elsechar* inFilename = argv1;char outFilenameMAX_COUNT = ;char errFilenameMAX_COUNT = ;char varFilenameMAX_COUNT = ;char proFilenameMAX_COUNT = ;char filenameMAX_COUNT = ;char pathMAX_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)char stringOfLineMAX_COUNT;if (fgets(stringOfLine, MAX_COUNT, inFile)char lineString20 = ;strncpy(lineString, stringOfLine, 19);char* kindString = strrchr(lineString, );kindinputCount = atoi(kindString+1);char string17 = ;strncpy(string, stringOfLine, 16);char* lastString = strrchr(string, );strcpy(inputinputCount, lastString + 1);inputCount+;return true;elsefclose(inFile);fclose(outFile);fclose(errFile);fclose(varFile);fclose(proFile);return false;bool final()for (int i = 0; i varCount; i+)int vkind = vari.vkind ? 1 : 0;char* vtype = (vari.vtype = integer) ? integer : ;fprintf(varFile, %16s %16s %d %s %d %dn, vari.vname, vari.vproc, vkind, vtype, vari.vlev, vari.vadr);for (int i = 0; i proCount; i+)char* ptype = (proi.ptype = integer) ? integer : ;fprintf(proFile, %16s %s %d %d %dn, proi.pname, ptype, proi.plev, proi.fadr, proi.ladr);if (fseek(inFile, 0, 0) = 0)while (!feof(inFile)fputc(fgetc(inFile), outFile);bool val;val = fclose(inFile);val = fclose(outFile);val = fclose(errFile);val = fclose(varFile);val = fclose(proFile);return val;bool error(int errNum,const char* symbol)char* errInfo;switch (errNum)case SIGN_UNDEFINED_ERR:fprintf(errFile, *LINE:%d %s符号无定义n, lineNum, inputpToken);break;case SIGN_REDEFINED_ERR:fprintf(errFile, *LINE:%d %s符号重定义n, lineNum, inputpToken);break;case SIGN_EXECUTE_ERR:fprintf(errFile, *LINE:%d %s处不能匹配执行语句n, lineNum, inputpToken);break;case NO_SIGN_ERR:fprintf(errFile, *LINE:%d %s处缺少%sn, lineNum,inputpToken, symbol);break;case SIGN_RESERVE_ERR:errInfo = 以保留字开头;break;case NO_PARA_ERR:fprintf(errFile, *LINE:%d 缺少形参%s的声明n, lineNum, symbol);break;default:errInfo = 未知错误;return true;void getPath(char* in, char* out)char* name;name = strrchr(in, );if (name != NULL)strncpy(out, in, strlen(in) - strlen(name) + 1);elsestrcpy(out, );void getFilename(char* in, char* out)char* fullName;char* extension;fullName = strrchr(in, );extension = strrchr(in, .);if (fullName != NULL)strncpy(out, fullName + 1, strlen(fullName) - 1 - strlen(extension);elsestrncpy(out, in, strlen(in) - strlen(extension);bool nextToken()pToken+;pChar = 0;if (strcmp(inputpToken, EOF) = 0)return true;while (strcmp(inputpToken, EOLN) = 0)pToken+;lineNum+;return false;bool nextChar()if (inputpTokenpChar = 0)/nextToken();return true;pChar+;return false;bool isVarExisted(char* vname, char* vproc, bool vkind)for (int i = 0; i varCount; i+)if (strcmp(vname, vari.vname) = 0) & (strcmp(vproc, vari.vproc) = 0) & (vari.vkind = vkind)return true;for (int i = 0; i proCount; i+)if (strcmp(vname, proi.pname) = 0)return true;return false;bool isProExisted(char* vname)for (int i = 0; i varCount; i+)if (strcmp(vname, vari.vname) = 0)return true;for (int i = 0; i proCount; i+)if (strcmp(vname, proi.pname) = 0)return true;return false;int getNextToken()int pNextToken = pToken + 1;while (strcmp(inputpNextToken, EOLN) = 0)pNextToken+;return pNextToken;void A()B();void B()if (strcmp(inputpToken, begin) = 0)nextToken();elseerror(NO_SIGN_ERR,begin);if (strcmp(inputpToken, integer)!=0)nextToken();C();if (strcmp(inputpToken, ;) = 0)nextToken();elseerror(NO_SIGN_ERR, ;);if (strcmp(inputpToken, integer) != 0) & (strcmp(inputpToken, read) != 0) & (strcmp(inputpToken, write) != 0) & (kindpToken!=10)nextToken();M();if (strcmp(inputpToken, end) = 0)nextToken();elseerror(NO_SIGN_ERR, end);void C()D();C_();void C_()if (strcmp(inputpToken, ;) = 0 & strcmp(inputgetNextToken(), integer) = 0)nextToken();D();C_();elseif (strcmp(inputpToken, integer) = 0)error(NO_SIGN_ERR, ;);D();C_();void D()if (strcmp(inputpToken + 1, function) = 0)J();elseE();void E()if (strcmp(inputpToken, integer) = 0)nextToken();elseerror(NO_SIGN_ERR, integer);/if (kindpToken != 10)/nextToken();/strcpy(currentVar.vname, inputpToken);strcpy(currentVar.vproc, currentPro.pname);if (pToken = currentPro.parameter)currentVar.vkind = true;currentPro.parameterIsDefined = true;elsecurrentVar.vkind = false;currentVar.vtype = integer;currentVar.vlev = currentPro.plev;currentVar.vadr = varCount;if (isVarExisted(inputpToken, currentPro.pname, currentVar.vkind)/如果存在变量error(SIGN_REDEFINED_ERR,NULL);else if (currentPro.varNum = 0)/如果当前过程中变量数为0,则当前变量是当前过程的第一个变量currentPro.fadr = currentVar.vadr;currentPro.ladr = currentVar.vadr;/过程中最后一个变量在变量表中的位置currentPro.varNum+;/过程中变量数+varvarCount = currentVar;/当前变量存入var数组varCount+;/变量数+F();void F()G();void G()if (kindpToken = 10)nextToken();/*char* keywords = begin, end, integer, if, then, else, function, read, write ;int keywordLength = 5, 3, 7, 2, 4, 4, 8, 4, 5 ;for (int i = 0; i = 0 & inputpTokenpChar = 9)U();else if (strcmp(inputgetNextToken(), () = 0)/pToken+1Z();elseif (!isVarExisted(inputpToken, currentPro.pname, false) & !isVarExisted(inputpToken, currentPro.pname, true)error(SIGN_UNDEFINED_ERR,NULL);F();void U()if (kindpToken = 11)nextToken();void W()if (strcmp(inputpToken, if) = 0)nextToken();elseerror(NO_SIGN_ERR, if);if (kindpToken != 10) & (kindpToken != 11)nextToken();X();if (strcmp(inputpToken, then) = 0)nextToken();elseerror(NO_SIGN_ERR, then);if (strcmp(inputpToken, integer) != 0) & (strcmp(inputpToken, read) != 0) & (strcmp(inputp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论