[课程设计]LL1 文法分析的实现

本文介绍了LL1文法分析器的实现,包括消除左递归、构建First、Follow及Select集,建立分析表进行句子分析。通过核心算法详细阐述了消除左递归、计算First、Follow集和构建符号分析表的过程,并提供了两个实验案例验证了程序的正确性和稳定性。
摘要由CSDN通过智能技术生成

  LL1 文法分析的实现

            EmilMatthew (EmilMatthew@126.com)       06/07/1 9

[  类别  ]课程设计   

[推荐指数]★★★

[  摘要  ]实现了LL1文法分析的基本功能:消除左递归、构建文法的FirstFollowSelect集、建立分析表并对句子进行分析。

[ 关键词 ]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总体设计思想]

   11文法的表示

   这里采用字符串数组的形式表示文法中的各个项,这样的表示好处在于操作相当直观,缺点是当项目较多时,需要较多的检索时间。

  

   12集合类的设计

   由于初期对集合的操作的复杂认识不足,直接采用其于一维字条符数组的形式来表示first follow集及select集,使得细节处的代码编制较为繁锁,如能采用某类封装好的集合数据类型,如hash等,则可使得内部算法实现较为轻松。

 

   13自动机的实现------GOTO语句的放光

   由于在构建一些有较多情况出现的算法时,用在纸上画出算法对应的自动机是相当方便的。此时,要做的,只是将自动机转化成相应的代码即可。我个人认为,此时是GOTO语句真正有用武之地的一个地方,当自动机的状态多于三个时,用标号结合GOTO语句可以与自动机紧密结合,表达起来相当清晰和简单,如果为了避免用GOTO而改用其它的语句来实现自动机的功能,反而有些得不偿失了。

 

   1.4图算法的应用

   计算first集及follow集时,可以用基于集合扩张的迭代算法,直至没有集合在某次迭代计算中更新即意味着算法结束,过程有些繁锁。不过,用图算法就要轻松多了,不仅意图清晰,而且实现起来也相当容易,最后都会涉及到一个可达性计算,用Floyd算法(O(n^3))可轻松搞定。

  

[2核心算法]

   注:空字符这里用z表示。

2.1消除左递归

   消除左递归时主要经历以下步骤:

a)对文法按推导字母顺序的顺序排列,且将开始符置于数组最前部,这里采用冒泡算法。

b)查看文法是否含有左递归,如果没有,则终止。

c)准备两个字符串数组:tweenStrArrtmpGrammerArrtweenStrArr用以

存放每一个非终止符作为左侧推导项时临时分析结果,tmpGrammerArr则用以存放去除左递归后的文法。

  

接下来即可进行消除左递归

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值