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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理课程设计算术表达式的LR分析过程.docx

1、编译原理课程设计算术表达式的LR分析过程武汉理工大学华夏学院课 程 设 计课程名称 编译方法课程设计 题 目 算术表达式的LR分析过程 专 业 计算机应用 班 级 1071班 学 号 10210407107 姓 名 蒋梦琴 成 绩 _ 指导教师 何九周 段学东 2009年6 月29日目 录课程设计任务书-31设计目的-42设计要求-43设计内容-431设计原则-432设计的题目-433在程序中表示文法-5331文法的输入与读取-5332文法的拓展-5333文法的保存格式-5334SLR(1)文法的定义-5335 SLR(1)_Action表的构造-6336 SLR(1)_GoTo表的构造-63

2、37程序算法的设计-7124上机调试-134.1测试结果-135心得体会-146参考文献-14课程设计封底-15课程设计任务书设计题目:算术表达式的LR分析过程设计目的1. 巩固和加深课堂所学知识;2. 学习掌握一般的软硬件的设计方法和查阅、运用资料的能力;3. 掌握高级语言词法分析、语义分析、语法分析方法;4. 运用高级语言编写质量高、风格好的应用程序。设计任务 (在规定的时间内完成下列任务)1. 写出符合该算术表达式的的文法和属性文法描述;2. 按照算术表达式的LR分析过程给出分析方法的思想设计算术表达式文法;3. 完成算数表达式的LR分析的程序设计,用SLR(1)分析法实现对算术表达式的

3、分析;4. 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。时间安排 消化资料、系统调查 1天系统分析、总体设计,实施计划、撰写报告 3天演示、验收 1天具体要求1. 明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。2. 设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。设计报告正文字数不少于0.2万字(不包括附录)。包含内容:设计题目。目录。正文:包括引言、需求分析、总

4、体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收获与体会等。结束语。参考文献(按公开发表的规范书写)。附录:软件清单(或者附盘)。3. 软件系统:界面友好,操作简单;交付的软件有必要的安装、使用说明。指 导 教 师 签 名: 2009年6月28日教研室主任(或责任教师)签名: 2009年6月28日算术表达式的LR分析过程1.设计目的课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比

5、平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。2设计要求明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课

6、程设计任务。深入理解所学的编译原理相关知识,按照软件工程的设计方法进行简要的分析与概要设计,进行总体设计,详细设计、系统实施、调试。运用程序设计语言实现算法,编写相关程序。使用Visual C+编写程序,并上机调试,确保程序能运行正确。学会正确运用语法规则,并能应用优先关系和结合性解决二义性和冲突问题,有效而正确的利用各种分析方法和思想,合理使用出错处理程序,上机调试通过。最后撰写课程设计报告。3.设计内容 3.1设计原则由于大多数适用的程序设计语言的文法不能满足LR(0)文法的条件,即使是描述一个实数变量说明这样简单的文法也不一定是LR(0)文法。 现举实型变量说明文法为例:实型变量说明 r

7、eal标识符表标识符表标识符表,i标识符表i 3.2设计的题目 算术表达式的文法:E E +T | E T | T T T * F | T / F | F F i |(E) 设计算术表达式文法,用SLR(1)分析法实现对算术表达式的分析,给出一个具体句子的分析过程。3.3在程序中表示文法3.3.1文法的输入和读取 为了程序读取的方便,非/终结符相互间以空格分开。这里应该输入:E E +T | E T | T T T * F | T / F | F F i |(E) 3.3.2文法的拓展 为了在LR分析时能够指示分析器正确停止并接受输入,一般在所有输入文法前加上一个新的产生式,以上面文法为例,我

