欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    词法分析器实验报告(共9页).docx

    • 资源ID:13986158       资源大小:684.05KB        全文页数:9页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    词法分析器实验报告(共9页).docx

    精选优质文档-倾情为你奉上词法分析器实验报告班级: 姓名:郭金龙 学号:一、 问题描述设计并实现C语言的词法分析程序,要求如下。(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。(2)、可以识别并读取源程序中的注释。(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。(5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。实验要求:方法1:采用C/C+作为实现语言,手工编写词法分析程序。方法2:通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序二、算法思想及实现首先从主题上来看是一个大概的字符/字符串匹配过程,然后在这其中细化到分类包括标识符,关键字,标点符号,数字等等。这其中在计算一下几个方面的时候比较简单:(1) 行数:每次读到回车的时候行数加一(2) 单词数:在读标识符和关键字的时候每读到一个计数器加一(3) 字符数:除了标点符号和空格以外,每读到一个字符都计数器加一剩下的在判断各种符号的时候以及是否是关键字和标识符的时候,在程序中严格遵守书上给的流程图如下并且输出形式也严格按照书上给的表格如下:三、 设计描述主要说说这其中几个比较关键的地方(1) 首先要判断是否读到文件末尾,如果是的话要跳出并关闭文件,否则会导致内存泄露(2) 考虑需要超前判断的几个字符包括<>,<=,>=等等,这下如果读到第一个字符而下一个字符不是预想中的字符时候要指针回退一个字符,但是要考虑到如果这个字符是在文件末尾的话会出现循环的情况,这也是其中的一个问题(3) 关键字的判断上,首先要定义一个关键字数组或者容器,然后通过token里面临时存储的字符串来进行匹配,最后如果匹配成功或者失败要有相应的措施并且每次匹配后一定要清空token。四、 源程序#include<iostream> #include<fstream>#include<string>using namespace std;string keyword13="begin","end","if","then","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(c='<') character+; infile.get(c); if(c='=') character+; cout<<"<relop,LE>"<<endl; else if(c='>') character+; cout<<"<relop,NE>"<<endl; else cout<<"<relop,LT>"<<endl; if(!infile.eof() infile.seekg(-1, ios:cur);/指针向前一个字符 continue; else if(c='>') character+; infile.get(c); if(c='=') character+; cout<<"<relop,GE>"<<endl; else cout<<"<relop,GT>"<<endl; if(!infile.eof() infile.seekg(-1, ios:cur);/指针向前一位 continue; else if(c=':') infile.get(c); if(c='=') cout<<"<agsin-op,->"<<endl; else cout<<"<:,->"<<endl; if(!infile.eof() infile.seekg(-1, ios:cur); continue; else if(c='=') character+; cout<<"<relop,EQ>"<<endl; continue; else if(c='+') character+; cout<<"<+,->"<<endl; continue; else if(c='-') character+; cout<<"<-,->"<<endl; continue; else if(c='*') character+; cout<<"<*,->"<<endl; continue; else if(c='/') character+; cout<<"</,->"<<endl; continue; else if(c='(') character+; cout<<"<(,->"<<endl; continue; else if(c=')') character+; cout<<"<),->"<<endl; continue; else if(c=',') cout<<"<,->"<<endl; continue; else if(c='') cout<<"<,->"<<endl; 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<='z'&&c>='a')|(c<='Z'&&c>='A')&&c!='e')/判断错误出现的位置 temperr=rol; err+; cout<<"<num,常数表入口指针>"<<endl; 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;i<13;i+) if(keywordi=token) word_num+; cout<<keywordi<<" -"<<endl; /关键字 token.clear(); break; if(i=13) word_num+; cout<<"<id,指向标识符"<<token<<"在符号表中的入口指针>"<<endl;/标识符 token.clear(); continue; else ; infile.close();cout<<"程序共有"<<rol<<"行"<<endl;cout<<"程序共有"<<word_num<<"个单词"<<endl;cout<<"程序共有"<<character<<"个字符"<<endl;for(int j=0;j<err;j+)cout<<"第"<<tempj<<"行有错误!"<<endl; system("pause");五、测试结果注:这里主要测试两种结果其中一个是有错误的一个是没有错误的,这样可以对比一下六、用户使用说明用户需要在vs2010或vs2012下运行,注意不能用dev-c+,同时需要将文件名为1.txt的文件放在d盘根目录下面,虽然要求读取c文件,但里面装上.c的代码效果还是一样的,其他没有特殊要求七、心得体会这次试验中碰到了很多问题,主要说这其中最主要的问题,就是在读取文件中的字符的时候碰到文件末尾的问题,其实也是最关键的边界问题,当读取到<或者>的时候如果下一个符号是文件末尾,并且我们还需要超前读取字符,然后如果再需要指针回退,这时候就出现了一个死循环的问题,很久不能解决之后发现了一个新问题,就是将读取的一个字符放入定义的char c中,而这个时候有两种写法,一种是infile>>c;另一种是infile.get(c);我原来以为这两种是一样的,但是发现这两种在用的时候得到的功能却不一样,网上没有查到这两者的具体区别,但根据程序调试中的问题来看,我个人认为可能是这样的,infile.get(c)是指针指在当前字符,当执行这个语句的时候指针向前一个字符并且将那个字符存到c中,而在回退的时候指针再指向前一个字符,而infile>>c是指针指向当前的字符同时执行这个语句的时候把当前的字符输出,然后在把指针后移一位,而在回退以后在执行这条语句c里面存储的就是没有回退的那个字符,而也正是这二者的区别导致了边界死循环的问题。这次实验还是学到了很多,希望以后能够碰到并解决更多问题专心-专注-专业

    注意事项

    本文(词法分析器实验报告(共9页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开