编译原理实验-词法分析器(精编版)_第1页
编译原理实验-词法分析器(精编版)_第2页
编译原理实验-词法分析器(精编版)_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、.理工学院实验报告院部计算机系班级b150402学号课程名称编译原理实验日期2018.6.4实验名称词法分析器成绩实验目的:加深对词法分析过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析;能够使自己编写的程序对简单的程序片段进行词法分析。实验条件:装有 windows操作系统, microsoft visual c+ 6.0。实验容:自定义一种程序设计语言,或选择已有的一种高级语言(c 语言),编制它的词法分析程序。实验要求:1. 对单词的构成规则有明确的定义2. 编写的程序能够正确识别源程序中的单词符号3. 识别出的单词以 <种别码,值 >的形式保存在

2、符号表中4. 词法分析中源程序和分析后的符号表均保存在.txt文件中5. 有一定的检查错误的能力。遇到错误时可显示“error ”,然后跳过错误部分继续显示。6. 实验报告包括以下容(1) 编程思路、流程图、源代码(2) 上机调试时发现的问题,以与解决的过程(3) 所使用的测试数据与结果(4) 心得体会实验步骤1. 给出目标语言的所有单词符号与种别编码、单词符号的状态转换图。2. 依次读入源程序,对源程序进行单词切分和识别,直到源程序完毕。3. 对正确的单词,按照它的种别以<种别码,值 >的形式保存在符号表中。4. 对不正确的单词,做出错误处理。11 /11实验容:1. 编程思路

3、:1.1 、实现预处理功能源程序中可能包含有对程序执行无意义的符号,要求将其剔除。首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依 次存入输入缓冲区(字符型数据) ;然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释。1.2 、实现词法分析功能输入:所给文法的源程序字符串。输出:将每个单词或数字以与他对应的种别码和类型输出到文件中。具体实现时,可以将单词的二元组用结构进行处理。1.3 、待分析的c 语言子集的词法1) 关键字"char","int","if"

4、,"else","var" ,"return","break","do","while","for", "double","float","short"2) 运算符和界符+-* /<<><= > >= = ;( ) | & #3) 空格由空白、制表符和换行符组成空格一般用来分隔id、num、专用符号和关键字,词法分析阶段通常被忽略。1.4 、各种单词符号

5、对应的种别码表 1 各种单词符号的种别码单词符号种别码char1int2if3else4var5return6break7do8while9for10double11float12short13标识符14数字15符号16-401.5 、 词法分析程序的主要算法思想算法的基本任务是从文件中读出字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号 , 并输出到文件中。2. 流程图:2.1 主程序流程图开始输入打开的文件名输入编译后的文件名是文件为空?否调用分析子程序输入串完毕是关闭文件完毕主函数流程图2.2 分析函数流程图开始变

6、量 初 始忽略空格是是否文件完毕返 回否字数符号获 取 一 个 单获取数字获取一个完整符否否存 在 于 标 识 符存 在 于 关 键 字是存 在 于 数 字否存 在 于 符 号将当前单词添是加到标识符表将当前数字添加到数字表中将当前符号添是是加到符号表中在文件中写入当前单词以与标识符种别码12在文件中写入当前单词以与对应的关键字种别在文件中写入当前单词以与对应的符号种在文件中写入当前单词以与对应的符号种返回分析函数流程图3. 源 代 码 : #include<stdio.h> #include<conio.h> #include<math.h> #inclu

7、de<string.h> #include<stdlib.h>int i, row = 0, line = 0;char a1000; /程序int number1000100; /常数表char mark1005;/标识符表file *fin,*fout;/词法分析int wordanalysis()if (ai >= 'a'&&ai <= 'z')|(ai>='a'&&ai<='z') /分析标识符和关键字char word10;charkeywo

