LL1 文法分析的实现
EmilMatthew (EmilMatthew@126.com) 06/07/1 9
[ 类别 ]课程设计
[推荐指数]★★★
[ 摘要 ]实现了LL1文法分析的基本功能:消除左递归、构建文法的First、Follow及Select集、建立分析表并对句子进行分析。
[ 关键词 ]LL1文法, 文法分析
The implementation of LL1 grammar analyzer
[Classify] Curriculum Design
[ Level ] ★★★
[Abstract] In this article, I realize the basic function of LL1 grammar analyze : eliminate left recursive , construct the grammar’s first set , follow set and select set, and also construct the analyze table to parse the input sentence.
[Key Words]LL1 grammar, grammar analyze
[0引言]
LL1文法是一种简单易行的,自顶向下的,且较易实现的文法。它的原理在编译原理的书上已有详细叙述,本文着重于介绍其实现过程中的一些细节及思考。
[1总体设计思想]
1.1文法的表示
这里采用字符串数组的形式表示文法中的各个项,这样的表示好处在于操作相当直观,缺点是当项目较多时,需要较多的检索时间。
1.2集合类的设计
由于初期对集合的操作的复杂认识不足,直接采用其于一维字条符数组的形式来表示first, follow集及select集,使得细节处的代码编制较为繁锁,如能采用某类封装好的集合数据类型,如hash等,则可使得内部算法实现较为轻松。
1.3自动机的实现------GOTO语句的放光
由于在构建一些有较多情况出现的算法时,用在纸上画出算法对应的自动机是相当方便的。此时,要做的,只是将自动机转化成相应的代码即可。我个人认为,此时是GOTO语句真正有用武之地的一个地方,当自动机的状态多于三个时,用标号结合GOTO语句可以与自动机紧密结合,表达起来相当清晰和简单,如果为了避免用GOTO而改用其它的语句来实现自动机的功能,反而有些得不偿失了。
1.4图算法的应用
计算first集及follow集时,可以用基于集合扩张的迭代算法,直至没有集合在某次迭代计算中更新即意味着算法结束,过程有些繁锁。不过,用图算法就要轻松多了,不仅意图清晰,而且实现起来也相当容易,最后都会涉及到一个可达性计算,用Floyd算法(O(n^3))可轻松搞定。
[2核心算法]
注:空字符这里用z表示。
2.1消除左递归
消除左递归时主要经历以下步骤:
a)对文法按推导字母顺序的顺序排列,且将开始符置于数组最前部,这里采用冒泡算法。
b)查看文法是否含有左递归,如果没有,则终止。
c)准备两个字符串数组:tweenStrArr和tmpGrammerArr,tweenStrArr用以
存放每一个非终止符作为左侧推导项时临时分析结果,tmpGrammerArr则用以存放去除左递归后的文法。
接下来即可进行消除左递归