梦想赌坊的当家(EmilMatthew的侠意人生)

博客已转移至http://www.douban.com/people/emilmatthew/

原创 [课程设计]LL1 文法分析的实现收藏

  LL1 文法分析的实现

            EmilMatthew (EmilMatthew@126.com)       06/07/19

[  类别  ]课程设计   

[推荐指数]★★★

[  摘要  ]实现了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则用以存放去除左递归后的文法。

  

接下来即可进行消除左递归的过程,核心算法框架如下:

       For each vn in Grammer

              For each item which started by vn’ (vn’ has been operated)

                     If  has vn->vn’a then

                            Replace all vn’ with vn’->beta

                     Endif

              End for

              If(vn has left recursive)

                     Find new sign vnNew

Change      Vn->VnB|A to

                            Vn->A vnNew

                            vnNew->B vnNew

                            vnNew->z                //这里用z代表空

              Else

                     Copy all vn->beta to tmpGrammerArr

              End If

       End for

 

 

2.2first集,follow集及select

   221计算各非终止符是否可推得空

   这个算法较易,框架如下:

   While has un labeled node

              Changed=0

For all the vn if not labled

If has vn->z*     then

                                   produceZ[vn’s pos]=1

                                   replace all vn in grammer ‘s right side with z

                                   Changed=0

End If

              End for

             

              If(changed==0)

                     Label all the unlabeled vn in produceZ with 0

              End If

       End While

 

   222Frist集的计算

   [a]First集采用基于图的算法:

对于形如A->aB的推导式,则连接A->a一条线;(注意a!=z)

对于形如A->B的推导式,则连A->B一条线,

   对于形如A->BC的推导式,如果B->z,则连A->C一条线。

   再则用Floyd算法计算图的各点间的可达性。

   记录First集中的元素。若A->z,则应将z加入First(A)

 

   223Follow集的计算:

   起始符连’#’一条线。

对于形如P->AB 的推导式,连A->First(B)中的所有元素一条线。

   对于形如P->A的推导式,连A->P一条线。

   对于形如P->Aa的推导式,连A->a一条线。

   对于形如P->ABC的推导式,且B->z,则连A->First(C)中所有元素一条线。

   再则用Floyd算法计算图的各点间的可达性。

   记录Follow集中的元素。

 

   224Select集的计算:

   对于形如A->B的式子,且B->z,则加First(B)-zFollow(A)中互异元素至SelectA)中。

   对于形如A->aB的式子,则有Select(A)=a

   记录Select(A)中的元素。

 

 

2.3符号分析表的构建及预测分析程序

   符号分析表的构建较易,是一个填充二维字符串数组的过程。

   而预测分析程序的主框架如下:

   Push(start sign)to analyse Stack

       While(analyse stack is not empty)

       {

              If top(analyse stack ==curChar)

              {

                     Pop analyse stack.

                     Get new curChar

}

Else

{     

find produce started in analyse table:

       rowIndex: top(analyse stack)’s top

       colIndex: curChar’s pos

       if(not founded)

              error

       eles if ->z

              pop analyse stack

       else

              if ->B1B2

              push B2,B1 to analyse stack.

}

}

 

[3]算法实现结果

试验1

文法规则为:(其中,S表示起始字符)

S

S->aH

H->aMd

H->d

M->Ab

M->z

A->aM

A->e

 

需要分析的句子为:

aaabd#

 

经分析程序得到如下结果:

 

==fisrt group condition==:

group S:a,

group A:a,e,

group H:a,d,

group M:a,e,z,

 

==follow group condition==:

group S:#

group A:b

group H:#

group M:bd

======================

 

===output of group select===:

SaH a,

AaM a,

Ae e,

HaMd a,

Hd d,

MAb a,e,

Mz b,d,

================

===output analyse table.===

  a        b        d        e        z        #       

S aH                                                    

A aM                         e                         

H aMd               d                                  

M Ab       z        z        Ab                        

==========================

===parse setence : aaabd# ===

s   analyseStack   unParseSetence op   

  0 #S            aaabd#        S->aH

  1 #Ha           aaabd#        a matched.

  2 #H            aabd#         H->aMd

  3 #dMa          aabd#         a matched.

  4 #dM           abd#          M->Ab

  5 #dbA          abd#          A->aM

  6 #dbMa         abd#          a matched.

  7 #dbM          bd#           M->z

  8 #db           bd#           b matched.

  9 #d            d#            d matched.

