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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算符优先词法分析器编译原理完整课程设计.docx

1、算符优先词法分析器编译原理完整课程设计 1、设计目的 12、设计原理 13、设计思想 24、设计要求 35、设计流程图及程序 46、运行结果及分析147、设计总结168、参考文献16算符优先词法分析器 一、设计目的 算符优先算法是自底而上分析方法的一种。所谓自底向上分析,也称移进规约分析,粗略地说他的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出的栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或可规约串是,就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一部规约。重复这一过程直到规约到栈中只剩文法的开始符号是则为分析成功,也就确认输入串是文法的句子。而算

2、符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。 本课程设计的主要目的: 1、通过本次课程设计,全面系统的了解编译原理程序构造的一般原理和基本实现方法,尤其是对自底向上的优先分析方法的认识和理解; 2、提高对编译程序工作基本过程及其各阶段基本任务的分析技能; 3、加强对编译程序的生成过程、构造工具及编译程序总流程框图的理解,巩固所学的课本知识。 二、设计原理 算符优先分析法是一种有效的自底向上的分析方法。自底向上分析方法面临的主要问题是如何确定可归约串,而算符优先分析法根据两个终结符号之间的优先关系比较,成功的解决了可归约串的问题。算符优先分析法是采用最左素短

3、语进行归约的,严格来讲不属于规范规约的范畴。因此,在设计以前我们必须要知道什么是素短语和最左素短语。所谓素短语就是指句型中具有这样性质的短语:至少含有一个终结符,且除了自身之外,不再含有任何更小的素短语的短语。最左素短语,是指在句型的所有素短语中,处于句型最左边的素短语。了解了素短语和最左素短语,那么如何构造这种算法呢?首先,根据非终结符的FIRSTVT集和LASTVT集找出它们之间的优先关系,构造算符优先矩阵。然后,由此矩阵构造相应符号串的算符优先分析表并编写程序。 三、设计思想 在算符优先算法中,存在定理: 一个算符优先文法G的任何句型 # N1 a1 N2 a2 Nn an Nn+1 #

4、(aVT,NjVN,i=1, 2, ,n, n+1,Nj可有可无)的最左素短语是满足下列条件的最左子串: Nj aj Nj+1 aj+1 Ni ai Ni+1其中,aj-1 ai+1由该定理可以看出,在算符优先文法的句型中,任何素短语中最相近的两个终结符的优先级相等,且素短语中位于最前面的终结符的优先级高于在句型中紧临其前的终结符的优先级,而素短语中处于最后面的终结符的优先级高于在句型中紧随其后的终结符的优先级。设有算符优先文法GS=(VN, VT, P, S),则得出如下步骤: 1、根据GS文法构造优先关系矩阵;2、设置一个符号栈S,存放已经归约的或待形成最左素短语的符号串,另设一个工作单元

5、R,存放当前的待输入符号;3、采用移进归约的方法,当符号栈S的栈顶形成可归约串最左素短语时,进行归约。具体方法如下:分析开始时,符号栈S中只有一个符号“#”,工作单元R中存放输入串的第一个终结符;查优先关系矩阵,比较符号栈中最靠栈顶的终结符号(假设为a)与工作单元R中的终结符(假设为b)的优先关系; )若a,b之间无优先关系,则出错并退出分析程序; )若ab,则表明此时栈顶已经形成最左素短语,转; 从符号栈中最靠栈顶的终结符Xn开始,依次向前(向栈底方向)与最近的终结符比较,若Xn-1=Xn,则继续比较Xn-2和Xn-1如此反复,直至 Xi-1 *i(#=2、程序流程图 图1 算符优先算法流程

6、图 3、程序: #include #include #include #include #include #include #include #define SIZE 128 char youxian77; /算符优先关系数组 char lexbufSIZE; /存放输入的要进行分析的句子 char lexSIZE; /存放剩余串 char fenxizhanSIZE; /分析栈 void fenxi(); int panduanyou(char x); void shengyuchuan(); int k; void zengjia(); void main() /将算符优先关系存放在算符优

7、先关系数组里 youxian00=;youxian01=;youxian02=;youxian03=;youxian04=; youxian06=;/_youxian10=;youxian11=;youxian12=;youxian13=;youxian14=;youxian16=;/_youxian20=;youxian21=;youxian22=;youxian23=;youxian24=;youxian26=;/_youxian30=;youxian31=;youxian32=;youxian33=$;/无优先关系的用$表示youxian34=$;youxian35=;youxian36

