• LL(1)文法的判断,递归下降分析程序


    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

    验证文法 G(S)是不是 LL(1)文法?

    First(Da)={b,a}     Follow(A)={c,b,a,#}    SELECT(A->Da)={b,a}

    First(ε)={ε}       Follow(C)={#}        SELECT(A->ε)={c,b,a,#}

    First(aADC)={a}    Follow(D)={a,#}     SELECT(C->aADC)={a}  

    First(b)={b}                  select(C->ε)={#}  

                         select(D->b)={b}  

                           select(D->c)={a,#}

      

    因为:

    SELECT(A->Da)∩SELECT(A->ε)!=空

    SELECT(C->aADC)∩SELECT(C->ε)=空

    SELECT(D->b)∩SELECT(D->ε)=空

    所以G(S)不是LL(1)文法。

    2.法消除左递归之后的表达式文法是否是LL(1)文法?

     Select(E' -> +TE') = First(+TE') = {+}                

    Select(E' -> ε) = (First(ε)-{ε})∪Follow(E') = {),#}               

    Select(T' -> *FT') = First(*FT') = {*}              

    Select(T' -> ε) = (First(ε)-{ε})∪Follow(T') = {#,+,)}

    Select(F -> (E)) = First((E)) = {(}             

    Select(F -> i ) = First(i) = {i}

    因为:Select(E' -> +TE') ∩ Select(E' -> ε) = ∅          

    Select(T' -> *FT') ∩ Select(T' -> ε) = ∅    Select(F -> (E)) ∩ Select(F -> i ) = ∅

    所以:文法G‘(s)是LL(1)文法。

    3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

    课程作业
  • 相关阅读:
    Retrofit2源码分析
    Android8.0硬件加速的重绘流程
    Android单元测试
    rand5->rand7,rand7->rand10
    快速排序的随机化版本
    快速排序
    亦或实现交换
    在最坏情况下,找到n个元素中第二小的元素需要n+lgn-2次比较
    3*n/2时间内求出最大最小值
    基数排序
  • 原文地址:https://www.cnblogs.com/lingcode/p/11908495.html
Copyright © 2020-2023  润新知