首页 > 代码库 > 编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)
编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)
实验一、词法分析实验
专业:信息技术与工程学院 姓名:吕军 学号:201506110159
一、 实验目的
目的:主要是为了编辑一个词法分析程序。了解计算机的识别源程序字符串的过程。
二、 实验内容和要求
实验内容:通过了解 各种单词符号对应的种别码表,编写一个简单的词法分析程序,通过计算机识别字符串,反映其中的单词符号和所对应的种别码。
实验要求:用户输入源程序字符串,输出:二元组(种别,单词本身)
三、 实验方法、步骤及结果测试
1. 源程序名:简单的词法分析.c
可执行程序名:D:\Debug\简单的词法分析.exe
2. 原理分析及流程图
主要总体设计问题:
- 该用什么方式录入用户所输入的字符串。
- 该用什么方法去实现 识别这字符串的内容。怎么区别,识别,字符和关键字。
- 程序的便利问题。
程序原理分析:
我所写的仅仅只是十几个,二十多个字符识别的程序,所以我所用的存储结构是:以getchar从键盘录入,存入字符数组中。
主要算法:运用循环语句,使用switch case语句,一个个去识别是否对应得上字符串里的内容。
关键函数:getchar switch case
流程图:
3. 主要程序段及其解释:
1. while(ch!=‘\n‘) { ch=getchar(); //字符串的录入与放存 entry[i]=ch; i++; }
for(j=0;j<i-1;j++) { switch(entry[j]) { case ‘+‘: printf("%c 13 \n",entry[j]); break; case ‘-‘: printf("%c 14 \n",entry[j]); break; case ‘*‘: printf("%c 15 \n",entry[j]); break; case ‘/‘: printf("%c 16 \n",entry[j]); break; case ‘:‘: ch2=entry[j+1]; if(ch2==‘=‘) { printf("%c%c 18\n",entry[j],entry[j+1]); j=j+1; } else printf("%c 17\n",entry[j]); break; case ‘<‘: ch2=entry[j+1]; if(ch2==‘=‘) { printf("%c%c 21 \n",entry[j],entry[j+1]); j=j+1; } else if(ch2==‘>‘) { printf("%c%c 22 \n",entry[j],entry[j+1]); j=j+1; } else printf("%c 20 \n",entry[j]); break; case ‘>‘: ch2=entry[j+1]; if(ch2==‘=‘) { printf("%c%c 24\n",entry[j],entry[j+1]); j=j+1; } else printf("%c 23\n",entry[j]); break; case ‘=‘: printf("%c 25\n",entry[j]); break; case ‘;‘: printf("%c 26 \n",entry[j]); break; case ‘(‘: printf("%c 27 \n",entry[j]); break; case ‘)‘: printf("%c 28 \n",entry[j]); break; case ‘#‘: printf("%c 0\n",entry[j]); break; case ‘b‘: if(entry[j+1]==‘e‘&&entry[j+2]==‘g‘&&entry[j+3]==‘i‘&&entry[j+4]==‘n‘) { printf("begin 1\n"); j=j+4; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘i‘: if(entry[j+1]==‘f‘) { printf("if 2\n",entry[j]); j=j+1; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘t‘: if(entry[j+1]==‘h‘&&entry[j+2]==‘e‘&&entry[j+3]==‘n‘) { printf("then 3\n"); j=j+3; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘w‘: if(entry[j+1]==‘h‘&&entry[j+2]==‘i‘&&entry[j+3]==‘l‘&&entry[j+4]==‘e‘) { printf("while 4\n"); j=j+4; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘d‘: if(entry[j+1]==‘o‘) { printf("do 5\n "); j=j+1; } else if(entry[j+1]==‘i‘&&entry[j+2]==‘g‘&&entry[j+3]==‘h‘&&entry[j+4]==‘t‘) { printf("dight 11\n"); j=j+4; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘e‘: if(entry[j+1]==‘n‘&&entry[j+2]==‘d‘) { printf("end 6\n"); j=j+2; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; case ‘l‘: if(entry[j+1]==‘e‘&&entry[j+2]==‘t‘&&entry[j+3]==‘t‘&&entry[j+4]==‘e‘&&entry[j+5]==‘r‘) { printf("letter 10 \n"); j=j+5; } else printf("未能识别 %c 这个单词符号 \n",entry[j]); break; default : printf("未能识别 %c 这个字符 \n", entry[j]); } //这一大段是将已知道的字符,对用户输入里的关键单词进行识别
4. 运行结果及分析
分析:我觉得程序还做得不太好,排版还是有些问题。
四、 实验总结
心得体会:
难点:1.用户输入字符串存储的问题,我考虑过用getchar直接录入,也考虑过用数组,和单链表,最终我选择了字符数组,因为将用户录入的字符串放在数组里更容易操作,当然,其他两种更加简便,不过我还没想出怎么去用,因为在选择用getchar和单链表的时候都会遇到一些问题。
2.用什么方法去识别,去输出的问题。我想到的是用switch case的判断语句去实现的,不过这样很麻烦,而且工程量大,仅仅只适合于比较小规模的字符判别。如果字符判别类型过多,需要些很多的case语句。很麻烦。所以我写的只是简单的词法分析程序。而我看过我同学所写的程序,他写的很详细,他运用到了数组函数,用到了许多if else 和switch case语句,我觉得他那样写简便很多,而且他写的是判断标识符,界符的程序,如果添加其它的,可以简便的添加。我的太麻烦了。
解决方案:1.查阅书籍。
2.向C语言厉害的同学请教。
3.网络搜索,看看别人是怎么写的。有没有值得参考的地方。
编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)