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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验1词法分析实验报告.docx

1、实验1词法分析实验报告 软件学院编译原理实验报告 题 目: 词法、语法分析 专 业: 软件工程 班 级: rB软件W101 学 号: 201007104141 学生姓名: 田博 指导教师: 陆筱霞 日 期: 2013-6-21 实验 词法分析实验报告一:实验目的 调试并完成一个词法分析程序,加深对词法分析原理的理解。二:实验要求1、 待分析的简单语言的词法(1) 关键字:begin if then while do end所有关键字都是小写。(2) 运算符和界符::= + * / = = = ; ( ) #(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=lett

2、er(letter| digit)*NUM=digit digit *(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。2、 各种单词符号对应的别码 单词符号种别码单词符号种别码begin1:17if2:=18then320while421do5=22end6=24digit digit *11=25*13;26/14(27+15)28-16#03、 词法分析程序的输入所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。三:代

3、码#include#include#includechar prog80,token8;char ch;int syn,p,m=0,n,row,sum=0;char *rwtab6=begin,if,then,while,do,end; void scaner() for(n=0;n=a&ch=A&ch=0&ch=a&ch=A&ch=Z) tokenm+=ch; ch=progp+; tokenm+=0; p-; syn=10; for(n=0;n=0&ch=0&ch32767) syn=-1; else switch(ch) case) syn=21; tokenm+=ch; else if

4、(ch=) syn=22; tokenm+=ch; else syn=23; p-; break;case:m=0;tokenm+=ch; ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=20; p-; break;case:m=0;tokenm+=ch; ch=progp+; if(ch=) syn=18; tokenm+=ch; else syn=17; p-; break;case*:syn=13;token0=ch;break;case/:syn=14;token0=ch;break;case+:syn=15;token0=ch;brea

5、k;case-:syn=16;token0=ch;break;case=:syn=25;token0=ch;break;case;:syn=26;token0=ch;break;case(:syn=27;token0=ch;break;case):syn=28;token0=ch;break;case#:syn=0;token0=ch;break;casen:syn=-2;break;default: syn=-1;break; void main() p=0; row=1; coutPlease input string:endl; do cin.get(ch); progp+=ch; wh

6、ile(ch!=#); p=0; do scaner(); switch(syn) case 11: cout(syn,sum)endl; break; case -1: coutError in row row!endl; break; case -2: row=row+;break; default: cout(syn,token)0 then x:=2*x+1/3; end#输出结果5、 源程序(包括上式未有的while、do以及判断错误语句):beginx=$;whilea0dob9-x;end#输出结果五:总结通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原

7、理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C+语言)直接编写此法分析程序。另外,也让我重新熟悉了C+语言的相关内容,加深了对C+语言的用途的理解。比如:main()函数中,用cinch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。另外,我在程序中加入了row变量,以便能够准确得到错误所在。编译原理语法分析器实验报告1、实验目的: 结合课堂上学习的理论知识,通过C+实现语法分析器,更加深入的掌握语法分析;同时也可以更加了解语法分析的

8、原理。2、实验过程:1、设计思路:首先判断输入文法是否为算符文法,若是算符文法则构造它的FIRSTVT和LASTVT集,然后构造它的算符优先表,判断是否为算符优先文法;最后进行归约。 2、实验过程中的问题: 一开始实验很生疏,很难把理论知识融汇到编程上,后来通过多次看PPT和书本内容,渐渐把握到诀窍; 不明确输入输出;这个也是通过PPT解决;和以前编其他东西很不一样,一开始不知道如何下手;通过网上的成熟代码学习了下。实验代码:#include#include#include=A&ch=Z) return 1; else return 0;/judge1是判断是否是算符文法:若产生式中含有两个相

9、继的非终结符则不是算符文法int judge1(int n) int j=3,flag=0; for(int i=0;i=n;i+) while(strij!=0) char a=strij; char b=strij+1; if(IsLetter(a)&IsLetter(b) /两个非终结符相连,不是算符文法 flag=1; break; else j+; if(flag=1) /根据flag设定返回值 return 0; else return 1;/judge2是判断文法G是否为算符优先文法:若不是算符文法或若文法中含空字或终结符的优先级不唯一则不是算符优先文法void judge2(i

10、nt n) for(int i=0;i=n;i+) if(stri3=|FLAG=1)/代表空 cout文法G不是算符优先文法!n) cout文法G是算符优先文法!endl;/search1是查看存放终结符的数组r中是否含有重复的终结符int search1(char r,int kk,char a) for(int i=0;ikk;i+) if(ri=a) break; if(i=kk) return 0; else return 1;/createF函数是用F数组存放每个终结符与非终结符和组合,并且值每队的标志位为0;F数组是一个结构体void createF(int n) int k=0

11、,i=1;char g; char t10;/t数组用来存放非终结符 t0=str00; while(i=n) if(tk!=stri0) k+; tk=stri0; g=tk; i+; else i+; kk=0; char c; for(i=0;i=n;i+) int j=3; while(strij!=0) c=strij; if(IsLetter(c)=0) if(!search1(r,kk,c) rkk=c; kk+;/r数组用来存放终结符 j+; m=0; for(i=0;ik;i+) for(int j=0;jkk-1;j+) Fm.R=ti; Fm.r=rj; Fm.flag=

12、0; m+; /search函数是将在F数组中寻找到的终结符与非终结符对的标志位值为1void search(charLode w) for(int i=0;im;i+) if(Fi.R=w.E&Fi.r=w.e) Fi.flag=1;break; void FirstVT(int n)/求FirstVT charstack sta; charLode w; int i=0; Initstack(sta); while(i=n) int k=3; w.E=stri0; char a=strik; char b=strik+1; if(!IsLetter(a) /产生式的后选式的第一个字符就是终

13、结符的情况 w.e=a; push(sta,w); search(w); i+; else if(IsLetter(a)&b!=0&!IsLetter(b) w.e=b; push(sta,w); search(w); i+; else i+; charLode ww; while(!IsEmpty(sta) pop(sta,ww); for(i=0;i=n;i+) w.E=stri0; if(stri3=ww.E&stri4=0) w.e=ww.e; push(sta,w); search(w); break; p=0;int k=1;i=1; while(im) if(Fi-1.flag=

14、1) arrp0=Fi-1.R; arrpk=Fi-1.r; while(Fi.flag=0&im) i+; if(Fi.flag=1) if(Fi.R=arrp0) k+; else arrpk+1=0;p+;k=1; i+; void LastVT(int n)/求LastVT charstack sta; charLode w; for(int i=0;im;i+) Fi.flag=0; i=0; Initstack(sta); while(i=n) int k=strlen(stri); w.E=stri0; char a=strik-1; char b=strik-2; if(!Is

15、Letter(a) w.e=a; push(sta,w); search(w); i+; else if(IsLetter(a)&!IsLetter(b) w.e=b; push(sta,w); search(w); i+; else i+; charLode ee; while(!IsEmpty(sta) pop(sta,ee); for(i=0;i=n;i+) w.E=stri0; if(stri3=ee.E&stri4=0) w.e=ee.e; push(sta,w); search(w); int k=1;i=1; ppp=0; while(im) if(Fi-1.flag=1) br

16、rppp0=Fi-1.R; brrpppk=Fi-1.r; while(Fi.flag=0&im) i+; if(Fi.flag=1) if(Fi.R=arrppp0) k+; else brrpppk+1=0;ppp+;k=1; i+; void createYXB(int n)/构造优先表 int i,j; for(j=1;j=kk;j+) ccrr10j=rj-1; for( i=1;i=kk;i+) ccrr2i0=ri-1; for(i=1;i=kk;i+) for(j=1;j=kk;j+) crrij=0; int I=0,J=3; while(I=n) if(strIJ+1=0)

17、 /扫描右部 I+; J=3; else while(strIJ+1!=0) char aa=strIJ; char bb=strIJ+1; if(!IsLetter(aa)&!IsLetter(bb)/优先及等于的情况,用1值表示等于 for(i=1;i=kk;i+) if(ccrr2i0=aa) break; for(j=1;j=kk;j+) if(ccrr10j=bb) break; if(crrij=0) crrij=1; else FLAG=1; I=n+1; J+; if(!IsLetter(aa)&IsLetter(bb)&strIJ+2!=0&!IsLetter(strIJ+2

18、)/优先及等于的情况 for(i=1;i=kk;i+) if(ccrr2i0=aa) break; for(int j=1;j=kk;j+) if(ccrr10j=strIJ+2) break; if(crrij=0) crrij=1; else FLAG=1; I=n+1; if(!IsLetter(aa)&IsLetter(bb)/优先及小于的情况,用2值表示小于 for(i=1;i=kk;i+) if(aa=ccrr2i0) break; for(j=0;j=p;j+) if(bb=arrj0) break; for(int mm=1;arrjmm!=0;mm+) for(int pp=

19、1;pp=kk;pp+) if(ccrr10pp=arrjmm) break; if(crripp=0) crripp=2; else FLAG=1;I=n+1; J+; if(IsLetter(aa)&!IsLetter(bb)/优先及大于的情况,用3值表示大于 for(i=1;i=kk;i+) if(ccrr10i=bb) break; for(j=0;j=ppp;j+) if(aa=brrj0) break; for(int mm=1;brrjmm!=0;mm+) for(int pp=1;pp=kk;pp+) if(ccrr2pp0=brrjmm) break; if(crrppi=0

20、) crrppi=3; else FLAG=1;I=n+1; J+; /judge3是用来返回在归约过程中两个非终结符相比较的值int judge3(char s,char a) int i=1,j=1; while(ccrr2i0!=s) i+; while(ccrr10j!=a) j+; if(crrij=3) return 3; else if(crrij=2) return 2; else if(crrij=1) return 1; else return 0;void print(char s,char STR20,int q,int u,int ii,int k)/打印归约的过程

21、coutu ; for(int i=0;i=k;i+) coutsi; cout ; for(i=q;i=ii;i+) coutSTR0i; cout ;void process(char STR20,int ii)/对输入的字符串进行归约的过程 cout步骤 符号栈 输入串 动作endl; int k=0,q=0,u=0,b,i,j; char s40,a; sk=#; print(s,STR,q,u,ii,k); cout预备endl; k+; u+; sk=STR0q; q+; print(s,STR,q,u,ii,k); cout移进endl; while(q=ii) a=STR0q; if(!IsLetter(sk) j=k; e

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

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