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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理实验递归下降分析器的设计含源代码和运行结果.docx

1、编译原理实验递归下降分析器的设计含源代码和运行结果编译原理实验-递归下降分析器的设计(含源代码和运行结果)编译原理实验报告实验3 递归下降分析器的设计姓名 学号 班级 计科1001班时间: 2012/4/15 地点:文波同 组 人:无指导教师:朱少林实验目的 使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写递归下降语法分析程序的方法。实验内容 a.运用所学知识,编程实现递归下降语法分析程序。使用递归下降分析算法分析表达式是否符合下文法:exp exp addop term | termAddop + | -term term mulop factor | fact

2、ormulop * | /factor (exp) | id | number其中number可以是多位的十进制数字串(整数即可),因此这里还需要一个小的词法分析器来得到id 和number的值。b.从数据文件中读出符号串,输出表达式并给出其正误评判。实验数据文件中应该有多个表达式,可能有正确的也应该有错误的表达式;表达式有形式简单的也应该有复杂的。每个表达式写在一行,以回车结束。实验环境 软件:VC+6.0 实验前准备1、方案设计:1准备模拟数据:本实验中使用 “work.cpp” 2程序思想:为了使用递归向下的分析,为每个非终结符根据其产生式写一个分析程序,由于写入读出的操作频繁。所以程序

3、中还有一个match(char t)函数,该函数是将字符写入文件打印输出同时从文件中读取下一个字符,而由于id和number可能是多个字符构成,故写了number()和id()来分析数字和标识符,它们的功能仅仅是把整个number或id完整的读取出来并写入文件,打印输出。由于分析的文件中可能出现非法字符,而一旦发现非法字符就无需再接着分析,所以在每次读取一个字符时调用islegal函数判断是否是合法字符,并返回0或1.在main()函数中,while(lookahead=n|lookahead= )&lookahead!=EOF) fscanf(resource,%c,&lookahead);

4、是为了忽略分析文件中的换行或空格,之后进入分析阶段,根据返回值判断是否是合法的表达式。在该程序中只有发现了非法字符才会返回0,否则就返回1,而对于合法的表达式,递归程序最后分析的字符就是换行符,不合法的表达式在未分析到换行符就会停止分析,所以根据最后分析的字符是否为换行符进一步确定是否为合法的表达式。实验步骤首先将上述文法改写成LL(1)文法1消除左递归:exp term texptexp addop term texp | Addop + | - termfactor ttermtterm mulop factor tterm|mulop * | / factor (exp) | id |

5、number2求出每个非终结符的FIRST集合和FOLLOW集合:FIRST(exp)= FIRST(term)= FIRST(factor)=id, number, ( FIRST(texp)= ,+, - FIRST(Addop)=+, - FIRST(tterm)= ,*, / FIRST(mulop)=*, / 求出每个非终结符的FOLLOW集合:FOLLOW(exp)=FOLLOW(texp)=#, )FOLLOW(Addop)=FOLLOW(mulop)=id, number, ( FOLLOW(term)=FOLLOW(tterm)=+, -,#, ) FOLLOW(factor

6、)= *,/,+,-,#,) 对于texp addop term texp | :FIRST(Addop term texp)FOLLOW(texp)= ;对于tterm mulop factor tterm|:FIRST(mulop factor tterm)FOLLOW(tterm)= ;而Addop + | - mulop * | / factor (exp) | id | number 显然也是符合LL(1)文法要求的,所以改写后的文法符合LL(1)文法,可以用自上而下的递归分析方法。3为每个非终结符根据其产生式写一个分析子程序;4编写数字和字母识别程序,以便分离数字和标识符。;5主函

7、数调用递归程序进行分析,根据分析结果判断是否是合法表达式,并将所有识别到的表达式输出。程序设计:#include #include number();id();int exp();int texp();int addop();int term();int tterm();int mulop();int factor();int islegal();void match(char t);FILE *resource;/测试文件FILE *result;/结果文件char lookahead;/全局变量void match(char t)/写入result文件,打印输出,并读取下一个 fprint

8、f(result,%c,lookahead);/向result写入 printf(%c,lookahead); fscanf(resource,%c,&lookahead);/读数据number()/识别数字,如果遇到数字就一直接着读直到不是数字 while(0=lookahead&lookahead=9) fprintf(result,%c,lookahead);/写入 printf(%c,lookahead); fscanf(resource,%c,&lookahead);/读出 id()/识别标识符 while(lookahead=a)|(lookahead=A& lookahead=Z

9、)|lookahead=_) while(lookahead=a)|(lookahead=A& lookahead=0&lookahead=9) fprintf(result,%c,lookahead);/写入 printf(%c,lookahead); fscanf(resource,%c,&lookahead);/读 int addop()/Addop + | -/分析+,- int i; if(lookahead=+)/+ match(+); i=islegal();/判断下一个是否是合法字符,如果不是则返回0 if(i) return 1; else return 0; else if

