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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理词法分析报告.docx

1、编译原理词法分析报告1、实验目的1、 为初等函数运算语言构造词法分析器。2、 掌握生成词法分析器的方法,加深对词法分析原理的理解。3、 掌握设计、编制并调试词法分析程序的思想和方法2、实验内容一、 根据下面的要求设计初等函数运算语言的词法模式,并用正则式表达出来1、 初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如: 123.321。具体要求:不支持整数部分大于。时首数字为0;不支持小数点后结尾为 0;不支持科学记数法;不支持仅为整数时有小数点;支持负数符号,不支持正数 符号。2、 初等函数运算语言的变量采用与C语言的标识符定义一样的方式:首字符为字母或 下划线;其他的为

2、字母、数字及下划线的混合串;区分大小写;变量长度不超过32 个字符。3、 初等函数运算语言需要处理的函数仅为表一中所列举的内容。函数的格式及参数内 容也如表一所示。4、 初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:+-*/。5、 初等函数运算语言的合法的分隔符包括:空格、制表符、分行符圆括号(左、右)、 分号。其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、 右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识 一个语句的结束。6、 初等函数运算语言支持的常量还包括:PI,Eo其中,PI为圆周率,E为自然常数。二、 将正则式转化为最小D

3、FA,给出该DFA的形式化表示和图形表示。三、 根据DFA给出状态转换表。四、 给出初等函数运算语言的记号表,即词法分析中,语言中的记号将分为多少类,每一类 型的编码、类型、属性等内容是什么。五、 编写词法分析器,将输入的字符串转化成为记号流,便于后续的语法分析工作。要求词 法分析器中能够识别词法错误。2.1词法模式设计/正则式分隔符compart=t|n|(|)|;|空格运算符:operation=+|-|*|/|=|变量:variable=azAZ( azAZ_09)*常量:constant=( |-)(0|(19)(09)*)(.(09)*(19)| )|PI|E2.2DFA注:id表示

4、字母,num表示数字2.3状态转换表id01-9下划线减号小数点01341281111198283488838888964844896686788878678988888888注:0是初态,2,6是中间状态,1,3,4,7是终态,其中1表示标示符,3,4,7是实数,8表示不合法的状态,9表示-为减号2.4记号表符号SinCostgctgloglgIn();?+记号01234567891011符号-*/=常量变量无法 识别 的标 示符,记号12131415161718192021223、实验程序清单#include #includeusing namespace std;#define max

5、10char ch = ;string key7=sin,cos,tg,ctg,log,lg,ln;/关键字char compart6=t,n,(,),;, ;/分隔符char operation5=+,-,*,/,=;/运算符/int s8=0,1,2,3,4,6,7,8;/状态集合,0 是初态,2,6 是中间状态, 1,3,4,7 是终态, 其中1表示标示符,3,4,7 是实数,8 表示不合法的状态int token23=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22;/0 表示 sin, 1 表示 cos, 2 表示

6、tg,3 表示 ctg,4 表示 log, 5 表示 lg,6 表示 ln,7 表示(, 8 表示), 9 表示; , 10 表示? , 11 表示+, 12 表示-, 13 表示*, 14 表示/,15 表示=,/16 表示常量, 17 表示变量,18 表示不可识别标示符, 19 表示,20 表示逗号, 21 表示, 22表示char arr32;int state=0;int s=0;bool tag=0;/tag=0 表示-为负数的负号, tag=1 表示-为减号FILE *fp;int IsKey(string c) /判断是否为关键字for(int i=0;i7;i+)if(pare

7、(c)=0) return i;/返回下标, 下标和其 token 记号一致return -1;bool IsLetter(char c) /判断是否为字母if(c=a)|(c=A)return 1;elsereturn 0;bool IsNum(char c) /判断是否为 1-9 的数字if(c=1&c=9)return 1;elsereturn 0;bool IsUnderline(char c) /判断是否为下划线if(c=_)return 1;elsereturn 0;void move(char ch,int s)/在状态 s 接收字符 ch 后, 移动的新状态/arr=arr+c

