编译原理实验报告 词法分析.doc_第1页
编译原理实验报告 词法分析.doc_第2页
编译原理实验报告 词法分析.doc_第3页
编译原理实验报告 词法分析.doc_第4页
编译原理实验报告 词法分析.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

编译原理实验一词法分析一、 实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。二、 实验内容及要求对某特定语言A ,构造其词法规则。该语言的单词符号包括:保留字(见左下表)、标识符(字母大小写不敏感)、 整型常数、界符及运算符(见右下表) 。 功能要求如下所示:按单词符号出现的顺序,返回二元组序列,并输出。出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。如果出现词法错误,报出:错误类型,位置(行,列)。处理段注释(/* */),行注释(/)。有段注释时仍可以正确指出词法错误位置(行,列)。三、 实验过程1、 词法形式化描述使用正则文法进行描述,则可以得到如下的正规式:其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A(ID | NUM | RES | DEL | OPR) *IDletter(letter | didit)*NUMdigit digit*lettera | | z | A | | Zdigit 0 | | 9RES program | begin | end | var | int | and | or | not | if | then | else | while | doDEL( | ) | . | ; | ,OPR+ | * | := | | = | = | 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。2、 单词种别定义;A语言中的单词符号及其对应的种别编码如下表所示:单词符号种别编码单词符号种别编码program1+16begin2*17end3(18var4)19int5,20and6.21or7:=22not8;23if924then10=27do13=28标识符1429整型常量15-303、 状态转换图;语言A的词法分析的状态转换图如下所示:空格符,制表符 或回车符 字母或数字非字母或数字2字母01 数字非数字3+4数字587*633()2224非=其他-142513812):9,.=101115;/16=28/*2627其他23=171819非=index = 0; ctable-index = 0; itail = itable; ctail = ctable; etail = etable; itable-next = NULL; ctable-next = NULL; etable-next = NULL; fseek(pf, 0, SEEK_END); nLen = ftell(pf); rewind(pf); pchBuf = (char*) malloc(sizeof(char)*nLen+1); nLen = fread(pchBuf, sizeof(char), nLen, pf); pchBufnLen = 0; ch = pchBuf; fclose(pf); while(*ch) curBinary = lexicalAnalyze(); if(curBinary) if(curBinary-type = 14 | curBinary-type = 15) fprintf(pf1,(%d,%d)n,curBinary-type,curBinary-property); else if(curBinary-type 0) fprintf(pf1,(%d,_)n,curBinary-type);else if(curBinary-type = -1) if(*ch = 0) break; while(*ch != n & *ch != t & *ch != & !(*ch = / & *(ch+1) = /) & !(*ch = / & *(ch+1) = *) ) GetChar(); free(curBinary); /打印标识符表、常数表和错误表 fprintf(pf1,nIdentifier Table:n); itail = itable-next; while(itail) fprintf(pf1,%d %sn,itail-index, itail-name); itail = itail-next; fprintf(nConstant Table:n); ctail = ctable-next; while(ctail) printf(%d %dn,ctail-index, ctail-value); ctail = ctail-next; printf(n%d error(s):n ,errors); etail = etable-next; while(etail) printf(line:%d row:%d %sn,etail-line, etail-row, etail-describe); etail = etail-next; fclose(pf1); printf(succeed); getch();struct binary *lexicalAnalyze() struct binary *newBinary = (struct binary*)malloc(sizeof(struct binary); int annotation; int property; strToken0 = 0; curChar = 0; GetBC(); if(*ch = 0) /是否到达数据结束 free(newBinary); return NULL; if(isLetter() /是否标识符 while(isLetter() | isDigit() if(ConCat() GetChar(); else errProc(1); newBinary-type = -1; return newBinary; property = Reserved(); if(property) /是否保留字 newBinary-type = property; return newBinary; property = isId(); if(property) newBinary-type = 14; newBinary-property = property; return newBinary; else newBinary-type = 14; newBinary-property = insertId(); return newBinary; else if(isDigit() /是否常数 while(isDigit() ConCat(); GetChar(); property = isConst(); if(property) newBinary-type = 15; newBinary-property = property; return newBinary; else newBinary-type = 15; newBinary-property = insertConst(); return newBinary; else switch(*ch) case +:newBinary-type = 16;break; case *:newBinary-type = 17;break; case (:newBinary-type = 18;break; case ):newBinary-type = 19;break; case ,:newBinary-type = 20;break; case .:newBinary-type = 21;break; case ;:newBinary-type = 23;break; case -:newBinary-type = 30;break; case : GetChar(); if(*ch = =) newBinary-type = 19; break; else ch-; row-; errProc(2); newBinary-type = -1; GetChar(); return newBinary; case : GetChar(); if(*ch = =) newBinary-type = 27; else newBinary-type = 24; ch-; row-; break; case type = 28; else if(*ch = ) newBinary-type = 29; else newBinary-type = 25; ch-; row-; break; case =:newBinary-type = 26;break; case /: annotation = isAnnotation(); if(annotation) if(annotation = -1) errProc(3); newBinary-type = -1; return newBinary; free(newBinary); return NULL; else ch-; row-; errProc(2); newBinary-type = -1; GetChar(); return newBinary; default: errProc(2); newBinary-type = -1; GetChar(); return newBinary; GetChar(); return newBinary; void GetBC() if(*ch = n) line+; row = 0; while(*ch = | *ch = t | *ch = n) GetChar(); if(*ch = n) line+; row = 0; void GetChar() ch+; if(*ch = t) row += 4; else row+;int ConCat() if(curChar = A & *ch index; struct identifier *newId = (struct identifier*)malloc(sizeof(struct identifier); itail-next = newId; itail = newId; strcpy(itail-name,strToken); itail-next = NULL; itail-index = index + 1; curChar = 0; strTokencurChar = 0; return index+1;int insertConst() int index = ctail-index; struct constant *newConst = (struct constant*)malloc(sizeof(struct constant); ctail-next = newConst; ctail = newConst; ctail-value = atoi(strToken); ctail-next = NULL; ctail-index = index + 1; curChar = 0; strTokencurChar = 0; return index+1;int Reserved() int i; for(i=0;inext; while(curId) if(strcmp(curId-name,strToken) = 0) return curId-index; else curId = curId-next; return 0;int isConst() struct constant *curId = ctable-next; while(curId) if(curId-value = atoi(strToken) return curId-index; else curId = curId-next; return 0; int isAnnotation() GetChar(); if(*ch = / | *ch = *) if(*ch = /) while(*ch & *ch != n) GetChar(); return 1; else while(*ch & !(*ch = * & *(ch+1) = /) GetChar(); GetBC(); if(*ch) GetChar(); GetChar(); return 1; else return -1; else return 0;void errProc(int type)struct err *newErr = (struct err*)malloc(sizeof(struct err);errors+; etail-next = newErr; newErr-next = NULL; newErr-line = line; newErr-row = row; switch(type) c

温馨提示

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

评论

0/150

提交评论