10、(lookahead=-)/- match(-); i=islegal(); if(i) return 1; else return 0; else return 0;int mulop()/mulop * | /分析*,/ int i; if(lookahead=*) match(*); i=islegal(); if(i) return 1; else return 0; else if(lookahead=/) match(/); i=islegal(); if(i) return 1; else return 0; else return 0;int exp()/exp term te

11、xp int i,j; while(!feof(resource) if(lookahead=(|0=lookahead&lookahead=9| (lookahead=a)|(lookahead=A& lookahead=Z)|lookahead=_) /FIRST(term)=id, number, ( i=term(); if(i) j=texp(); if(j) return 1;/当且仅当term和texp都返回1时才返回1 else return 0; else return 0; else return 0; int factor()/factor (exp) | id | nu

12、mber int i,m,n; if(lookahead=() match(); i=exp();/返回1则继续分析 if(lookahead=)&i) match(); return 1; else return 0; else if(lookahead=a)|(lookahead=A& lookahead=Z)|lookahead=_) id(); n=islegal();/判断读出的是否合法,不合法则不必接着分析 if(n) return 1; else return 0; /id分析中自会匹配 else if(0=lookahead&lookahead=9) number(); m=i

13、slegal();/判断读出的是否合法,不合法则不必接着分析 if(m) return 1; else return 0; else return 0;int tterm()/tterm mulop factor tterm|/mulop,factor都为空或mulop,factor都为真则返回1 int i,j,k; i=mulop(); j=factor(); if(i&j) k=tterm();/调用自己继续分析直至mulop,factor都为空或仅其中之一返回真值,此时推出该函数 return 1; else if(!i&!j) /mulop,factor都为空 return 1; e

14、lse return 0;int term()/termfactor tterm/factor,tterm都为真则返回1 int i,j; i=factor(); if(i) j=tterm(); if(j) return 1; else return 0; else return 0;int texp()/texp addop term texp | /addop,term为空或addop,term为真 int i,j,k; i=addop(); j=term(); if(i&j) k=texp();/调用自己继续分析直至addop,term都为空或仅其中之一返回真值,此时推出该函数 ret

15、urn 1; else if(!i&!j) return 1;/没必要继续向下分析,否则死循环 else return 0;int islegal()/当为(,),+,-,*,/,换行,字母,数字,下划线才合法 if(lookahead=(|(lookahead=0)|lookahead=)|lookahead=/|lookahead=*|lookahead=+|lookahead=- |(lookahead=a)|(lookahead=A& lookahead=Z)|lookahead=_|lookahead=n) return 1; else return 0; void main() i

16、nt i; resource=fopen(work.cpp,r); if(resource=NULL) printf(fail to open!); result=fopen(结果.txt,w); fscanf(resource,%c,&lookahead);/读一个字符 while(lookahead!=EOF) while(lookahead=n|lookahead= )&lookahead!=EOF)/空格或换行则接着读 fscanf(resource,%c,&lookahead); if(lookahead!=EOF) i=exp();/判断 if(i) /返回1 if(lookahe

17、ad!=n) /若没有分析到换行,则说明表达式不正确 while(lookahead!=n)/打印该行 fprintf(result,%c,lookahead); printf(%c,lookahead); fscanf(resource,%c,&lookahead); fprintf(result, error!n); printf( error!n); else /表达式分析到换行符正确 fprintf(result, right!n); printf( right!n); else /返回0 while(lookahead!=n)/打印该行 fprintf(result,%c,looka

18、head); printf(%c,lookahead); fscanf(resource,%c,&lookahead); fprintf(result, error!n); printf( error!n); fscanf(resource,%c,&lookahead); /读取下一个字符 fclose( result); fclose( resource); 实验结果及其分析:结果:被分析的文件work.cpp#include stdio.h#include string.h #includemain()int i;3+466/9e/i&;(666+op)*y;(p+8+9+i)*lprin

19、tf(%c,&i)(y+i)+p)*8i=1fgetc(fp) 6+re=1 y-6_a1输出到“结果.txt”中的内容:#include stdio.h error!#include string.h error!#include error!main() error! error!int i; error!3+4 right!66/9 right!e/i right!&; error!(666+op)*y; error!(p+8+9+i)*l right!printf(%c,&i) error!(y+i)+p)*8 right!i=1 error!fgetc(fp) error!6+re=1 error!y-6 right!_a1 right! error!分析:这个实验是每行一个表达式,且每行以换行符终结,故需要按行分析并打印输出,且对于每个非终结符的子程序要有返回值以便确定是否继续向下分析。还有一点就是对于被分析的文件最后一行不要忘了加上换行符,不然会导致程序死循环。

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

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