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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

LR0语法分析.docx

1、LR0语法分析淮阴工学院编译原理课程设计报告选题名称: LR(O)语法分析 系(院): 计算机工程学院 专 业: 计算机科学与技术 班 级: 计算机1075(单招) 姓 名: 赵俊丽 学号: 1071308114扌旨导老师: 于长辉王文豪高丽夏森 学年学期: 2009 2010 学年第 2 学期设计任务书课题 名称LR(O)语法分析设计 目的LR(O)分析法是一种移进-规约过程,能根据当前分析栈中的符号串,同时 也不用向右查看输入串的符号就可唯一确定分析器的动作。 通过对给定的文法 构造LR(O)分析表和实现某个符号串的分析掌握 LR(O)分析法的基本思想。实验 环境WindowsXP操作系统

2、,Visual C+6.0以上编译环境任务 要求1.录入合法的LR(0)文法2.构造并输出LR(0)分析表3.对输入的符号串进行语法分析工作进度计划序号起止日期工作内容109.12.14-09.12.14选定题目,明确题目要求209.12.15-09.12.15课题深入调研、细化工作,系统方案设计309.12.16-09.12.17程序录入、调试、整合409.12.18-09.12.20上机演示,课程设计分组答辩,完成课程设计报告指导教师(签章) 年 月 日摘要:编译程序是现代计算机系统的基本组成部分之一,语法分析是编译程序的核心部分,识别由语法分析给出的单词符号序列是否是给定文法的正确句子,

3、 把词法记号流按语言的语法结构层次地分组, 以形成语法短语。一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、 优化、目标代码生成。LR(0)是一种自底向上的语法分析方法,是已知的最一 般的无回溯的移近一归约方法,这一方法能够识别所有能用上下文无关文法描述 的程序语言的结构。本文主要讨论 LR( 0)语法分析的构造。着重分析LR(0)分 析器的一般原理、实现思想、基本设计方法以及主要实现技术和工具。操作员录 入合法的LR(0)文法,则自动生成LR(0)分析表,并对任一输入串进行分析。判 断其是否是给定文法的句子。还可以对输入的句子进行语法分析。关键词:自

4、底向上分析;移进;规约1课题综述 11 1 课题来源 11 2 意义 11 3 预期目标 11 4 面对的问题 22系统分析 32 1 涉及的基础知识 32 2 总体方案 53系统设计 53 1 算法描述 63 3 详细流程图 94代码编写 105程序调试 15总 结 19致 谢 20参考文献 211课题综述1.1课题来源编译器设计的编译程序涉及到编译五个阶段中的三个, 即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、 变量名表、状态栈分析过程显示及四元式序列程序。整个编译程序分为三部分: 词法分析部分、语法分析处理及四元式生成部分、输出显示部分。一个程

5、序设计语言就是一个记号系统, 如同自然语言一样,它的完整的定义 应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成 和产生一个合适的程序。目前广泛使用的手段是上下文无关文法, 即用上下文无 关文法作为程序设计语言语法的描述工具。自底向上分析方法是一种移进-规约过程,当分析的栈顶符号串形成句柄时 就采取归约动作,因而自底向上分析法的关键问题是在分析过程中如何确定句 柄。LR分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示) 和向右顺序查看输人串的k个(k=0)符号就可惟一地确定分析器的动作是移进还 是归约和用哪个产生式归约,因而也就能惟一地确定句柄。 LR分析法的

6、归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。1.2意义LR (0)分析方法虽然对文法的限制比较大,对绝大多数高级语言的语法 分析器不能适用,然而他是构造其他 LR类分析器的基础,学习和掌握 LR (0) 分析的原理和方法是我们掌握更高级语言语法分析的基础。 归纳起来,大体上可分为两大类,即自顶向下分析方法和自底向上分析方法。自底向上分析方法是一种移进-规约过程,当分析的栈顶符号串形成句柄时 就采取归约动作,因而自底向上分析法的关键问题是在分析过程中如何确定句 柄。LR分析法正是给出一种能根据当前分析栈中的符号串 (通常以状态表示)和 向右顺序查看输人串的k个(k=0)符号就

7、可惟一地确定分析器的动作是移进还是 归约和用哪个产生式归约,因而也就能惟一地确定句柄。 LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。本次课程设计的目标即是利用所学过的编译原理的知识, 利用LR(O)分析法,用C语言写出一个简单的LR(O)语法分析器。该语法分析器所要完成的功能是, 对录入的文法判断它是否为LR(O)文法,如果是输出LR (0)分析表;在给定文法 的情况下,能够利用LR(0)分析表,对用户输入的一串字符串用 LR(0)分析法进行分析,判断该字符串是否为符合给定文法的一个句子,建立文法及其 LR分析表表示的数据结构,设计并实现一个 LR(0)的分析器