8、=; /_youxian40=; youxian41=;youxian42=; youxian43=; youxian44=; youxian51=; youxian52=; youxian53=$; youxian54=$; youxian55=; youxian56=; /_ youxian60=; youxian61=; youxian62=; youxian63=; youxian64=; youxian65=$; youxian66=; /_ printf(将要进行算符优先分析,请做好准备n); printf(*n); printf(请输入要进行分析的句子n); cin.get(le

9、xbuf,SIZE); /将输入的字符串存到数组 printf(步骤 栈 优先关系 当前符号 剩余输入串 移进或归约n); k=0; fenxizhank=#; fenxizhank+1=0; int lenth,i1; /初始化 剩余串数组为输入串 lenth=strlen(lexbuf); for(i1=0;i1lenth;i1+)lexi1=lexbufi1; lexi1=0; fenxi(); void fenxi() int i,j,f,z,z1,n,n1,z4,n4;int flag=0;/操作的步骤数char a; /存放正在分析的字符char p6,Q,p1,p4; f=str

10、len(lexbuf); /测出数组的长度for(i=0;i) loop: Q=fenxizhanj; if(fenxizhanj-1=+|fenxizhanj-1=*|fenxizhanj-1=|fenxizhanj-1=i|fenxizhanj-1=(|fenxizhanj-1=)|fenxizhanj-1=#) j=j-1; else j=j-2; z1=panduanyou(fenxizhanj); n1=panduanyou(Q); p1=youxianz1n1; if(p1=) /fenxizhanj+1fenxizhank归约为N k=j+1; shengyuchuan(); f

11、lag+; printf(%d) %s %c %c %s 归约n,flag,fenxizhan,p6,a,lex);i-; if(fenxizhank=i) fenxizhank=P; else if(fenxizhank+1=*) fenxizhank=T; else if(fenxizhank+1=+) fenxizhank=E;int hou,hou1;hou=strlen(fenxizhan); for(hou1=k+1;hou1hou;hou1+) fenxizhanhou1=0; /多个字符归约,把栈顶后面的舍弃 zengjia(); /归约剩余串没变化 else goto loo

12、p; else if(p6=) /移进有一个问题就是如果上一步是不归约,剩余的字符串减少一个 shengyuchuan(); lexbuff=0; flag=flag+1; printf(%d) %s %c %c %s 移进n,flag,fenxizhan,p6,a,lex); k=k+1; fenxizhank=a; else if(p6=) z4=panduanyou(fenxizhanj); n4=panduanyou(#); p4=youxianz4n4; if(p4=) shengyuchuan(); flag+; printf(%d) %s %c %c %s接受 n,flag,fe

13、nxizhan,p6,a,lex); printf(合法的句子); break; else k=k+1; fenxizhank=a; else printf(出错); break; int panduanyou(char x)int m; if(x=+) m=0; if(x=*) m=1; if(x=) m=2; if(x=i) m=3; if(x=() m=4; if(x=) m=5; if(x=#) m=6; return m;void shengyuchuan()int i4,i5; i4=strlen(lex); for(i5=0;i5i4;i5+) lexi5=lexi5+1; le

14、xi4-1=0;void zengjia() int h1,h2; h1=strlen(lex); for(h2=0;h2h1;h2+) lexh1-h2=lexh1-h2-1; lex0=$; /存入一字符个特殊六、运行结果及分析 1、对输入串进行举例,并得出如下运行结果:输入串为i+i*i#,运行结果为 图 2 输入串为i+i#,运行结果为 图 33输入串为i*(i)#,运行结果为 图 4 2、结合理论知识进行分析,1和2为合法的输入符号串(即是文法的句子),本设计中的程序也能对其进行正确的分析,并在图2和图3中 显示结果为“合法的句子”;但是3不是合法的输入符号串,此程序就不能进行正确的

15、分析,且在运行后显示“出错”,这说明理论与本设计的程序所要实现的结果相符。从上面的结果,我们可以看出算符优先分析法的优点:大大加快了分析过程,但这也是它的缺点:存在某种错误危险性,可能导致把本来不满足文法的输入串误认为是文法的句子。七、设计总结 1、通过编译原理课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识只是表面的,通过把该算法的内容,算法的执行顺序在计算机上实现,把深奥的书本知识变的更为简单与具体化。 2、通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解,通过实际动手做实验,从实践上认识了操作系统是如何处理命令的,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细有耐心。 3、本次课程设计程序部分是用C+语言编写的,把各个学科之间的知识融合起来 ,把各门课程的知识联系起来,理解了该知识点以及学科之间的渗透。使我加深了对编译原理,面向对象程序设计等课程的认识。 八、参考文献 编译技术王力红主编-重庆大学出版社,2001,9 C+程序设计 谭浩强

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

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