编译原理课程的设计构造LR分析法语法分析器
太 原 学 院
课程设计报告书
课程名称
设计题目 构造LR(0)分析法语法分析器 专业班级
学 号
姓 名
指导教师
2016年 12 月 15日
目 录
一、课题概述1
二、系统分析2
2.1 本课程设计的知识点2
2.1.1 词法编译器功能2
2.1.2 词法分析器的设计2
2.1.3 动态模拟算法的基本功能2
2.1.4 LR分析器的构成2
2. 2解决问题的基本思路3
2.3 需解决的关键技术3
2.4 功能模块框图3
三、系统设计4
3.1 算法描述4
3. 2 实现方法6
3.2.1 构造分析表6
3.2.2程序设计关键6
3.2.3 LR(0)项目集规范族的构造6
3.3 详细流程图7
四、代码编写8
4. 1 生成分析表代码8
4. 2分析句子代码10
五、调试分析14
六、运行与调试15
总 结 17
参考文献18
课题概述
《编译原理》是计算机专业的一门重要的专业课程,其中包含大量软件设计思想。通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义。语法分析是编译过程的第二阶段,是编译器前端的核心组成部分,在编译系统中起到了至关重要的作用。自底向上的语法分析与自顶向下的语法分析相比,对将要分析的源程序有着更大的分析空间,从而受到了广泛的运用。
本次课程设计的目标即是利用所学过的编译原理的知识,利用LR(0)分析法,用C语言写出一个简单的LR(0)语法分析器。该语法分析器所要完成的功能是,对录入的文法判断它是否为LR(0)文法,如果是输出LR?(0)分析表;在给定文法的情况下,能够利用LR(0)分析表,对用户输入的一串字符串用LR(0)分析法进行分析,判断该字符串是否为符合给定文法的一个句子,建立文法及其LR分析表表示的数据结构,设计并实现一个LR(0)的分析器。编译器设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序。整个编译程序分为三部分:词法分析部分、语法分析处理及四元式生成部分、输出显示部分。一个程序设计语言就是一个记号系统,如同自然语言一样,它的完整的定义应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具。LR分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输人串的k个(k>=0)符号就可惟一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一地确定句柄。LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。
二、系统分析
2.1 本课程设计涉及的知识点
2.1.1 词法编译器功能
(1)导入任意文法,也可以自己输入。
(2)输出文法的分析过程,以及判断是否为LR?(0)文法,输出分析表。
(3)输入句子,进行语法分析。
(4)输出结构树。
2.1.2 词法分析器的设计
(1)写出该语言的词法规则。
(2)把词法规则转换为相应的状态转换图。
(3)把各转换图的初态连在一起,构成识别该语言的自动机。
(4)设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。
2.1.3 动态模拟算法的基本功能
(1)输入LR分析表和一个句子。
(2)输出LR总控程序。
(3)输出依据句子构对应的语法树的过程。
(4)设计一个给定LR分析表,输入一个句子,能由依据LR分析表输出与句子对应的语法树,能对语法树生成过程进行模拟。
(5)输入句子:bccd#。
(6)根据文法产生的LR分析表。
(7)输出结果
2.1.4 LR分析器的构成
一个LR分析器由3个部分组成
(1)总控程序,也可以称为驱动程序。对所有的LR分析器,总控程序都是相同的。
(2)分析表或分析函数。不同的文法分析表将不同,同一个文法采用的LR
分析器不同时,分析表也不同,分析表又可以分为动作(ACTION)表和状态(GOTO)表两个部分,它们都可用二维数组表示。
(3)分析栈,包括文法符号和相应的状态栈。它们均是先进后出栈。分析器的动作由栈顶状态和当前输入符号所决