8、们要保存的文法应该是如此:E E E E +T E ET E T T T * F T T / F T F F i F (E) 3.3.3文法的保存格式设计一个类Grammar来对文法进行各种处理。每一个项是一个2元组,记录了终结符,和产生式右部。其中非终结符可以用字符串(string)类型表示,产生式右部可用字符串数组( vector )表示。而在保存的同时又可记录下文法的所有非终结符(因为文法的产生式左部会出现所有的非终结符),然后再对已经记录的文法的产生式右部再扫描一遍,记录下所有的终结符。在本程序中,我虽然记录了原始的符号串,但是在具体过程处理时使用的是符号串对应的下标来进行的,因此再对

9、原始形式的文法再扫描一遍,生成对应的以下标形式保存的文法。同时我对终结符号和非终结符号的保存位于不同的数组中,于是下标就会产生冲突,我采用方式是建立一个下标数据结构 Index 来保存下标:struct Index int index; / 非终结符或者终结符的下标 bool teminal; / 为真表示该下标保存的是终结符 bool is_nonteminal(); / 返回! terminal 3.3.4 SLR(1)文法的定义(1)若状态s 包含了格式A a.Xb 的任意项目,其中X 是一个终结符,且X 是输入串中的下一个记号,则动作将当前的输入记号移进到栈中,且被压入到栈中的新状态是

10、包含了项目A aX.b 的状态。(2)若状态s 包含了完整项目A g.,则输入串中的下一个记号是在 Follow (A) 中,所以动作是用规则A g 归约。用规则S¢ S 归约与接受等价,其中S 是开始状态;只有当下一个输入记号是$时,这才会发生。在所有的其他情况中,新状态都是如下计算的:删除串a 和所有它的来自分析栈中的对应状态。相对应地,DFA 回到a 开始构造的状态。通过构造,这个状态必须包括格式B g. Ab 的一个项目。将A 压入到栈中,并将包含了项目B aA.b 的状态压入。(3)若下一个输入记号都不是上面两种情况所提到的,则声明一个错误。若上述的 SLR(1) 分析规则

