ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:150.93KB ,
资源ID:18963970      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18963970.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验报告词法分析器内含源代码Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验报告词法分析器内含源代码Word文档格式.docx

1、17)181920=2123*24*25 =2627!282状态转换图數宇其它3程序流程:词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词 对应的二元组,输出标识符表、常数表由主程序来完成。2.实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本 结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步 骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。3.实验任务编制程序实现要求的功能,并能完成对测试样例程序的分析。四 实验原理int Reserve(char *strTaken); / 对 strTaken 中的字符串查找保留字表,若

2、是一个保留字返回它的数码,否则返回 0。void Retract(char *ch) ; / 将搜索指针器回调一个字符位置,将 ch 置为空白字符。void input();/ 向存放输入结果的字符数组输入一句语句。void display();/ 输出一些程序结束字符显示样式int analyzerSubFun();/ 词法分析器子程序,为了实现词法分析的主要功能。五 代码实现/ cifa.cpp : 定义控制台应用程序的入口点/ #include stdafx.h#include stdio.hstring.hiostream/set 存储代码 ,strtaken 存储当前字符/ 存储标识

3、符和常量的指针using namespace std;char set1000,str500,strtaken20; char sign5010,constant5010;/int Words50010; char ch; / 当前读入字符 int sr,to=0; / 数组 str, strtaken int st=0,dcount=0;int id=0;static int line=1; int h,l;typedef struct Words /* 放置二元组 */ int num; char letters20;program ,0, not ,1, begin ,2, end ,3

4、, if ,4, then ,5, var ,6, else ,7, int ,8, while ,9, and ,10, do ,11, or ,12,DS;DS Words500;typedef struct words char word20;int type;WORDS;WORDS words= + ,15, - ,16, ( ,17, ) ,18, ,19,; ,20, = ,21, ,22, ,23,25,;typedef struct keytable char name20; int kind;/* 设置关键字 */ KEYTABLE;KEYTABLE keyword=void

5、 openfile() /* 打开文件 */cout endl; 词法分析器 请在本程序根目录下寻找以 .txt ”为结尾的文件作为词法分析对象,输入文件名 FILE *fp;char a,filename10;int n=0;gets(filename);if (fp=fopen(filename, r )=NULL)/exit(0);elsewhile (!feof(fp)a=getc(fp);setn=a;n+;printf( cannot open file.n );/* 文件不结束,则循环 */*getc 函数带回一个字符,赋给 a*/* 文件的每一个字符都放入 set 数组中 */

6、fclose(fp); setn-1= 0void reflesh() /* 清空 strtaken 数组 */to=0; /* 全局变量 to 是 strtaken 的指示器 */strcpy(strtaken, void pre1() /* 预处理程序 */int i,a,b,n=0;doif (setn= / & setn+1= * )a=n; /* 记录第一个注释符的位置 */ while (!(setn= )nline+;b=n+1; /* 记录第二个注释符的位置 */for (i=a;ia chAZ ) return (1);else return (0);int IsDigit(

7、) /* 判断是否为数字 */if (ch09return (1);int Reserve() /* 对 strtaken 中的字符串查找保留字表,若是则返回它的编码,否则返回 */ int i,k=0;for (i=0;=12;i+)if (stricmp(strtaken,keywordi.name)=0) k=1;Wordsdcount.num=keywordi.kind; strcpy(Wordsdcount.letters, dcount+;return (keywordi.kind);if (k!=1)return (-1);void Retract() /* 指示器 sr 回调一

8、个字符位置,把 ch 置为空 */sr-;ch= int InsertId()int i,k;id; k=strcmp(strtaken,signi);if (k=0) return (i);strcpy(signid,strtaken); /* 插入标识符 */ Wordsdcount.num=13;strcpy(Wordsdcount.letters,strtaken); id+;return (id-1);int InsertConst()st;k=strcmp(strtaken,constanti);if (k=0)return (i);strcpy(constantst,strtak

9、en); /* 插入常数 */ Wordsdcount.num=14; strcpy(Wordsdcount.letters,strtaken);st+;return (st-1);void analysis()int value;reflesh(); /* 清空 strtaken 数组 */pre1(); /* 预处理,使注释内容换成单个空格,放回 set 中 */pre2(); /* 预处理,使 set 中连续的空格置换成单个空格,并把 set 的内容放到 str 中 */GetChar();/*把字符读入全局变量ch中,指示器sr前移*/GetBC();/* 读取第一个字符 */whil

10、e (ch!/* 当不等于结束符,继续执行 */if (IsLetter() / 标识符和关键字判定Concat();for (int c0=15;c0=23;c0+)if (stricmp(strtaken,wordsc0.word)=0)Wordsdcount.num=wordsc0.type; reflesh();break ; default :if (ch= ) /* 如果是 * 符号,继续读取下一个 */ /* 判断是否为 * 的 情况 */if (ch=strtaken0)Retract();for ( int c1=24;c1=25;c1+)if (stricmp(strtak

11、en,wordsc1.word)=0) Wordsdcount.num=wordsc1.type;/printf( %s,strtaken);/getchar();else if (ch= | ch= /* 判断是否为 =,!= 的情况 */=for (int c2=26;c2=28;c2+)if (stricmp(strtaken,wordsc2.word)=0)Wordsdcount.num=wordsc2.type; dcount+; h=ch/line;l=ch%line;Error in h 行l 列 输出二元组:for (int d_i=0;d_idcount;d_i+) cout

12、Wordsd_i.numWordsd_i.letters 输出标识符:for ( int sign_i=0;sign_isign_i+) coutsignsign_i cout 输出常量:for ( int const_i=0;const_iconst_i+) coutconstantconst_i=3 and nthe n j:=j-1;end .结果截图:mi thereisA.I consent脑出常量1 2六.总结我在这次词法分析器的设计过程中学到了很多东西,其中最大的收获是对于编译原理中的词法分析这一过程理解的更加清楚明了。其次,是在使用 C+编程的能力有所提高。当然,在该词法分析器设计中也有一些不足的地方, 比如能识别的关键字有限,并不能识别所有的关键字,识别不出字符常量等。分析结果 输出方式为:用一个存放结果的字符串数组,并用指针指向它,输出结果正确, 但是输出结果比较乱。不过总的来说,这次实验达到了其初衷,实现了规定的功八.致谢词:感谢XXX老师对我们的悉心教导以及提供我们这样一个学以致用的机会 通过这一阶段对编译原理课程的学习,特别是通过这次对于词法分析器的编程实 践,我对于编译原理中的词法分析这一过程理解的更加清楚明了,收获很大。

copyright@ 2008-2022 冰豆网网站版权所有

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