parse successfully.

 

试验2

文法规则为:(E表示起始字符)

E

E->E+T

E->T

T->T*F

T->F

F->i

F->(E)

 

需要分析的句子为:

i*(i+i*i)#

 

则得到的分析表及其分析过程如下:

==output analyse table.==

  (        )        *        +        i        z        #       

E TA                                  TA                        

A          z                 +TA                        z       

B          z        *FB      z                          z       

F (E)                                 i                         

T (E)B                                iB                        

==parse setence : i*(i+i*i)# ==

s   analyseStack   unParseSetence op   

  0 #E            i*(i+i*i)#    E->TA

  1 #AT           i*(i+i*i)#    T->iB

  2 #ABi          i*(i+i*i)#    i matched.

  3 #AB           *(i+i*i)#     B->*FB

  4 #ABF*         *(i+i*i)#     * matched.

  5 #ABF          (i+i*i)#      F->(E)

  6 #AB)E(        (i+i*i)#      ( matched.

  7 #AB)E         i+i*i)#       E->TA

  8 #AB)AT        i+i*i)#       T->iB

  9 #AB)ABi       i+i*i)#       i matched.

 10 #AB)AB        +i*i)#        B->z

 11 #AB)A         +i*i)#        A->+TA

 12 #AB)AT+       +i*i)#        + matched.

 13 #AB)AT        i*i)#         T->iB

 14 #AB)ABi       i*i)#         i matched.

 15 #AB)AB        *i)#          B->*FB

 16 #AB)ABF*      *i)#          * matched.

 17 #AB)ABF       i)#           F->i

 18 #AB)ABi       i)#           i matched.

 19 #AB)AB        )#            B->z

 20 #AB)A         )#            A->z

 21 #AB)          )#            ) matched.

 22 #AB           #             B->z

 23 #A            #             A->z

parse successfully.

 

   以上两个试验从较大呈度上说明了程序运行的正确性及稳定性,当然,对程序本身还有待进行更进一步的严格测试,也欢迎诸位需要此程序的朋友们在抓到BUG时能告知于我,谢谢。

 

[参考文献与网站]

[1] 吕映芝,编译原理,清华大学出版社,2004.

 

[源码下载]

http://emilmatthew.51.net/EmilPapers/0626LL1Grammer/code.rar

 

若直接点击无法下载(或浏览),请将下载(或浏览)的超链接粘接至浏览器地( 推荐MYIEGREENBORWSER)址栏后按回车.若不出意外,此时应能下载.

若下载中出现了问题,请参考:

http://blog.csdn.net/emilmatthew/archive/2006/04/08/655612.aspx

发表于 @ 2006年07月19日 23:26:00|评论(loading...)

新一篇: 玩玩数字图像处理[1] | 旧一篇: 天赖之选------国外篇[2]When You Believe

用户操作
[即时聊天] [发私信] [加为好友]
秦盛
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
秦盛的公告

〖我的作品〗



〖我的连载〗

快速Flash开发

〖文化视角〗

     1.90年代初的苏州

     2.中国动画80年

     3.古城真定

     4.三国知识问答

     5.大哥陈松勇

     6.圣斗士.终章

     7.武侠配乐.少林雄风

     8.李宗盛.生活家的院子

     9.李敖精彩语录选

     10.安东尼奥尼.中国.剪影.1

     11.安东尼奥尼.中国.剪影.2

     12.林青霞向季老讨文气

     13.山水情.中国水墨动画之巅峰

     14.《人物》之媒体人.刘长乐

     15.侯孝贤谈悲情城市

     16.转.夜泊秦淮近酒家

     17.冯骥才:守望民间文化的精卫鸟


我是一个快乐的赌徒,因为我掷出去的每把骰子,都是自己的,玩的都是真性情。


和很多人一样,我没有好的家境可以依赖,一切都从零开始,靠自己打拼.有时,站在太阳下,经常问自己:"我就这样了?"回答,当然是否定的,但要的是------行动.



〖宣言〗

前途是光明的

道路是曲折的


〖祈福〗

祝季羡林老先生在301医院身体健康,心情愉快!

祝李敖大师精神矍铄,风采不逊当年,多出新作!

遥祝Bertrand Rusell在天堂依旧幸福人生!


    〖强烈推荐〗

   ACM图灵奖演讲集

   FF背后的牛人们

   (视频)Dijkstra风采