8、。1.4面对的问题(1)分析表的构造。(2)归约还是移进的判断。(3)接受acc的判断。(4)编程结果的输出。在本次课程设计中,主要的是面对的文法的确定,以及分析其工作过程如何 进行。对于文法确定的问题,必须找到一个符合 LR(0)规范的文法,并且该文法 不易太复杂,否则对于初次编写语法分析器的我们来说会比较复杂, 否则容易出错。第二个就是分析过程的问题,目前,我们只是了解了理论上 LR(0)的分析过程,但如何将该过程用程序去实现,并且能够对一个输入串进行实时的分析是比 较复杂的。这涉及到对一个字符串进行一个字符一个字符的读取和操作, 并且还要对几个连在一起的字符进行合并等操作,要求比较的高,

9、对我们而言比较困难。在规范规约的过程中,一方面记住已移进和规约出的整个符号串, 另一方面根据所用的产生式推测未来可能碰到的输入符号。当一串句柄的符号串呈现于分 析栈的顶端时,希望能够根据上面过程中的数据来确定栈顶的符号串是否构成相 对某一产生式的句柄。能正确初始化状态栈,对栈内元素的进栈和出栈,取栈顶元素以及遍历栈元 素,LR分析方法是一种自底向上的分析方法,是一种个移进 -归约的过程。当分 析的栈顶符号串形成句柄时就采取归约动作, 因而自底向上分析法的关键问题是在分析过程忠如何确定句柄。LR (0)分析器是在分析过程中不需要察看输入符 号,因而它对文法的限制较大,对绝大多数高级语言的语法分析

10、器是不能使用的, 然而,他是构造其他LR类分析器的基础。(1)词法编译器。(2)交互式面向对象的词法编译器基本功能是。(3)根据规约规则对字符进行归约。(4)符合条件时采取移进动作。2系统分析2.1涉及的基础知识2.1.1词法编译器功能(1)导入任意文法,也可以自己输入。(2) 输出文法的分析过程,以及判断是否为 LR (0文法,输出分析表。(3)输入句子,进行语法分析。(4)输出结构树。2.1.2词法分析器的设计方法有如下四个步骤:(1)写出该语言的词法规则。(2)把词法规则转换为相应的状态转换图。(3)把各转换图的初态连在一起,构成识别该语言的自动机。(4)设计扫描器;把扫描器作为语法分析

11、的一个过程,当语法分析需要一个 单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,送 出二元式。2.1.3动态模拟算法的基本功能(1)输入LR分析表和一个句子。(2)输出LR总控程序。(3)输出依据句子构对应的语法树的过程。(4)设计一个给定LR分析表,输入一个句子,能由依据 LR分析表输出与 句子对应的语法树,能对语法树生成过程进行模拟。表2-1 LR分析表STATEACTIONGOTOabcd#ETF0S2S311acc2S40S163S5S474S40S185S51S196r1r1r1r1r17r2r2r2r2r28r3r3r3r3r39r5r5r5r5r510r4r4

12、r4r4r411r6r6r6r6r6(5)输入句子:bccd#。(6)根据文法产生的LR分析表(7)输出结果2.1.4 LR分析器的构成一个LR分析器由3个部分组成(1)总控程序,也可以称为驱动程序。对所有的 LR分析器,总控程序都是 相同的。(2) 分析表或分析函数。不同的文法分析表将不同,同一个文法采用的 LR分析器不同时,分析表也不同,分析表又可以分为动作( ACTION表和状态转换(GOTO表两个部分,它们都可用二维数组表示。(3)分析栈,包括文法符号和相应的状态栈。它们均是先进后出栈。分析器的动作由栈顶状态和当前输入符号所决定 (LR(0分析器不需向前查看 输入符号)。1、 用构造一

13、个状态转换函数实现状态转换。2、 再通过函数构造一个移进-归约函数实现移进规约动作。3、 采用构造一个打印LR分析器的工作过程函数实现输出。在规范规约的过程中,一方面记住已移进和规约出的整个符号串, 另一方面 根据所用的产生式推测可能碰到的输入符号。每一项ACTION( a)所规定的动作 不外是下述四种可能之一:(1)移进:把(s, a)的下一个转态s = GOTO(X)和输入符号a推进栈, 下一输入符号变成现行输入符号。(2) 规约:指用某一产生式 进行规约。假若B的长度为r,规约的动 作是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Sm-r, A)的 下一状态s = GOTO

