zoukankan      html  css  js  c++  java
  • 编译原理 first follow select集合理解+例题分析实战

    补充:

    FIRST集里面可以有,但是不能有$

    FOLLOW集里面可以有$,但是不能有

     下面通过一个例子,来展示具体问题分析方法:

     当计算上面文法的first集合的时候,

    第一步,先把所有符号first集写下:

    第二步,分析每一个文法,将分析结果写入first集合

    例如第一个文法,可以得出first(E)集合中,需要包括first(T)中的所有元素,此时first(T)中为空,此时不进行操作

    再看第二个文法,可以得出first(E`)集合包括+和,所以把这两个符号,写入对应first集合

    以此类推

    第三步,循环第二步操作,把对应结果再次分析,直到循环整轮没有新的元素添加进集合中为止

    最后是结果:

    下面进行计算follow集实战:

    第一步,先把所有元素的follow集合写好:

     第二步,将终结符$放在开始的follow集合中

    第三步,开始进行每一行文法的分析

    分析第一行:可以看出T的follow集合等于E`的first集合,E`的first集合包括+和,这里的话,把+放进T的follow集合中,但是因为

    follow集合中没有,所以可以得出结论,E`为空时,T的follow集合和E的follow集合是一样的,需要吧元素移过去,以此类推

    第四步:重复上面操作,直到没有新元素添加进集合

     最后是结果:

    下面展示select集合的求法:

    1:遇见非终结符,select集合为非终结符的first集合

    2:遇见终结符,直接写进集合

    3:当遇到空串,为前面元素的follow集合

         

       First(A)集的作用是标示在替换非终结符A的时候,替换后的文法的首字母集合,语法分析程序根据这个来判断给定的语言是否是合法的,是符合规则的。

             Follow(A)的作用是标示那些可以出现在A之后的字符,语法分析程序根据这个,在A可以被替换为e(空)的时候来进行判断,看当前的文法是否是合法的。

             这里简单说明下,比如A->b,A->e(空) 当给定的语言是 bXXXXX的时候,根据第一句文法就可以判定句子合法,但是如果给的语言是cXXXXX的时候,因为A->可以替换为空,这时候就需要一句A的follow集来进行判断,若A的follow集里面含有c 则语言是合法的

             Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,表明他们是两个无关的,不会产生不确定性的文法,反之,则表明文法不是LL(1)文法

           

  • 相关阅读:
    Python 队列
    Python 栈
    Python面试百题
    TCP:四次挥手
    TCP:三次握手
    SQL:八 SQL高级处理
    SQL:七 集合运算
    SQL:六 函数、谓词、CASE表达式
    SQL:五 复杂查询
    python爬虫——爬取网页数据和解析数据
  • 原文地址:https://www.cnblogs.com/HIT-ryp/p/12898779.html
Copyright © 2011-2022 走看看