欢迎来到天天文库!上传客服QQ1290478887点击这里,给天天文库发消息,QQ:1290478887 | 帮助中心 分享价值,快乐你我!
天天文库
全部分类
  • 学术论文 >
    毕业论文 毕业设计 临时分类
    学术论文
    毕业论文 毕业设计 临时分类 土木工程毕业设计 asp毕业设计 安卓毕业设计 php毕业设计 文献综述 其他论文 外文翻译 Java毕业设计 asp.net论文 英语论文 机械毕业设计 船舶工程毕业论文 法学专业毕业论文 工商管理毕业论文 汉语言文学毕业论文 行政管理毕业论文 护理学毕业论文 化学专业毕业论文 会计学毕业论文 计算机论文 教育学论文 金融管理论文 景观设计毕业论文 旅游管理毕业论文 文秘秘书毕业论文 人力资源管理毕业论 期刊论文 数学专业毕业论文 心理学毕业论文 平面艺术设计论文 开题报告 音乐专业毕业论文 市场营销论文 装修毕业论文
  • 应用文档 >
    商业计划 设计方案 施工方案
    应用文档
    商业计划 设计方案 施工方案 事迹材料 使用与维护手册 工作思想汇报 表格清单 应急预案 调研报告 策划书 项目建议书 技术措施与指南 可行性研究报告 分析报告 演讲稿 自查报告 党校课件 党校讲课稿 合同协议范本 ppt模板 工作总结 工作计划 工作报告 讲话稿 心得体会 活动方案 规章制度 读后感 汇报材料 其他办公文档
  • 行业资料 >
    专业技术 解决措施 指导说明书
    行业资料
    专业技术 解决措施 指导说明书 组织施工设计 技术规范 国家标准 行业标准 经营营销
  • 教育资源 >
    课后答案 笔记讲义 主题班会
    教育资源
    课后答案 笔记讲义 主题班会 医学课件 PDF书籍 商业培训 优质公开课课件 考试资料 教学课件 职业培训课件 大学学习资料 高中学习资料 初中学习资料 小学学习资料 其他学习资料 练习与试题 英语资料 课程设计 临时分类
  • 其他资料 >
    其他文档 免费文档
    其他资料
    其他文档 免费文档
  • 首页 天天文库 > 资源分类 > DOCX文档下载
     

    编译原理实验报告——词法分析器(内含源代码)

    • 资源ID:18760123       资源大小:181.40KB        全文页数:17页
    • 资源格式: DOCX        下载权限:游客/注册会员    下载费用:10积分 【人民币10元】
    游客快捷下载 游客一键下载
    会员登录下载
    下载资源需要10积分 【人民币10元】

    邮箱/QQ:
    温馨提示:
    支付成功后,系统会根据您填写的邮箱或者QQ号作为您下次登录的用户名和密码(如填写的是QQ,那登陆用户名和密码就是QQ号),方便下次登录下载和查询订单;
    特别说明:
    付款后即可正常下载,下载内容为可编辑文档格式,推荐使用支付宝;
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    1、本站资源不支持迅雷下载,请使用浏览器直接下载(不支持QQ浏览器);
    2、文档下载后都不会有天天文库的水印,预览文档经过压缩,下载后原文更清晰;
    3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
    4、所有文档都是可以预览的,天天文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供保证;
    5、文档的总页数、文档格式和文档大小以系统显示为准(不同办公软件显示的页数偶尔有区别),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
    6、如果您还有什么不清楚的,可以点击右侧栏的客服对话;
    下载须知 | 常见问题汇总

    编译原理实验报告——词法分析器(内含源代码)

    编译原理实验(一)编译原理实验(一) 词法分析器词法分析器 一.一. 实验描述实验描述 运行环境vc2008 对某特定语言 A ,构造其词法规则。 该语言的单词符号包括 1 该程序能识别的单词符号及类别说明表 单词类别 PROGRAM0 NOT1 BEGIN2 IF3 END 4 THEN5 VAR6 ELSE7 INT8 WHILE9 AND10 DO11 OR 12 标识符13 常数14 15 -16 17 18 ,19 ;20 21 22 23 *24 **25 26 27 28 2 状态转换图 3程序流程 输入一个字符ch 去掉空格 Ch进行判断 将ch与strToken连接输入ch继续 判断ch若为字母、数字、下滑线 连接继续输入 将ch与strToken连接输入ch继续判断 ch若为数字、小数点连接继续输入 运算符界符判断 数字 字母或下滑线其他字符 查表判断是否保留 字 输出保留字 输出用户标识 符 是 不是 输出数字 运算符界 符 继续输入判断 是否为二元三 元运算符 运算符 输出运算符输出界符 界符 判断读入的文 件是否为空 是 否 结束 开始 词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单 词对应的二元组,输出标识符表、常数表由主程序来完成。 二.二. 实验目的实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本 结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和 步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的 能力。 三.三. 实验任务实验任务 编制程序实现要求的功能,并能完成对测试样例程序的分析。 四.四. 实验原理实验原理 char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符 char sign[50][10],constant[50][10];//存储标识符和常量 定义了一个 Analyzer 类 class Analyzer{ public Analyzer; //构造函数 Analyzer; //析构函数 int IsLetterchar ch; //判断是否是字母,是则返回 1,否则返回 0。 int IsDigitchar ch; //判断是否为数字,是则返回 1,否则返回 0。 void GetCharchar *ch; //将下一个输入字符读到 ch 中。 void GetBCchar *ch; //检查 ch 中的字符是否为空白, 若是,则调用 GetChar 直至 ch 进入一个非空白字符。 void Concatchar *strTaken, char *ch; //将 ch 中的字符连接到 strToken 之后。 int Reservechar *strTaken; //对 strTaken 中的字符串查找保留字表,若是一个保留 字返回它的数码,否则返回 0。 void Retractchar *ch ; //将搜索指针器回调一个字符位置,将 ch 置为空白字符。 void input;//向存放输入结果的字符数组输入一句语句。 void display;//输出一些程序结束字符显示样式 int analyzerSubFun;//词法分析器子程序,为了实现词法分析的主要功能。 五.五. 代码实现代码实现 // cifa.cpp 定义控制台应用程序的入口点。 // include stdafx.h include stdio.h include string.h include iostream using namespace std; char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符 char sign[50][10],constant[50][10];//存储标识符和常量 //int Words[500][10]; char ch;//当前读入字符 int sr,to0;//数组str, strtaken 的指针 int st0,dcount0; int id0; static int line1; int h,l; typedef struct Words /*放置二元组*/ { int num; char letters[20]; }DS; DS Words[500]; typedef struct words { char word[20]; int type; }WORDS; WORDS words[]{ {program,0}, {not,1}, {begin,2}, {end,3}, {if,4}, {then,5}, {var,6}, {else,7}, {int,8}, {while,9}, {and,10}, {do,11}, {or,12}, {,15}, {-,16}, {,17}, {,18}, {,,19}, {;,20}, {,21}, {,22}, {,23}, {*,24}, {**,25}, {,26}, {,27}, {,28} }; typedef struct keytable /*放置关键字*/ { char name[20]; int kind; }KEYTABLE; KEYTABLE keyword[]{ /*设置关键字*/ {program,0}, {not,1}, {begin,2}, {end,3}, {if,4}, {then,5}, {var,6}, {else,7}, {int,8}, {while,9}, {and,10}, {do,11}, {or,12}, }; void openfile /*打开文件*/ { cout____________________________________________________endl; cout 词法分析器 endl; cout____________________________________________________endl; cout请在本程序根目录下寻找以.txt”为结尾的文件作为词法分析对象,输入文件名endl; FILE *fp; char a,filename[10]; int n0; getsfilename; iffpfopenfilename,rNULL { printfcannot open file.\n; //exit0; } else whilefeoffp /*文件不结束,则循环*/ { agetcfp; /*getc函数带回一个字符,赋给a*/ set[n]a; /*文件的每一个字符都放入set[]数组中*/ n; } fclosefp; /*关闭文件*/ set[n-1]\0; } void reflesh /*清空strtaken数组*/ { to0; /*全局变量to是strtaken的指示器*/ strcpystrtaken, ; } void pre1 /*预处理程序*/ { int i,a,b,n0; do { ifset[n]/ set[n1]* { an; /*记录第一个注释符的位置*/ whileset[n]* set[n1]/ { ifset[n]\n line; n; } bn1; /*记录第二个注释符的位置*/ foria;ib;i /**/ set[i] ; /*把注释的内容换成空格,等待第二步预处理*/ } else ifset[n]/ set[n1]/ { an; /*记录第一个注释符的位置*/ whileset[n]\n n; bn1; /*记录第二个注释符的位置*/ foria;ib;i /**/ set[i] ; /*把注释的内容换成空格,等待第二步预处理*/ } n; }whileset[n]\0; } void pre2 /*预处理程序*/ { int j0; sr0; /*全局变量sr是str[]的指示器*/ do { ifset[j] || set[j]\n { whileset[j] || set[j]\n /*扫描到有连续的空格或换行符*/ { ifset[j]\n line; j; } str[sr] ; /*用一个空格代替扫描到的连续空格和换行符放入str[]*/ sr; } else { str[sr]set[j]; /*若当前字符不为空格或换行符就直接放入str[]*/ sr; j; } }whileset[j]\0; str[sr]\0; } char GetChar /*把字符读入全局变量ch中,指示器sr前移*/ { chstr[sr]; sr; returnstr[sr-1]; } void GetBC /*开始读入符号,直至第一个不为空格*/ { whilech { chGetChar; } } void Concat /*把ch中的字符放入strtaken[]*/ { strtaken[to]ch; to; /*全局变量to是strtaken的指示器*/ strtaken[to]\0; } int IsLetter /*判断是否为字母*/ { ifcha chz||chA chZ return1; else return0; } int IsDigit /*判断是否为数字*/ { ifch0 ch9 return1; else return0; } int Reserve /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回-*/ { int i,k0; fori0;i12;i { ifstricmpstrtaken,keyword[i].name0 { k1; Words[dcount].numkeyword[i].kind; strcpyWords[dcount].letters,-; dcount; returnkeyword[i].kind; } } ifk1 return-1; } void Retract /*指示器sr回调一个字符位置,把ch置为空*/ { sr--; ch ; } int InsertId { int i,k; fori0;iid;i { kstrcmpstrtaken,sign[i]; ifk0 returni; } strcpysign[id],strtaken; /*插入标识符*/ Words[dcount].num13; strcpyWords[dcount].letters,strtaken; id;dcount; returnid-1; } int InsertConst { int i,k; fori0;ist;i { kstrcmpstrtaken,constant[i]; ifk0 returni; } strcpyconstant[st],strtaken;/*插入常数*/ Words[dcount].num14; strcpyWords[dcount].letters,strtaken; st;dcount; returnst-1; } void analysis { int value; reflesh; /*清空strtaken数组*/ pre1; /*预处理,使注释内容换成单个空格,放回set[]中*/ pre2; /*预处理,使set[]中连续的空格置换成单个空格,并把set[]的内容放到str[]中 */ sr0; GetChar; /*把字符读入全局变量ch中,指示器sr前移*/ GetBC; /*读取第一个字符*/ whilech\0 /*当不等于结束符,继续执行*/ { ifIsLetter//标识符和关键字判定 { whileIsLetter || IsDigit /*若第一个是字符,继续读取,直到出现空格*/ { Concat; GetChar; /*把字符读入全局变量ch中,指示器sr前移*/ } Retract; /*指示器sr回调一个字符位置,把ch置为空*/ valueReserve; /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否 则返回-*/ ifvalue-1 /*如果返回值是-,那就是标识符,把它输出*/ { InsertId; /*插入标识符*/ } reflesh; } else ifIsDigit { whileIsDigit /*否则,若第一个是数字,继续读取,直到出现空格*/ { Concat; /*把ch中的字符放入strtaken[]*/ GetChar; } Retract; /*指示器sr回调一个字符位置,把ch置为空*/ InsertConst; /*插入常数,返回类型为int*/ //printf s,strtaken; //getchar; reflesh; } else switchch /*否则,若是下面的符号*/ { case+ case- case case case, case; case case case Concat; forint c015;c023;c0 { ifstricmpstrtaken,words[c0].word0 { Words[dcount].numwords[c0].type; dcount; } } reflesh; break; defaultifch* /*如果是*符号,继续读取下一个*/ { Concat; /*判断是否为**的 情况*/ GetChar; ifchstrtaken[0] Concat; else Retract; forint c124;c125;c1 { ifstricmpstrtaken,words[c1].word0 { Words[dcount].numwords[c1].type; dcount; } } //printf s,strtaken; //getchar; reflesh; break; } else ifch || ch || ch { Concat; /*判断是否为,, 的情况*/ GetChar; ifch Concat; else Retract; forint c226;c228;c2 { ifstricmpstrtaken,words[c2].word0 { Words[dcount].numwords[c2].type; dcount; } } reflesh; break; } else { hch/line; lchline; coutError in h行l列endl; //getchar; break; } } GetChar; GetBC; } cout输出二元组endl; forint d_i0;d_idcount;d_i coutWords[d_i].num Words[d_i].lettersendl; coutendl; cout输出标识符endl; forint sign_i0;sign_iid;sign_i coutsign_i sign[sign_i]endl; coutendl; cout输出常量endl; forint const_i0;const_ist;const_i coutconst_i constant[const_i]endl; coutendl; } int _tmainint argc, _TCHAR* argv[] { openfile; analysis; printfAnalysis is finished; getchar; return 0; } 测试结果测试结果 测试语句为ProgramProgram exampleexample ; ; varvar intint j,m,n;j,m,n; BeginBegin /*there/*there isis * * a a / / comment*/comment*/ i2;i2; j6;j6; m3;m3; //there//there isis a a commentcomment njm;njm; IfIf n3n3 andand n5n5 thenthen jj-1;jj-1; endend . . 结果截图 六.六. 总结总结 我在这次词法分析器的设计过程中学到了很多东西,其中最大的收获是对 于编译原理中的词法分析这一过程理解的更加清楚明了。其次,是在使用 c 编程的能力有所提高。当然,在该词法分析器设计中也有一些不足的地方,比 如能识别的关键字有限,并不能识别所有的关键字,识别不出字符常量等。分 析结果输出方式为用一个存放结果的字符串数组,并用指针指向它,输出结 果正确,但是输出结果比较乱。不过总的来说,这次实验达到了其初衷,实现 了规定的功能。 八.致谢词 感谢 xxx 老师对我们的悉心教导以及提供我们这样一个学以致用的机会。 通过这一阶段对编译原理课程的学习,特别是通过这次对于词法分析器的编程 实践,我对于编译原理中的词法分析这一过程理解的更加清楚明了,收获很大。

    注意事项

    本文(编译原理实验报告——词法分析器(内含源代码))为本站会员(dreamwencai)主动上传,收益归上传者所有,天天文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知天天文库(发送邮件至129047888[email protected]或直接QQ联系客服),我们立即给予删除!

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




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给天天文库发消息,QQ:1290478887 - 联系我们

    网站客服QQ:1290478887        微信公众号:iwenku365

    [email protected] 2017-2027 wenku365.com 网站版权所有

    经营许可证编号:鄂ICP备17008239号-1 

    收起
    展开