编译原理词法分析程序实现实验报告.doc
《编译原理词法分析程序实现实验报告.doc》由会员分享,可在线阅读,更多相关《编译原理词法分析程序实现实验报告.doc(50页珍藏版)》请在三一办公上搜索。
1、实验一 词法分析程序实现一、实验内容选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。输入:由无符号数和+,*,/, ( , ) 构成的算术表达式,如1.5E+2100。输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。二、 设计部分因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下:GOTO 1:GOTO 2:三、 源程序代码部分#include #include#
2、include #define MAX 100#define UNSIGNEDNUMBER 1#define PLUS 2#define SUBTRACT 3#define MULTIPLY 4#define DIVIDE 5#define LEFTBRACKET 6#define RIGHTBRACKET 7#define INEFFICACIOUSLABEL 8#define FINISH 111int count=0;int Class;void StoreType();int Type100;char Store20=0;void ShowStrFile();/已经将要识别的字符串存在
3、文件a中void Output(int a,char *p1,char *p2);/字符的输出过程int Sign(char *p);/+-*/整体识别过程int UnsignedNum(char *p);/是否适合合法的正整数09int LegalCharacter(char *p);/是否是合法的字符:Sign(p)|UnsignedNum(p)|E|.void DistinguishSign(char *p);/+-*/具体识别过程void TypyDistinguish();/字符的识别过程void ShowType();/将类别码存储在Type100中,为语法分析做准备void Sh
4、owStrFile()/已经将要识别的字符串存在文件a中FILE *fp_s;char ch;if(fp_s=fopen(a.txt,r)=NULL)printf(The FILE cannot open!); exit(0);elsech=fgetc(fp_s);while(ch!=EOF)putchar(ch);ch=fgetc(fp_s);printf(n);void StoreStr()/将文件中的字符串存储到数组Storei FILE *fp=fopen(a.txt,r);char str;int i=0;while(!feof(fp)fscanf(fp,%c,&str);if(st
5、r=?)Storei=0;break;Storei=str;i+;Storei=0;void ShowStore()int i;for (i=0;Storei!=0;i+) printf(%c,Storei);printf(n);void Output(int a,char *p1,char *p2) printf(%3st%dt%st,CLASS,a,VALUE);while(p1=p2)printf(%c,*p1);p1+;printf(n);int Sign(char *p)char ch=*p;if(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)return 1;elser
6、eturn 0;int UnsignedNum(char *p)char ch=*p;if(0=ch&ch=9)return 1;elsereturn 0;int LegalCharacter(char *p)char ch=*p;if(Sign(p)|UnsignedNum(p)|ch=E|ch=.)return 1;else return 0;void DistinguishSign(char *p) int Class;char ch=*p;switch(ch) case +: Output(PLUS,p,p);Typecount+=PLUS;break; case -: Output(
7、SUBTRACT,p,p);Typecount+=SUBTRACT;break; case *: Output(MULTIPLY,p,p);Typecount+=MULTIPLY;break; case /: Output(DIVIDE,p,p);Typecount+=DIVIDE;break; case (: Output(LEFTBRACKET,p,p);Typecount+=LEFTBRACKET;break; case ): Output(RIGHTBRACKET,p,p);Typecount+=RIGHTBRACKET;break; default: break; void Typy
8、Distinguish() printf(词法开始,分析结果如下:n); char *p; p=&Store0; while(*p!=0) if(Sign(p) DistinguishSign(p+); continue; else if(UnsignedNum(p)|*p=.) char *p1=p;if(UnsignedNum(p)while(UnsignedNum(p)p+;if(*p=0) Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p=E)p+;if(UnsignedNum(p
9、)while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p=+|*p=-)p+;while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p);printf(输入的这个符号是不合法的!);break;Typecount+=INEFFICACIOUSLABEL;p+
10、;continue;else if(*p=.)p+;while(UnsignedNum(p)p+;if(*p=0) Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p=E)p+;if(UnsignedNum(p)while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p=+|*p=-)p+;if(UnsignedNum(p)while(Unsigned
11、Num(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p);printf(输入的这个符号是不合法的! /n);break;Typecount+=INEFFICACIOUSLABEL;p+;continue;elseOutput(INEFFICACIOUSLABEL,p1,-p);printf(输入的这个符号是不合法的!因为他的后面既不是09也不是“+”或者“-);break;/1.5E*2这样的字符串不是无符号数 Typecou
12、nt+=INEFFICACIOUSLABEL;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;if(*p=.)p+;if(UnsignedNum(p)p+;while(UnsignedNum(p)p+;if(*p=0) Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;
13、continue;else if(*p=E)p+;if(UnsignedNum(p)while(UnsignedNum(p)p+; Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p=+|*p=-)p+;while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUM
14、BER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p); printf(输入的这个符号是不合法的!);break;Typecount+=INEFFICACIOUSLABEL;p+;continue; else if(*p=E) Output(INEFFICACIOUSLABEL,p,p);break; Typecount+=INEFFICACIOUSLABEL; printf(输入的这个符号是不合法的!); p+; continue; printf(nn词法分析完毕!);void ShowType()/将类别码存储在Type100中,为语法分
15、析做准备 printf(n用类别码表示输入的字符如下:n);int i;printf(n);for(i=0;Typei!=FINISH;i+)printf(%d,Typei);printf(nn); void main() /词法分析部分 StoreStr(); ShowStore(); TypyDistinguish(); Typecount=FINISH; ShowType(); 四、 实验结果正确的结果:错误的结果:输入的字符串中有1.5E*2因为实验是以文件的形式进行读取的所以,在读取不合法的过程中只是将存在project 中的a.txt 中的内容改变改为1.5E*2+100*555实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 程序 实现 实验 报告
链接地址:https://www.31ppt.com/p-2396938.html