8、rd100100="char","int","if","else","var","return","break","do","while","for","double ","float","short" /关键字表int n = 0; wordn+ = ai+;/若字符为az 或 09 ,则继续读取while(ai>='a&

9、#39;&&ai<='z')|(ai>='0'&&ai<='9')|(ai>='a'&&ai<='z')wordn+ = ai+;wordn = '0' i-;/判断该标识符是否为关键字for (n = 0; n < 100; n+)if (strcmp(word, keywordn) = 0)fprintf(fout,"%st(%d)t关键字 n", keywordn, n + 1); retu

10、rn 3;/判断该标识符是否存在标识符表中int m = 0;if (line != 0)int q = 0; while (q<line)if (strcmp(word, markq+) = 0)fprintf(fout,"%st(14,%d)t标识符 n", word, q); return 3;/将该标识符保存到标识符表中strcpy(markline, word);fprintf(fout,"%st(14, %d)t标识符 n", word, line + 1); line+;return 3;else if (ai >= '

11、0' && ai <= '9') /分析常数char x100; int n = 0, sum;xn+ = ai+;/判断字符是否是09 while (ai >= '0' && ai <= '9')xn+ = ai+;xn = '0' i-;int num = atoi(x); /将字符串转换成int型/判断该常数是否存在于常数表中if (row != 0)int y;for (y = 0; y < 1000; y+)int w = numbery0; sum = 0

12、;int d;for (d = 1; d <= numbery0; d+)w = w - 1;sum = sum + numberyd * pow(2, w);if (num = sum)fprintf(fout,"%dt(15,%d)n", num, y + 1); return 3;int z = num, c = num; int m = 0;do/计算是几位二进制数z = z / 2; m+; while (z != 0);for (n = m; n > 0; n-) /将二进制保存于常数表中numberrown = c % 2; c = c / 2;n

13、umberrow0 = m;int line = row;fprintf(fout,"%dt(15,%d)n", num, line + 1); row+;return 3;else/分析符号switch (ai)case ' ':case 'n': return -1;case '#': return 0;case '=':fprintf(fout,"=t(16)n"); return 3; case '<':i+;if (ai = '=')fprin

14、tf(fout,"<= t(17)n"); return 3;else if (ai = '>')fprintf(fout,"<>t(18)n"); return 3;elsei-;fprintf(fout,"<t(19)n"); return 3;case '>': i+;if (ai = '=')fprintf(fout,">=t(20)n"); return 3;elsei-;fprintf(fout,">

15、;t(21)n"); return 3;case '+': fprintf(fout,"+t(22)n"); return 3; case '-': fprintf(fout,"-t(23)n"); return 3; case '*': fprintf(fout,"*t(24)n"); return 3; case '/':i+;if(ai!='/') i-;fprintf(fout,"/t(25)n"); return 3

16、;elsewhile(1) if(ai+='n')return -1;fprintf(fout,"/t(35)n");return 3;case ':': fprintf(fout,":t(26)n"); return 3;case '': fprintf(fout,"t(27)n"); return 3;case '(': fprintf(fout,"(t(28)n"); return 3;case ')': fprintf(fout

17、,")t(29)n"); return 3;case '': fprintf(fout,"t(30)n"); return 3;case '': fprintf(fout,"t(31)n"); return 3;case '': fprintf(fout,"t(32)n"); return 3;case '': fprintf(fout,"t(33)n"); return 3; case '|': fprintf(f

18、out,"|t(34)n"); return 3; case '"': fprintf(fout,""t(35)n");return 3;case ',': fprintf(fout,",t(36)n"); return 3;case ''': fprintf(fout,"'t(37)n"); return 3;/单引号case '&': i+;if(ai!='&') i-;fprin

19、tf(fout,"&t(38)n"); return 3;elsefprintf(fout,"&&t(39)n");return 3;case '': fprintf(fout,"t(40)n"); return 3;int main()printf("*c语言实现编译原理词法分析器*nn");printf("n"); int l = 0;int m;i = 0;char input100,output100;/输入文件和输出文件的路径和文件名printf

20、("请输入词法分析输入的文件名( 包括路径):"); scanf("%s",input);printf("请输入词法分析输出的文件名( 包括路径):"); scanf("%s",output);fin=fopen(input,"r"); fout=fopen(output,"w"); if(fin=null)printf("打开词法分析输入文件有错n");return(1);if(fout=null)printf("打开词法分析输出文件有错n"); return(2);/返回错误代码2printf("n-开始进行词法分析n");while (!feof(fin)al+ = fgetc(fin);al = '#'dom = wordanalysis(); switch (m)case -1:i+; break; case 0: i+; break; case 3: i+; break; while (m != 0); fclose(fin);fclose(fout);printf("n-词法分析执行完毕n

温馨提示

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

评论

0/150

提交评论