文章分类
收藏
05大师有大智慧
Alan Kay(Smalltalk,OOP)
BERTRAND RUSSELL
Donald E. Knuth(Art of Algorithm)
Edsger W. Dijkstra(Programming & Algorithm Design,Shortest Path)
John McCarthy(人工智能)
李敖
06闲情,感悟
苏州古城的历史
苏州杂志
读者论坛
赵云庙
07天籁之音
[周华健,李度]难以抗拒
[成龙,苏慧伦]在我生命中的每一天
[成龙]壮志在我胸
[灌篮高手]直到世界的尽头
Somewhere out there
somke gets in your eyes
When You Believe
野风[新龙门客栈片尾曲,林忆莲]
08苏州中学
苏中主页
09算法,数据结构,优化
ACM/ICPC的司令部
Dictionary of Algo&DS
IOI选手优秀论文
Lucky猫的ACM园地
UVA在线答题系统
中国人工智能网
中国数据挖掘网
中国网格信息中转站
中国运筹学协会
信息学初学者之家
信息学奥林匹克基地
北大ACM站
数据结构自考网
浙大ACM站
10科学,论文
Citeseer
Scientific American
Tex中文站
yesize资料坊
上海网上天文台
中国学术期刊网
中国工程院
中国水利期刊
中国知网
中国科学院
大众科普网
奇迹文库
科研中国
集智俱乐部
11名校计算机科学院巡礼
(UIUC)伊利诺伊香槟分校
Carnegie Mellon(卡梅基隆)
Mit[麻省理工学院]
Princeton[普灵斯顿大学]
purdue[普度大学]
Stanford[斯坦福大学]
中国科学技术大学
交通大学
北京大学
南京大学
复旦大学
浙江大学
清华大学
12应用数学,建模
Math.com
中国数学建模
中国统计网
数学中国
数学常用工具FAQ
13ComputerScience
《计算机教育》期刊网站
acm来了
李开复学生网
15综合科学
《科学》杂志
从欧氏几何到微分几何
16数值计算
Pi的小站
17朋友的链接
Nemon
大漠穷秋
18EnglishLearning
沪江英语
20图形学
The Chaos Games
VRML用户手册
中国虚拟现实开发者
中国计算机图形学教学研究会
分形屏道
分形艺术
机器视觉在线
虚拟无忌
21操作系统
Bochs摸拟环境
ChinaLinux
Linux/BSD/UNIX文档
Linux_Kernel
中国UNIX技术联盟
帮助Linux爱好者
永远的UNIX
22ActionScript_Flash
[Flasher]Dengjie
[开源的AS2编译器]Mtasc
FlashASM
RobertPenner
ultrashock
X-Woods
闪吧音乐盒
23C/C++
C++ Home
C++FAQ-LITE
C-C++ User Journal
CPlusPlus.com
C语言之家
GCC Compiler
GCC.GNU
SGI-STL
VCHelp[CN DEV]
VC知识库
24GameDev
CSDN游戏开发站
GamaSutra
GameAI
GameDev.NET
Gamerers
vbgamer
25JAVA技术
JAVA.SUN
中文JAVA技术网
26编程技术
[MSDN Eng]
[MSDN 中文版]
ASCII Table
SourceForge
UML.ORG
中国程序员(CSDN)
文件格式汇编
程序员联合开发网
问专家
28物理模拟与仿真
中国仿真互动
流体中文网
29网络安全
绿盟论坛
30环保
中国环境监测
南水北调网
国家环保总局
江苏环保网
31可爱的事物
叮铛论坛
32设计,排版
5D多媒体
BlueIdea
印科网
33影视,音乐,电台
上海文广新闻传媒
阿拉上海人
34优秀个人BLOG
fisher_jiang的专栏
gzfqh的专栏
ScienceStudy
刘爱贵的个人主页
大肚能容天下剑
寒蝉退士
梦想风暴
煮石
男儿当自强
男单618
编程夜未眠
记得忘记@博客
35专栏
抗战胜利60年(sina)
抗战胜利60年(yahoo)
50电子游戏
Raine街机模拟器
WAR3中文网
专业射击游戏联盟
地精研究院
51常用软件
flashfxp
GreenBrowser
小巧好用的编辑器SciTEFlash
强力抓屏
金山在线词典
52网上书店
DearBook
当当网
53硬件DIY
52硬件
电脑报论坛
存档
Csdn Blog version 3.1a
Copyright © 秦盛