词法分析程序设计 编译原理 C++ C#.docx_第1页
词法分析程序设计 编译原理 C++ C#.docx_第2页
词法分析程序设计 编译原理 C++ C#.docx_第3页
词法分析程序设计 编译原理 C++ C#.docx_第4页
词法分析程序设计 编译原理 C++ C#.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

Xxx大学词法分析程序设计 实验课程: 编译原理 年 级: 2014级 专 业: 计算机科学与技术 班 级: 2班 学 号: 姓 名: 指导教师: 目录一实验描述2二实验目的3三实验任务3四实验原理3五代码实现4六总结14七致谢词15一 实验描述运行环境:vc+2008对某特定语言A ,构造其词法规则。该语言的单词符号包括:1该程序能识别的单词符号及类别说明表单词类别PROGRAM0NOT1BEGIN2IF3END 4THEN5VAR6ELSE7INT8WHILE9AND10DO11OR 12标识符13常数14+15-16(17)18,19;20=2123*24*25=26=27!=282状态转换图3程序流程词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。二 实验目的三 实验任务通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。编制程序实现要求的功能,并能完成对测试样例程序的分析。四 实验原理char set1000,str500,strtaken20;/set存储代码,strtaken存储当前字符char sign5010,constant5010;/存储标识符和常量定义了一个Analyzer类class Analyzerpublic:Analyzer();/构造函数 Analyzer();/析构函数intIsLetter(char ch); /判断是否是字母,是则返回 1,否则返回 0。intIsDigit(char ch); /判断是否为数字,是则返回 1,否则返回 0。void GetChar(char *ch); /将下一个输入字符读到ch中。void GetBC(char *ch); /检查ch中的字符是否为空白,若是,则调用GetChar直至ch进入一个非空白字符。void Concat(char *strTaken, char *ch); /将ch中的字符连接到strToken之后。int Reserve(char *strTaken); /对strTaken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。void Retract(char *ch) ; /将搜索指针器回调一个字符位置,将ch置为空白字符。void input();/向存放输入结果的字符数组输入一句语句。void display();/输出一些程序结束字符显示样式intanalyzerSubFun();/词法分析器子程序,为了实现词法分析的主要功能。五 代码实现#includestdafx.h#includestdio.h#includestring.h#includeiostreamusingnamespace std;char set1000,str500,strtaken20;/set存储代码,strtaken存储当前字符char sign5010,constant5010;/存储标识符和常量/int Words50010;char ch;/当前读入字符int sr,to=0;/数组str, strtaken 的指针int st=0,dcount=0;int id=0;staticint line=1;int h,l;typedefstruct Words /*放置二元组*/int num;char letters20;DS; DS Words500; typedefstruct wordschar word20;int type;WORDS;WORDS words= program,0, not,1, begin,2, end,3, if,4, then,5, var,6, else,7, int,8, while,9, and,10, do,11, or,12, +,15, -,16, (,17, ),18, ,19, ;,20, =,21, ,23, *,24, *,25, =,26, =,27, !=,28 ;typedefstruct keytable /*放置关键字*/char name20;int kind;KEYTABLE;KEYTABLE keyword= /*设置关键字*/ program,0, not,1, begin,2, end,3, if,4, then,5, var,6, else,7, int,8, while,9, and,10, do,11, or,12, ;void openfile() /*打开文件*/ cout_endl;cout 词法分析器 endl;cout_endl;cout请在本程序根目录下寻找以.txt”为结尾的文件作为词法分析对象,输入文件名endl; FILE *fp;char a,filename10;int n=0; gets(filename);if(fp=fopen(filename,r)=NULL) printf(cannot open file.n);/exit(0); elsewhile(!feof(fp) /*文件不结束,则循环*/ a=getc(fp); /*getc函数带回一个字符,赋给a*/ setn=a; /*文件的每一个字符都放入set数组中*/ n+; fclose(fp); /*关闭文件*/ setn-1=0;void reflesh() /*清空strtaken数组*/ to=0; /*全局变量to是strtaken的指示器*/ strcpy(strtaken, );void pre1() /*预处理程序*/int i,a,b,n=0;do if(setn=/& setn+1=*) a=n; /*记录第一个注释符的位置*/while(!(setn=*& setn+1=/) if(setn=n)line+;n+; b=n+1; /*记录第二个注释符的位置*/for(i=a;i=b;i+) /*/ seti= ; /*把注释的内容换成空格,等待第二步预处理*/ elseif(setn=/& setn+1=/) a=n; /*记录第一个注释符的位置*/while(!setn=n) n+;b=n+1; /*记录第二个注释符的位置*/for(i=a;i=a& ch=A& ch=0& ch=9)return(1);elsereturn(0);int Reserve() /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回*/int i,k=0; for(i=0;i=12;i+) if(stricmp(strtaken,)=0) k=1; Wordsdcount.num=keywordi.kind; strcpy(Wordsdcount.letters,-); dcount+;return(keywordi.kind); if(k!=1)return(-1);void Retract() /*指示器sr回调一个字符位置,把ch置为空*/ sr-; ch= ;int InsertId()int i,k; for(i=0;iid;i+) k=strcmp(strtaken,signi);if(k=0) return(i); strcpy(signid,strtaken); /*插入标识符*/ Wordsdcount.num=13; strcpy(Wordsdcount.letters,strtaken); id+;dcount+;return(id-1);int InsertConst()int i,k;for(i=0;ist;i+) k=strcmp(strtaken,constanti);if(k=0)return(i); strcpy(constantst,strtaken);/*插入常数*/ Wordsdcount.num=14; strcpy(Wordsdcount.letters,strtaken); st+;dcount+;return(st-1);void analysis()int value; reflesh(); /*清空strtaken数组*/ pre1(); /*预处理,使注释内容换成单个空格,放回set中*/ pre2(); /*预处理,使set中连续的空格置换成单个空格,并把set的内容放到str中*/ sr=0; GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ GetBC(); /*读取第一个字符*/while(ch!=0) /*当不等于结束符,继续执行*/ if(IsLetter()/标识符和关键字判定 while(IsLetter() | IsDigit() /*若第一个是字符,继续读取,直到出现空格*/ Concat(); GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ value=Reserve(); /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回*/if(value=-1) /*如果返回值是,那就是标识符,把它输出*/ InsertId(); /*插入标识符*/ reflesh(); elseif(IsDigit() while(IsDigit() /*否则,若第一个是数字,继续读取,直到出现空格*/ Concat(); /*把ch中的字符放入strtaken*/ GetChar(); Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ InsertConst(); /*插入常数,返回类型为int*/printf( %s,strtaken);/getchar(); reflesh(); elseswitch(ch) /*否则,若是下面的符号*/ case:case-:case(:case):case,:case;:case=:case: Concat();for(int c0=15;c0=23;c0+) if(stricmp(strtaken,wordsc0.word)=0) Wordsdcount.num=wordsc0.type; dcount+; reflesh();break;default:if(ch=*) /*如果是*符号,继续读取下一个*/ Concat(); /*判断是否为*的情况*/ GetChar();if(ch=strtaken0) Concat();else Retract();for(int c1=24;c1=25;c1+) if(stricmp(strtaken,wordsc1.word)=0) Wordsdcount.num=wordsc1.type; dcount+; /printf( %s,strtaken);/getchar(); reflesh();break; elseif(ch= | ch=!) Concat();/*判断是否为=,!=的情况*/GetChar();if(ch=) Concat();else Retract();for(int c2=26;c2=28;c2+) if(stricmp(strtaken,wordsc2.word)=0) Wordsdcount.num=wordsc2.type; dcount+;reflesh();break; elseh=ch/line; l=ch%line; coutError in h行l列endl;/getchar();break; GetChar(); GetBC(); cout输出二元组:endl;for(int d_i=0;d_idcount;d_i+) coutWordsd_i.num Wordsd_i.lettersendl; coutendl; cout输出标识符:endl;for(int sign_i=0;sign_iid;sign_i+)coutsign_i signsign_iendl; coutendl; cout输出常量:endl;for(int const_i=0;const_ist;const_i+)coutconst_i constantconst_iendl; cout=3 and n5 then j:=j-1;end .结果截图:六 总结我在这次词法分析器的设计过程中学到了很多东西,其中最大的收获是对于编译原理中的词法分析

温馨提示

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

评论

0/150

提交评论