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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译实验二.docx

1、编译实验二实验二 语法分析程序设计实验目的:1. 了解语法分析的主要任务。2. 熟悉编译程序的编制。实验内容:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。实验要求:1. 选择一个文法,进行实验,可选的文法包括以下三个: P190 4.8P190 4.9P190 4.102. 设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的例子,可见图1。3. 编写递归下降语法分析程序(参考P148-149 Topdown parsing by recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验

2、报告中要说明分析使用的方法。4. 根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式序列(show the actions of parser):1 产生式12 产生式25. 自已设计一个不合法的句子,作为输出进行分析,给出结果。实验步骤:1. 写出该小语言的的LL(1)文法。如 GE: 其中ETG G为EG+TG| 为TFS S为TS*FS| Fi|(E)2. 编写递归下降语法分析程序。3. 调试运行程序。4. 结果分析。5. 撰写实验报告。实验报告:1. 写出实现的算法,并画流程图。此题我的测试用例为(a,1),简单版流程图如下:2. 根据你选择的文法,分析左递归或左因

3、子是否会影响本算法的结果。会影响,左递归会使分析进入无限循环中,左因子的情况是因为如果左边是一样的,那么程序就无法明确下一步怎么走。3. 列举实验设计过程中出现的问题及解决的方法(至少3条,选择实验中最困扰的问题)。(1).最主要的问题是我一开始在推导式的代码那边出了很严重的逻辑问题,导致我一输完字符串运行时就开始闪退,后来在同学的建议下,在草稿本上理清楚了我的测试用例的逻辑,再不断修改代码才解决掉这个问题。(2).因为我是直接在老师给出的代码段的基础上修改的,所以对于源代码中的有些变量的定义不太清楚,主要是经常搞错数组d和数组e的区别,还有数组b的意义也不是很了解,后来经过不断地前后文代码的

4、对比,自己的各种实践终于搞清楚各个变量的含义。(3).本来我是想直接用0到9的数字,还有a到z,A到Z的字符进行测试,但是我的代码一旦写上ch=0&ch=9等写法,就一直运行不出来结果,问了同学也没有办法解决,所以我只能用ch=1|ch=a的写法直接在代码里写死了我的测试案例。4. 比较作业题和本次实验结果,分析递归下降和LL(1)算法的异同点。 递归下降是指从文法的开始符出发并寻找出这样一个推导序列,推导出的句子恰为输入符号串,这种方法是不带回溯的,并且只能实现一部分上下文无关语言的分析,这就是LL(1)文法所产生的语言。LL(1)算法是从左到右扫描输入串,同时采用最左推导,且对每次直接推导

5、只需向前看一个输入符号,对实现LL(1)算法最重要的是first级和follow级。5. 给出程序清单。#include #include #include #include /定义相关变量char shuru50,b50,tuidao200,tuidaoing10;/*数组shuru存输入串,数组tuidao存推导式,数组tuidaoing存临时用到的推导式*/char ch;/定义字符int len,i1=0,flag=1,n=5; /flag=1处理非终结符,flag=0处理终结符, len表示输入串实际长度int total=0; /步骤计数器int E1();int lexp();i

6、nt atom();int list();int seq();int seq1();void input();void input1();void output();int main() int f,p,j=0; char x; printf(请输入字符串(长度; tuidao3=atom; tuidao4=#; if(ch=() tuidao0=lexp; tuidao1=; tuidao2=; tuidao3=list; tuidao4=#; printf(步骤t文法tt分析串tt分析字符t剩余串n); f=E1(); if (f=0) return (0); /*有语法错误,失败退出*/

7、 if (ch=#) printf(acceptn); /*输入串是文法的句子*/ p=0; x=tuidaop; else printf(errorn); printf(回车返回n); getchar(); getchar(); return 0; printf(回车返回n); getchar(); getchar();int E1() /* 有语法错误函数返回值为0,否则为1*/ if(atom() printf(%dtlexp-atomt,total); total+; flag=1;/非终结符 input(); input1(); return(1); else if(list() p

8、rintf(%dtlexp-listt,total); total+; flag=1;/非终结符 input(); input1(); return(1); else return(0);int lexp() int f,f1; if(ch=1|ch=a)/如果输入字符是1或者a,则用lexp-atom推导式。 printf(%dtlexp-atomt,total); total+; tuidaoing0=lexp; tuidaoing1=; tuidaoing2=; tuidaoing3=atom; tuidaoing4=#; output(); flag=1; input(); input

9、1(); f=atom(); if (f=0) return(0); else if(ch=()/如果输入字符是(,则用lexp-list推导式。 printf(%dtlexp-listt,total); total+; tuidaoing0=lexp; tuidaoing1=; tuidaoing2=; tuidaoing3=list; tuidaoing4=#; output(); flag=1; input(); input1(); f1=list(); if (f=0) return(0); else /printf(errorn); return(0); return (1);int

10、 list() int f; if(ch=() bi1=ch; printf(%dtlist-(seq)t,total); total+; tuidaoing0=list; tuidaoing1=; tuidaoing2=; tuidaoing3=(; tuidaoing4=seq; tuidaoing5=); tuidaoing6=#; output(); flag=0; input(); input1(); ch=shuru+i1; f=seq(); if (f=0) return(0); if(ch=) bi1=ch; printf(%dtlist-(seq)t,total); tota

11、l+; flag=0; input(); input1(); ch=shuru+i1; else /printf(errorn); return(0); return(1);int seq() int f,f1; printf(%dtseq-lexp seq1t,total); total+; tuidaoing0=seq; tuidaoing1=; tuidaoing2=; tuidaoing3=lexp; tuidaoing4= ; tuidaoing5=seq1; tuidaoing6=#; output(); flag=1; input(); input1(); f=lexp(); i

12、f (f=0) return(0); if(ch=) return(1); else if(ch= ) ch=shuru+i1; f1=seq1(); if (f1=0) return(0); else return(0); return(1);int atom() if(ch=a)/如果输入字符是a,则用atom-iden推导式。 bi1=ch; printf(%dtatom-ident,total); total+; tuidaoing0=atom; tuidaoing1=; tuidaoing2=; tuidaoing3=a; tuidaoing4=#; output(); flag=0

13、; input(); input1(); ch=shuru+i1; else if(ch=1)/如果输入字符是1,则用atom-num推导式。 bi1=ch; printf(%dtatom-numt,total); total+; tuidaoing0=atom; tuidaoing1=; tuidaoing2=; tuidaoing3=1; tuidaoing4=#; output(); flag=0; input(); input1(); ch=shuru+i1; else /printf(errorn); return(0); return(1);int seq1() int f,f1;

14、 if(ch=1|ch=a|ch=) bi1=ch; printf(%dtseq1-lexp seq1t,total); total+; tuidaoing0=seq1; tuidaoing1=; tuidaoing2=; tuidaoing3=lexp; tuidaoing4= ; tuidaoing5=seq1; tuidaoing6=#; output(); flag=1; input(); input1(); f=lexp(); if (f=0) return(0); if(ch=) return(1); else if(ch= ) return(1); else return(0);

15、 else printf(%dtseq1-t,total); total+; tuidaoing0=seq1; tuidaoing1=; tuidaoing2=; tuidaoing3=; tuidaoing4=#; output(); flag=1; shurui1=ch; input(); input1(); return(1); void input() int j=0; for (;j=i1-flag;j+) printf(%c,bj); /*输出分析串*/ printf(tt); printf(%ctt,ch); /*输出分析字符*/void input1() int j; for

16、(j=i1+1-flag;j; tuidaon+2=#; n=n+2; i=n; i=i-2; while(tuidaoi!=&i!=0) i=i-1; i=i+1; while(tuidaoi!=tuidaoing0) i=i+1; q=i;m=q;k=q; while(tuidaom!=) m=m-1; m=m+1; while(m!=q) tuidaon=tuidaom; m=m+1; n=n+1; tuidaon=#; for(j=3;tuidaoingj!=#;j+) tuidaon=tuidaoingj; n=n+1; k=k+1; while(tuidaok!=) tuidaon=tuidaok; n=n+1; k=k+1; tuidaon=#;6. 给出测试结果。

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

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