zoukankan      html  css  js  c++  java
  • 求FIRST集和FOLLOW集

    花了点时间弄了个大概,希望对和我一样的人有所帮助。
     

    文法如下:

    E -> TE'
    E' -> +TE'|ε
    T -> FT'
    T' -> *FT'|ε
    F -> (E)|id
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    FIRST集:由非终结符号推出的所有的开头符号或ε
    规则:终结符的FIRST集,即是他本身。
    所以,FIRST(+) = {+}, FIRST(*) = {*}, FIRST(id) = {id}, FIRST(() = {(}, FIRST()) = {)}
    FIRST(E): 列出与E相关的产生式: E->TE'  T -> FT'  F -> (E)|id,
    显然,F->(  / id,  T-> (  / id,  所以,FIRST(F) = {(,id}, FIRST(T) = {(,id}, FIRST(E) = {(,id}
    FIRST(E') = {+,ε}
    FIRST(T') = {*,ε}
    FOLLOW集:紧跟随其后面的终结符号或#
    和FIRST集不同的是:FOLLOW集只是针对非终结符而言,因为FIRST集和FOLLOW集设计的初衷就是
    根据当前句型的最左语法变量A和当前输入符号a可以唯一的选择A的候选式αi来替换A,
    从而实现对G的句子进行确定的自顶向下分析。所以终结符可以直接与输入符号进行匹配,不需要FOLLOW集。
    实现:把所有包含你要求的符号的产生式都找出来。
    FOLLOW(E): F -> (E)|id, E后面就是),其他包含E的都没有,所以FOLLOW(E)={),#}
    FOLLOW(E'):   由  E -> TE' 和 F -> (E)|id  推出 F -> (TE')|id ,所以FOLLOW(E)={),#}
    FOLLOW(T):    由  E -> TE'  和  E' -> +TE'|ε ,T后面是E' (即:+TE'|ε),所以,T有+,
                            再根据F -> (E)|id   E -> TE'  推出 F -> (TE')|id,当 E' -> ε时,T后面是),所以,T有 ).
                            故FOLLOW(T) = {+,),#}
    FOLLOW(T'):   由  E -> TE' 和 F -> (E)|id  推出 F -> (TE')|id,且 T -> FT',所以  F -> (FT'E')|id
                             T' 后面紧跟 E',E' -> +TE'|ε,当E' -> +TE'时,T' 有 +。当E' -> ε 时,T' 有 )
                            故FOLLOW(T') = {+,),#}
    FOLLOW(F):  由  E -> TE' 和 F -> (E)|id  推出 F -> (TE')|id,且 T -> FT' ,T' -> *FT'|ε,所以  F -> (FT'E')|id
    当 T' -> *FT'时,F有 *,当T' -> ε时,F后紧跟E',当E' -> +TE'时,F有 +,当E' -> ε时,F 有 )
                           故FOLLOW(F) = {*,+,),#}
     
    另一个例子:
    文法:
    S --> aA 
    S --> d
    A --> bAS
    A --> ε
    求出该文法的First集 和 Follow集。
     
    严谨的说  First集 是针对候选式而说的。在此把书上的求候选式First集的算法写一下:
    --------------------------------------------------------------------------------------------------------------------------------
    输入:文法G = (V,P,T,S),α = (v ∪ T)*,α = X1.....Xn
    输出:First(α)
    步骤:
    1、计算First(X1);
    2、First(α) = First(X1) - {ε}
    3、k = 1
    4、while(ε ∈ First(Xk) and k < n)    do begin
                    First(α) = First(α) ∪ (First(Xk+1) - {ε})
                    k = k +1   end
    5、if(k = n and ε ∈ First(Xk))  then First(α) = First(α) ∪ {ε}
    --------------------------------------------------------------------------------------------------------------------------------
    First(S) = {a,d}
    First(A) = {b,ε}
    First(aA) = {a}
    First(d) = {d}
    First(bAS) = {b}
    First(ε) = {ε}
     
    咋看之下 Follow(S) = {#}  实则不然
    (1)S --> aA            (2)A --> bAS
    由2得: Follow(A) = First(S) = {a,d, #}
    又因为 1 式:S --> aA,Follow(S) = Follow(A) = {a,d, #}
    作者:Standby一生热爱名山大川、草原沙漠,还有妹子
    出处:http://www.cnblogs.com/standby/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    CISC和RISC的区别
    常用ARM指令
    ARM汇编指令特点
    DMA(Direct Memory Access直接存储器访问)总结
    三态门(三态缓冲器)的工作原理
    DSP28335 eCAP 测频
    EINT DINT ERTM DRTM EALLOW EDIS ESTOP0的理解
    typedef interrupt void (*PINT)(void)的分析
    DSP28335 GPIO学习
    ECR102E(求减掉最长边加上最短边的最短路)
  • 原文地址:https://www.cnblogs.com/standby/p/6792774.html
Copyright © 2011-2022 走看看