14、(S|A)和文法符号A推进栈。规约动作不改变现行输入符号。 执行规约动作意味着B (= Xm-r+1Xm已呈现于栈顶而且是一个相对于 A的句 柄。(3)接受:宣布分析成功,停止分析器的工作。(4)报错:发现源程序含有错误,调用出错处理程序。2.3总体方案本课题是由一个四人的团队去完成的, 所以,每个小组成员分配了不同的工 作共同完成这个项目。2.4功能模块框图图2.2功能模块框图3系统设计3.1算法描述1、已知文法G(1)E E+TE T(3) T T*FT F F (E)F i2、LR(O分析表的构造算法如下:假设已构造出LR(O项目集规范族为:C=IO,I1,,In其中Ik为项目集的名字,

15、k为状态名,令包含S项目的集合Ik的下标k 为分析器的初始状态。那么分析表的 ACTION表和GOTO表构造步骤为:(1)若项目Aa属于 Ik且转换函数GO(lk,a)= lj,当a为终结符时则置 ACTIONk,a为Sj,其动作含意为将终结符a移进符号栈,状态j进入状态栈,(相 当状态k时遇a转向状态j)。 若项目Aa 属于Ik,则对任何终结符 a和#号置ACTIONk,a和ACTIONk,#为rj,j为在文法G中某产生式Aa的序号。rj动作的含义是把当 前文法符号栈顶的符号串a归约为A,并状态栈指针从栈顶向下移动| a的长度, 文法符号栈从栈顶弹出| a个符号,非终结符A变为当前面临的符号

16、。(3)若GO(Ik,A j则置GOTOk,A为j,其中A为非终结符,表示当前状 态为k时,遇文法符号A时状态应转向j,因此A移入文法符号栈,j移入状态 栈。 若项目S S属于Ik,则置ACTIONk,#为acc,表示接受。(5)凡不能用上述方法填入的分析表的元素,均应填上 报错标志。为了表的清晰我们仅用空白表示错误标志。根据这种方法构造的LR(0分析表不含多重定义时,称这样的分析表为 LR(0)分析表,能用LR(0分析表的分析器称为LR(0分析器,能构造LR(0分析表的文法称为LR(0)文法。3、产生如图2-1所示的LR分析表这张分析表包括两个部分,一是 动作”(ACTION表,另一是状态转

17、换”(GOTO表。ACTION(S,a规定了当状态S面临输入符号a时应采取什么动作。GOTO( S, X)规定了状态S面对文法符号X(终结符或非终结符)时下一状态是 什么。显然,GOTO(S X)定义了一个以文法符号为字母表的 DFA每一项ACTION(S a)所规定的动作不外是下述四种可能之一:(1)移进把(S,a)的下一个转态S =GOTQ(S)和输入符号a推进栈,下 一输入符号变成现行输入符号。(2) 规约指用某一产生式 进行规约。假若B的长度为r,规约的动作 是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Sm-r,A)的下 一状态S =GOTO(S?A)和文法符号A推进栈

18、。规约动作不改变现行输入符号。 执行规约动作意味着 B (=Xm-r+1Xm已呈现于栈顶而且是一个相对于 A的句 柄。(3)接受宣布分析成功,停止分析器的工作。(4)报错发现源程序含有错误,调用出错处理程序。一个LR分析器的工作过程可看成是栈里的状态序列,已规约串和输入串所构成的三元式的变 化过程。分析开始时的初始三 元式为:(S0, #,a1a2 an#)其中,S0为分析器的初态;#为句子的左括号;a1a2ar为输入串;其后 的#为结束符(句子右括号)。分析过程每步的结果可表示为: (S0S1 Sm #X1X2Xm ai, ai+1 an#3.2实现方法3.2.1构造分析表LR分析器实质上是

19、一个带先进后出存储器(栈)的确定有限状态自动机。 LR分析器的每一步工作是由栈顶状态和现行输入符号所唯一决定的。构造一个 int型二维数组table139,用于存放LR分析表。并初始化。作者这样规定:011表示状态Sj,其中0对应S0, 1对应S1 21 26表示规约Rj,其中21对应R1,22对应R212表示接受”。-1表示规约出错,报错。322程序设计关键(1) 在输入串(句子)输入的过程中,涉及到一个压栈的问题。但是输入串压入的字符顺序刚好与原理中的字符串模型刚好相反, 这样需要先弹出的反而在栈底。为了既要保证字符串输入,又要让输入的字符串存储顺序与输入的字符串 相反。采取以下措施:先将

20、输入的字符串压入符号栈symbol中,然后符号栈弹出的字符再压入输 入串栈instr中,这样实现了输入串的倒序存储。(2) 状态栈和符号栈输出(遍历)过程均采取自栈底到栈顶的顺序,而输 入串栈则是采取自栈顶到栈底的顺序输出。3.2.3 LR(0项目集规范族的构造识别活前辍的NFA我们可以利用子集法将其确定化。对确定化后的 DFA如果把每个子集中所含状态集对应的项目写在新的状态中。对于构成识别一个文法活前缀的 DFA项目集(状态)的全体称为这个文法的 LR(0项目集规范族,我们可以分析每个状态中项目集的构成,不难发现如下规律:若状态中包含形如A-aB0项目,则形如的项目也在此状态内。例 如:0状

21、态中项目集为S- aA, E -bbB回顾由NFA确定化到DFA时,a和E-b正是属于的闭包中。 因而,可引入闭包函数(CLOSUR来求DFA一个状态的项目集。若文法G已拓广为G,而S为文法G的开始符号,拓广后增加产生式S-S。 如果I是文法G的一个项目集,定义和构造I的闭包CLOSURE如下:(1) I的项目均在 CLOSURE中。(2) 若A-a属于CLOSURE,)则每一形如B-Y项目也属于CLOSURE。)重复(2)直到不出现新的项目为止。即 CLOSURE不再扩大。由此,我们可以很容易构造出初态的闭包,即 S-属于I,再按上述三点 求其闭包。回顾在构造识别活前缀的 NFA时,其两个相

22、邻状态对应的项目是出自同一 个产生式,只是圆点的位置相差1,箭弧上的标记为前一个状态和后一个状态对 应项目圆点间的符号,(除了箭弧上标记为&的外)。由于识别活前缀的DFA的每个状态是一个项目集,项目集中的每个项目都不相同,每个项目圆点后的符号不一定相同,因而对每个项目圆点移动一个位置后, 箭弧上的标记也不会完全相同,这样,对于不同的标记将转向不同的状态。 例如 初态aA,Ef 对第一个项目圆点右移一个位置后变为 SfE箭弧标 记应为E,对第二个项目 a,圆点右移一个位置后,项目变为 Ef a ,箭弧标记为a,同样第三个项目为圆点右移一个位置后变为 Ef b ,箭弧标记为b,显 然,初态可发出三

23、个不同标记的箭弧, 因而转向三个不同的状态,也就由初态派 生出三个新的状态,对于每个新的状态我们又可以利用前面的方法, 若圆点后为非终结符则可对其求闭包,得到该状态的项目集。圆点后面为终结符或在一个产 生式的最后,贝U不会再增加新的项目。3.3详细流程图图3.2 LR分析器设计流程图4代码编写4.1主要模块的代码分析4.1.1生成分析表代码void CLROForWi nDlg:O nGtable()CTableDlg dlg;dlg.SetC on trolI nfo(IDC_EXPLORER1, RESIZE_BOTH);dlg.SetCo ntroll nfo(IDOK, ANCHORE

24、_BOTTOM | ANCHORE_RIGHT);dlg.SetCo ntroll nfo(IDC_EXPORT, ANCHORE_BOTTOM | ANCHORE_RIGHT);dlg.SetCo ntroll nfo(IDC_ANAL YZE, ANCHORE_BOTTOM | ANCHORE_RIGHT);string temp =;CStri ng t;for(int i = 0; i m_vtlist.GetCount(); i+)m_vtlist.GetText(i,t);temp.push_back(t.GetAt(O);temp += t.GetAt(0);dlg.g.SetV

25、t(temp);temp =;for(i = 0; i m_vnlist.GetCount(); i+)m_vnlist.GetText(i,t);temp.push_back(t.GetAt(O);temp += t.GetAt(0);dlg.g.SetV n( temp);m_startedit.GetWi ndowText(t);if (t =)MessageBox(输入的文法有误,请检查! ,错误 ”,MB_OK | MB_ICONSTOP);return;dlg.g.SetStart(t.GetAt(O);temp =;for(i = 0; i m_plist.GetCount();

26、 i+)temp =;m_plist.GetText(i,t);for(i nt j = 0; j m_tree.DeleteAllltems();for(i nt i = 0; i m_in put.GetLe ngth(); i +)if (!m_g.IsI nVt(mn put.GetAt(i)MessageBox(输入的句 子不全部由终结符组成,MB_ICONSTOP);return;assert(TreeStack.empty();mn put += #;char szTempPathMAX_PA TH;char szTempNameMAX_PATH;if (m_strTempFil

27、e name !=):DeleteFile(m_strTempFile name.c_str();:GetTempPath(1OO,szTempPath);:GetTempFileName(szTempPath,LRO,O,szTempName);m_strTempFile name = szTempName;CStdioFile out;out.Ope n(szTempName, CFile:modeCreate | CFile:modeWrite);out.WriteStri ng(n);out.WriteStri ng(n);out.WriteStri ng( Un titled Docume ntn);out.WriteStri ng(n);out.WriteStri ng(n);错误, MB_OK |conten t=text/html;out.WriteStri ng(n ”); style=border-collapse: collapse bordercolor=#111111n);out.WriteStri ng(n&n bsp;步骤 &n bsp;n&n bsp;状态栈 n&n bsp;符号栈 &n bsp;n

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

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