zoukankan      html  css  js  c++  java
  • [转]LL(1)文法判别之First集合、Follow集合、Select集合求法

    说明:

    所有大写字母代表非终结符,小写字母代表终结符,省略号代表未知数目(可能为0)的不确定类型的文法符号。

    First集合:

    First集合顾名思义就是求一个文法符号串所可能推导出的符号串的第一个终结符的集合。

    FirstX)就是求X所有推导出的符号串的第一个符号的集合。

    First集合可分如下几种情况:

    单个符号的First集合:

    单个终结符的First集合就是它自己。

    单个非终结符的First集合:

    A-->a… 产生式右部以终结符开头

    根据定义,这种情况下显然可以看出a属于First(A)

    A-->B… 产生式右部以非终结符开头

    根据定义,既然可以把A替换成B……,也可以看出FirstB)属于FirstA)。

    这是一个递归的推导。

    多个符号形成的符号串的First结合:

    符号串ABC…,并且A不能推导出空串ε

    A不能推导出空串ε,显然根据定义FirstABC…)=FirstA

    符号串ABC…,并且A可能推导出空串ε

    当A不是空串的时候,显然FirstA)属于FirstABC…),但当A是空串的时候,

    ABC…就成了BC…,此时根据B是否能推出空串来决定是否将FirstB)加入FirstABC…)。这是一个递归的推导,综上所述,符号串中的第一个不能推出空串的符 号前面所有符号的First集合减去空串ε都属于FirstABC…),第一个不能推出空串的 符号的First集合也属于FirstABC…)。也就是假设AB都可以推出空串,C不能推 出空串,FirstABC…)=FirstA-ε∪FirstB-ε∪FirstC)。

    符号串ABC…,并且所有的符号ABC…都可能推导出空串ε

    此时FirstABC…)就是所有符号的First集合的并集

    注意:First集合中的符号一定是终结符,终结符也包括空串ε。

    Follow集合:

    Follow集合也是顾名思义的,就是文法符号后面可能跟随的终结符的集合(不包括空 串ε)。

    Follow(X)就是求X后面可能跟随的符号集合。

    Follow集合可分如下几种情况:

    终结符的Follow集合没有定义,只有非终结符才会有Follow集合。

    A-->Ua… 要求的Follow集合的非终结符后跟终结符

    根据定义,显然a属于FollowU)。这种情况下,FollowU)和A没有任何关系,产 生式左边是什么无所谓。

    A-->UP… 要求的Follow集合的非终结符后跟非终结符

    根据定义,显然P的第一个符号属于FollowU),也就是FirstP)属于FollowU)。

    A-->UP并且ε属于FirstP) 要求的Follow集合的非终结符后跟非结尾的终结符, 并且结尾非终结符的First集合包含空串。

    这是上一种情况的一种特例,除了要按上一种情况处理,FirstP)属于FollowU) 以外还要进行分析;因为当P推导为空串时,空串不能出现在Follow集合中,所以U后面跟随的应该是P后面的东西,可P已经是结束的符号,此时U后面显然就是A后 面跟随的东西了。所以在这种情况下FollowA)也属于FollowU)。

    A-->要求的Follow集合的非终结符在产生式结尾

    这时候又要递归推导,UA的结尾,所以U后面跟随的东西也就是A后面跟随的东 西。所以FollowA)属于FollowU)。

    注意:Follow集合中的符号一定是终结符,并且不能包括空串ε,而且定义开始符号 的Follow集合初始为{#(句子括号)}。

    Select集合:

    Select集合就是产生式左部的可能的推导结果的起始符号。

    SelectA-->B)就是求这个产生式中A可能推导出起始符号集合(不包含空串ε)。

    Select集合可分如下几种情况:

    A-->X X为任意文法符号串,不限于非终结符或单个符号),并且X不能推导出空串ε

    根据定义,显然A推出的符号串起始就是X的起始,也就是FirstX.

    SelectA-->X= FirstX

    A-->X X为任意文法符号串,不限于非终结符或单个符号),并且X能推导出空串ε

    根据定义,显然FirstX)属于SelectA-->X),此外,当X推导为空串时,显然A也推导为空串,那么此时推导出的符号串就会是A后面的符号的推导结果。也就是FollowA,所以,此时FollowA)也属于SelectA-->X)。

    注意:Select集合中不包括空串ε,但有可能会包含#(句子括号)。

    转自:http://m.blog.csdn.net/blog/bjrxyz/9261243

  • 相关阅读:
    Selector + 线程池 遇到的问题
    【转】Android TabActivity无法正常bindService解决方法
    Android 中的 Service 全面总结
    【转】IT 圈里有哪些经常被读错的词?
    【转】线程的7种状态及相互转换
    【eoeandroid 特刊】第117期打包网盘下载地址
    使用 Android 自带的 proguard 混淆源码
    Google+ 连接不上的解决办法
    【转】AsyncTask的用法
    winForm简单数据绑定
  • 原文地址:https://www.cnblogs.com/bt575876212/p/4572113.html
Copyright © 2011-2022 走看看