没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
《编译原理》实验报告二
《编译原理》课程实验报告二
——一个简易语法分析器的实现
殷迪 131250021
Motivation/Aim
本实验通过一个简易的语法分析器的实现,进一步加深对《编译原理》课程中语法分
析理论的理解,增强动手程序设计能力。分析可以采用自上而下的 LL(1)分析法,自下而
上的 SLR(1)和 LR(1)分析法。本次试验采用的是 LR(1)分析法,加深对它的理解。
Content description
利用 Java 语言实现一个 C 语言子集文法的语法分析器,输入为前一次实验对一段程序
进行词法分析后获得的 token 序列,输出是自底向上语法分析中 LR(1)分析的移入规约
序列,序列中也显示了栈的内容,并且包含了错误处理和提示。
Ideas/Methods
本程序可以通过输入文法,自动构建 LR(1)分析表进行分析。
程序设计的主要思路如下:
1. 根据输入的文法 G 初始化辅助的数据结构,包括终结符集,非终结符集,非终
结符的 first 集(用于产生 LR(1)分析表中的预测符)等。
2. 根据输入的文法 G,构造出 LR(1)状态机(项目集)。
3. 根据构造出的状态机(项目集),生成分析表的 GOTO 和 ACTION 部分,构造
出 LR(1)分析表。
4. 根据 LR(1)分析表,对输入的字符串进行分析
5. 得到并输出分析结果
6. 如果输入的文法有二义性规约冲突,或者输入的字符串不合法会有错误提示。
Assumptions
从词法分析器获取的 token 序列全部符合文法的要求,即全部为给定的文法以及文法
符号。
Related FA descriptions
本程序所使用的自动机全部为程序从文本读取产生式后自动生成,并不需要给出 FA
的示意图,但是本报告后面会给出自动构建的各个状态。
Description of important Data Structures
产生式、终结符、非终结符集
《编译原理》实验报告二
全部为 static 变量,在程序编译链接时自动从文件中读取、解析并存储进对应的集合,
在后续分析过程中随时可以进行调用和查询。
产生式
Left 为产生式左端的内容,ArrayList<String>中存储的是产生式右端的内容,按照产生
式中的顺序进行排列。
用于进行 LR(1)分析的产生式
其中 d 为一个产生式,lr 为 LR(1)分析式右端的那个终结符,index 指向点的位置。
DFA 中的单个状态
Id 是状态的编号,set 是状态中所包含的所有 LR(1)分析式。
DFA
Description of core Algorithms
计算一个文法符号的 first 集合
《编译原理》实验报告二
这里的 addFirst 方法的执行流程是:首先在 HashMap<String,TreeSet<String> >类型的用
于记录各个文法符号对应 first 集合的记录,然后开始逐个遍历文法符号。如果文法符号是
一个终结符,则直接将文法符号本身加入到相应的集合中;如果是一个非终结符,则开始
遍历以该终结符为左端的产生式,如果产生式右端第一个文法符号是一个终结符,则将此
文法符号加入到相应的集合中,如果是一个非终结符,则需要调用下面的递归过程获取可
以推倒得出的终结符加入到 first 中。
以上为根据推倒进行 first 计算的递归方法,通过遍历非终结符为左端的产生式进行获
取。如果产生式对应右端是一个终结符,则直接加入,递归结束;如果是一个非终结符,
则需要进行进一步递归。值得注意的是,对于类似 E->E*E 这样存在左递归的产生式,如
果不加以处理,这里的递归会无穷无尽的进行下去,所以在这里要加入一个限制,即存在
左递归,则递归调用过程立即结束,这样可以有效地避免出现无限的递归调用导致
StackOverflowException。
构建一个用于产生语法分析表的 DFA
《编译原理》实验报告二
构建一个 DFA 仍然是一个递归的过程,因为涉及到要将每个 LR(1)分析式中的点
右端第一个文法符号的产生式找出来进行遍历并添加到相关的状态中,还有另一点很重
要,就是我们需要通过获取 path 从而进入下一个状态,这两点共同决定了 DFA 的构建必
然是一个递归的过程。
在上一个 createDFA()方法中我们先利用产生式 S’->S 构建一个状态,然后获取可
能的进入下一个状态的路径和对应的各个路径的进入下一个状态的产生式后,开始调用下
面 addState 的递归方法。该递归方法的递归结束条件有两个:一个是所有的产生式的点都
到达了产生式的末尾,还有一个是检测到已经有一个内容完全相同的状态被添加。
剩余19页未读,继续阅读
黄浦江畔的夏先生
- 粉丝: 11
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0