8、h;switch(s)case 0:if(ch=_|IsLetter(ch)state= 1;elseif(ch=0)state=3;elseif(IsNum(ch)state=4;elseif(ch=-)state=2;elsestate=8;break;case 1:if(IsNum(ch)|ch=_|IsLetter(ch)|ch=0)state=1;elseif(ch=-)state=9;elsestate=8;break;case 2:if(ch=0)state=3;elseif(IsNum(ch)state=4;elsestate=8;break;case 3:if(ch=.)st

9、ate=6;elseif(ch=-)state=9;elsestate=8;break;case 4:if(IsNum(ch)|ch=0)state=4;elseif(ch=-)state=9;elseif(ch=.)state=6;elsestate=8;break;case 6:if(ch=0)state=6;elseif(IsNum(ch)state=7;elsestate=8;break;case 7:if(ch=0)state=6;elseif(IsNum(ch)state=7;elseif(ch=-)state=9;elsestate=8;break;case 8:if(ch=-)

10、state=9;elsestate=8;break;/switchvoid judge(char arr)if(s=3|s=4|s=7)cout(arr token16)endl; /常量elseif(s=1)if(!strcmp(arr,PI)|!strcmp(arr,E)cout(arr token16)endl; /常量elseif(IsKey(arr)=-1)cout(arr token17)endl; /普通标示符elsecout(arr IsKey(arr)endl; /关键字elseif(s=9)cout(arr token12)endl;/减号if(s=8)cout(arr t

11、oken18)endl; /不可识别标示符标示符switch(ch)case+:cout(ch token11)endl;break;/运算符case* :cout(ch token13)endl;break;/运算符case= :cout(ch token15)endl;break;/运算符case/ :cout(ch token14)endl;break;/运算符case:cout(ch token19)endl;break;/运算符case( :cout(ch token7)endl;break;/分隔符case) :cout(ch token8)endl;break;/分隔符case;

12、 :cout(ch token9)endl;break;/分隔符case, :cout(ch token20)endl;break;/分隔符case :cout(ch token21)endl;break;/分隔符case :cout(ch token22)endl;break;/分隔符case?:cout(ch token10)endl;break;/运算开始符case :case/t:case/n: void analyse(FILE*fp)int i=0;while(ch!=EOF)char arr32=0;while(ch!=(&ch!=)&ch!=&ch!=t&ch!=n&ch!=&

13、ch!=&ch!=,&ch!=?&ch!=-&ch!=&ch!=;&ch!=+&ch!=*&ch!=/&ch!=&ch!=EOF)if (i32)arri=ch;move(ch,s);s=state;i+;ch=fgetc(fp);/whilejudge(arr);if(ch=-)char arr32=0;i=0;while(ch!=(&ch!=)&ch!=&ch!=t&ch!=n&ch!=&ch!=&ch!=,&ch!=?&ch!=&ch!=;&ch!=+&ch!=*&ch!=/&ch!=&ch!=EOF)move(ch,s);s=state;arri=ch;if(state!=9)i+;c

14、h=fgetc(fp);else /s=9 为减号时char arr32=0;break;/whilejudge(arr);s=0;i=0;ch=fgetc(fp);elsechar arr32=0;ch=fgetc(fp);i=0;s=0;/whilevoid main()char in_fn30;FILE * fp;coutin_fn;if(fp=fopen(in_fn,r)!=NULL)/意思是文件指针 fpin 在调用 fopen 打开文件如果失败, 则会成为一个空指针!break; /文件顺利打开后, 指向该流的文件指针就会被返回。elsecout文件路径错误! 请输入源文件名(包括

15、路径和后缀名) :;coutn*分析如下*endl;ch=fgetc(fp);char arr32=0;arr0=ch;/ fseek(fp,-1,1);analyse(fp);fclose(fp);couta;4、调试过程和运行结果5、程序的主要部分及其功能说明由DFN得到的状态转换程序: void move(char ch,int s)/在状态 s 接收字符 ch 后, 移动的新状态switch(s)/状态 0 时, 当接收到字符 ch 为字母或下划线时状态 S 转移到状态 1, ch 为 0 时转移到状态 3, ch 为 1-9 时转移到状态 4, ch 为- 时, 转移到状态 2, 否

16、则转移到状态 8case 0:if(ch=_|IsLetter(ch)state= 1;elseif(ch=0)state=3;elseif(IsNum(ch)state=4;elseif(ch=-)state=2;elsestate=8;break;case 1:if(IsNum(ch)|ch=_|IsLetter(ch)|ch=0)state=1;elseif(ch=-)state=9;elsestate=8;break;case 2:if(ch=0)state=3;elseif(IsNum(ch)state=4;elsestate=8;break;case 3:if(ch=.)state

17、=6;elseif(ch=-)state=9;elsestate=8;break;case 4:if(IsNum(ch)|ch=0)state=4;elseif(ch=-)state=9;elseif(ch=.)state=6;elsestate=8;break;case 6:if(ch=0)state=6;elseif(IsNum(ch)state=7;elsestate=8;break;case 7:if(ch=0)state=6;elseif(IsNum(ch)state=7;elseif(ch=-)state=9;elsestate=8;break;case 8:state=8;/sw

18、itch从文件读字符, 并进行词法分析, 当读入的字符不为运算符和界符时就往下读,并将读到的字符存入数组 arr, 当遇到运算符和界符时调用 judge(arr)进行分析, 输出arr 所存字符串及其属性, 当遇到- 时, 需要判断它是表示减号还是表示负数的负号, 主要是根据其状态来判断, 如果输入- 后, 若其状态没有调到状态 9, 则其为负数的负号, 否则为减号。 主要程序如下:void analyse(FILE*fp)int i=0;while(ch!=EOF)char arr32=0;while(ch!=(&ch!=)&ch!=&ch!=t&ch!=n&ch!=&ch!=&ch!=,&

19、ch!=?&ch!=-&ch!=&ch!=;&ch!=+&ch!=*&ch!=/&ch!=&ch!=EOF)if (i32)arri=ch;move(ch,s);s=state;i+;ch=fgetc(fp);/whilejudge(arr);if(ch=-)/如果遇到-char arr32=0;i=0;while(ch!=(&ch!=)&ch!=&ch!=t&ch!=n&ch!=&ch!=&ch!=,&ch!=?&ch!=&ch!=;&ch!=+&ch!=*&ch!=/&ch!=&ch!=EOF)move(ch,s);s=state;arri=ch;if(state!=9)i+;ch=fge

20、tc(fp);else /s=9 为减号时char arr32=0;break;/whilejudge(arr);s=0;i=0;ch=fgetc(fp);else/是除- 外的运算符和界符时char arr32=0;ch=fgetc(fp);i=0;s=0;/while6、实验收获体会通过实验,我理解了如何通过DFA的状态转换来构造词法分析器,掌握了生成词法分析 器的方法,加深了对词法分析原理的理解。同时在编程的过程中提高了编程能力。7、改进意见该词法分析器所能识别的字符串是有限的,不够完全,像main,void ,double,int等许多关 键字都没有定义到关键字的数组里面去,仅能被识别为一个变量。

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

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