11、并不导致二义性,则文法为 SLR(1) 文法(SLR(1) grammar)。SLR(1)文法的投影函数1定义如下: 1:StateSet (VT#) 2 1 (S,a) = Reduce j |B S,a Follow(B),B P (if存在X a S且a VT then Shift) 如果LRSM0中的每个状态S,对任意 a VT,使得| 1(S,a)| 1,则称相应文法为SLR(1)文法。 3.3.5 SLR(1)_Action表的构造若 1(S,#)=Shift Action( S, # )=Accept若 1(S,a)=Shift 且a # Action( S, a) =Shift

12、若 1(S,a)=Reduce j Action( S, a) =Reduce j若 1(S,a)= Action( S, a) = Error3.3.6 SLR(1)_GoTo表的构造GoTo( S, X) = S , 当LRSM0中有S S GoTo( S, X) = error,否则 合并的SLR(1)分析表,合并方法: Action ( S, a) = Shift i , 当Action (S, a)= Shift且GoTo(S,a)=Si GoTo ( S, X) = Si , 当GoTo(S,X)=Si 且X VN3.3.8程序算法设计#include#includechar *a

13、ction126=S5#,NULL,NULL,S4#,NULL,NULL, /*ACTION表*/ NULL,S6#,NULL,NULL,NULL,acc, NULL,r2#,S7#, NULL,r2#,r2#, NULL,r4#,r4#, NULL,r4#,r4#, S5#,NULL,NULL, S4#,NULL,NULL, NULL,r6#,r6#, NULL,r6#,r6#, S5#,NULL,NULL, S4#,NULL,NULL, S5#,NULL,NULL, S4#,NULL,NULL, NULL,S6#,NULL, NULL,S11#,NULL, NULL,r1#,S7#, NU

14、LL,r1#,r1#, NULL,r3#,r3#, NULL,r3#,r3#, NULL,r5#,r5#, NULL,r5#,r5#;int goto1123=1,2,3, /*QOTO表*/ 0,0,0, 0,0,0, 0,0,0, 8,2,3, 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0;char vt6=i,+,*,(,),#; /*存放终结符*/char vn3=E,T,F; /*存放非终结符*/char*LR7=M-E#,E-E+T#,E-T#,T-T*F#,T-F#,F-(E)#,F-i#; /*存放产生式*/int a20;/

15、数组a实现状态栈char b20,c20,c1;/数组b实现符号栈,数组c存放输入的字符串int top1,top2,top3,top,m,n;void main() int g,h,i,j,k,l,p,y,z,count; char x,copy20,copy120; top1=0;top2=0;top3=0;top=0; a0=0;y=a0;b0=#; count=0;z=0; /输入要识别的字符串 printf(请输入表达式n); do scanf(%c,&c1); ctop3=c1; /字符数组c10存放输入的字符串 top3=top3+1;/最后top3=5 while(c1!=#)

16、; /输出分析结果 printf(步骤t状态栈tt符号栈tt输入串ttACTIONtGOTOn); do y=z;m=0;n=0; /*y,z指向状态栈栈顶*/ g=top;j=0;k=0; x=ctop; /将输入符号赋给x count+; printf(%dt,count);/输出步骤序号 while(m=top1) /*输出状态栈*/ printf(%d,am); m=m+1; printf(tt); while(n=top2) /*输出符号栈*/ printf(%c,bn); n=n+1; printf(tt); while(g=top3) /*输出输入串*/ printf(%c,cg

17、); g=g+1; printf(tt); while(x!=vtj&j=5) /获取当前x对应j的值 j+; if(j=5&x!=vtj)/如果x不是终结符则报错 printf(errorn); return; if(actionyj=NULL)/? printf(errorn); return; else strcpy(copy,actionyj); if(copy0=S) /*处理移进*/ z=copy1-0;/因为状态从0开始 top1=top1+1; top2=top2+1; atop1=z;/数组a实现状态栈 btop2=x;/数组b实现符号栈 top=top+1;/输入符号串数组

18、c的顶 i=0; while(copyi!=#)/例 S3# 输出ACTION printf(%c,copyi); i+; printf(n); if(copy0=r) /*处理归约*/ i=0; while(copyi!=#)/例 S3# 输出ACTION printf(%c,copyi); i+; h=copy1-0;/因为状态从0开始 strcpy(copy1,LRh); while(copy10!=vnk) /获取当前k值 k+; l=strlen(LRh)-4; top1=top1-l+1; top2=top2-l+1; y=atop1-1; p=goto1yk; atop1=p;

19、btop2=copy10; z=p; printf(t); printf(%dn,p); while(actionyj!=acc); printf(accn);4上机调试41测试结果5.心得体会通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。 通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算

20、机中是怎样执行的,对该理论在实践中的应用有深刻的理解。通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操 在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。 通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂

21、上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操 作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。 在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。 6.参考文献1.编译原理,主编:胡伦俊、徐兰芳、骆婷,出版社:电子工业出版社,出版时间:2005年12月2.程序设计语言编译原理(第3版),主

22、编:陈火旺、刘春林等,出版社:国防工业出版社,出版时间:2003年2月3.编译原理课程设计,主编:王雷、刘志成、周晶,出版社:机械工业出版社,出版时间:2005年3月设计过程中现场提问(或答辩)记载:1.什么是SLR(1)分析法? 答:为了对语言句子进行确定性的分析,需要解决“移进归约”或”归约归约”冲突。我们采用对含有冲突的项目集向钱看一个输入符号的办法来解决冲突,这种分析法成为简单的LR分析法,即SLR(1)分析法。2.SLR(1)与LR(0)文法有什么区别?答:LR(1)和LR(0)具有相同的状态机,LR(0)只看分析栈的内容,不考虑当前输入符SLR(1)考虑输入符,用follow集来解决冲突,因此SLR(1)要比LR(0)分析能力强指导教师评语:成绩评定等级:指导教师(签名): 年 月 日

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

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