词法分析器实验报告_第1页
词法分析器实验报告_第2页
词法分析器实验报告_第3页
词法分析器实验报告_第4页
词法分析器实验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、词法分析器实验报告班级: 姓名:郭金龙 学号:一、 问题描述设计并实现C语言的词法分析程序,要求如下。(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。(2)、可以识别并读取源程序中的注释。(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。(5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。实验要求:方法1:采用C/C+作为实现语言,手工编写词法分析程序。方法2:通

2、过编写LEX源程序,利用LEX软件工具自动生成词法分析程序二、算法思想及实现首先从主题上来看是一个大概的字符/字符串匹配过程,然后在这其中细化到分类包括标识符,关键字,标点符号,数字等等。这其中在计算一下几个方面的时候比较简单:(1) 行数:每次读到回车的时候行数加一(2) 单词数:在读标识符和关键字的时候每读到一个计数器加一(3) 字符数:除了标点符号和空格以外,每读到一个字符都计数器加一剩下的在判断各种符号的时候以及是否是关键字和标识符的时候,在程序中严格遵守书上给的流程图如下并且输出形式也严格按照书上给的表格如下:三、 设计描述主要说说这其中几个比较关键的地方(1) 首先要判断是否读到文

3、件末尾,如果是的话要跳出并关闭文件,否则会导致内存泄露(2) 考虑需要超前判断的几个字符包括,=等等,这下如果读到第一个字符而下一个字符不是预想中的字符时候要指针回退一个字符,但是要考虑到如果这个字符是在文件末尾的话会出现循环的情况,这也是其中的一个问题(3) 关键字的判断上,首先要定义一个关键字数组或者容器,然后通过token里面临时存储的字符串来进行匹配,最后如果匹配成功或者失败要有相应的措施并且每次匹配后一定要清空token。四、 源程序#include #include#includeusing namespace std;string keyword13=begin,end,if,t

4、hen,else,while,write,read,do, call,const,char,until;int main() int i=0;/循环计数器int rol=1;/计算行数int word_num=0;/计算单词个数int character=0;/计算字符个数int temp100;/标记出错的行数int err=0; char c; string token; ifstream infile(d:1.txt,ios:in); while(!infile.eof() infile.get(c); if(infile.eof()break;if(c=n)rol+; else if(

5、c=) character+; infile.get(c); if(c=) character+; cout) character+; coutendl; else cout) character+; infile.get(c); if(c=) character+; coutendl; else coutendl; if(!infile.eof() infile.seekg(-1, ios:cur);/指针向前一位 continue; else if(c=:) infile.get(c); if(c=) coutendl; else coutendl; if(!infile.eof() in

6、file.seekg(-1, ios:cur); continue; else if(c=) character+; coutendl; continue; else if(c=+) character+; coutendl; continue; else if(c=-) character+; coutendl; continue; else if(c=*) character+; coutendl; continue; else if(c=/) character+; coutendl; continue; else if(c=() character+; coutendl; contin

7、ue; else if(c=) character+; coutendl; continue; else if(c=,) coutendl; continue; else if(c=;) coutendl; continue; else if(0=c&c=9)/判断常数 while(0=c&c=9) if(infile.eof() break; character+;/计算数字字符个数 token.push_back(c); infile.get(c); if(!infile.eof()infile.seekg(-1, ios:cur);if(c=_|(c=a)|(c=A)&c!=e)/判断错

8、误出现的位置 temperr=rol; err+; coutendl; token.clear(); continue; else if(a=c&c=z)|(A=c&c=Z) while(a=c&c=z)|(A=c&c=Z)|(0=c&c=9) if(infile.eof() break; character+;/计算标识符中的字符个数 token.push_back(c); infile.get(c); if(!infile.eof()infile.seekg(-1, ios:cur); for(i=0;i13;i+) if(keywordi=token) word_num+; coutke

9、ywordi -endl; /关键字 token.clear(); break; if(i=13) word_num+; coutid,指向标识符tokenendl;/标识符 token.clear(); continue; else ; infile.close();cout程序共有rol行endl;cout程序共有word_num个单词endl;cout程序共有character个字符endl;for(int j=0;jerr;j+)cout第tempj行有错误!endl; system(pause);五、测试结果注:这里主要测试两种结果其中一个是有错误的一个是没有错误的,这样可以对比一下

10、六、用户使用说明用户需要在vs2010或vs2012下运行,注意不能用dev-c+,同时需要将文件名为1.txt的文件放在d盘根目录下面,虽然要求读取c文件,但里面装上.c的代码效果还是一样的,其他没有特殊要求七、心得体会这次试验中碰到了很多问题,主要说这其中最主要的问题,就是在读取文件中的字符的时候碰到文件末尾的问题,其实也是最关键的边界问题,当读取到的时候如果下一个符号是文件末尾,并且我们还需要超前读取字符,然后如果再需要指针回退,这时候就出现了一个死循环的问题,很久不能解决之后发现了一个新问题,就是将读取的一个字符放入定义的char c中,而这个时候有两种写法,一种是infilec;另一种是infile.get(c);我原来以为这两种是一样的,但是发现这两种在用的时候得到的功能却不一样,网上没有查到这两者的具体区别,但根据程序调试中的问题来看,我个人认为可能是这样的,infile.get(c)是指针指在当前字符,当执行这个语句的时候指针向

温馨提示

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

最新文档

评论

0/150

提交评论