• 编译原理随堂作业十一-------LL(1)文法的判断


    文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

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

    SELECT(A ->Da)=FIRST(Da)={b,a}

    SELECT(A ->ε)=FOLLOW(A)=FIRST(B) U FIRST(D) U FIRST(C) U FOLLOW(C)={c,b,a,#}

    SELECT(C -> aADC)=FIRST(aADC)={a}

    SELECT(C -> ε)=FOLLOW(C)={#}

    SELECT(D -> b)=FIRST(b)={b}

    SELECT(D -> ε)=FOLLOW(D)={a,#}

    因为SELECT(A ->Da)与SELECT(A ->ε)的交集不为空集

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

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

     消除左递归:

    E-->TE'

    E'-->+TE' | ε 

    T-->FT' 

    T'-->*FT' | ε 

    F-->(E) | i

    SELECT(E'-->+TE' )=FIRST(+TE')={+}

    SELECT(E'-->ε )=FOLLOW(E')={#}

    SELECT(T'-->*FT' )=FIRST(*FT")={*}

    SELECT(T'-->ε )=FOLLOW(T')={#}

    SELECT(F-->(E) )=FIRST((E))={ ( }

    SELECT(F-->i)=FIRST(i)={i}

    因为SELECT(E'-->+TE' )和SELECT(E'-->ε )、SELECT(T'-->ε )和SELECT(F-->(E) )、SELECT(F-->(E) )和SELECT(F-->i)三组各自的交集均为空集,因此其为LL(1)文法

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

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

    void ParseE(){

        switch(lookahead){
            case (,i:
                ParseT();
                ParseE'();
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseE'(){
        switch(lookahead){
            case +:
                MatchToken(+);
                ParseT();
                ParseE'();
                break;
            case #,):
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseT(){
        switch(lookahead){
            case (,i:
                ParseF();
                ParseT'();
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
         
    }
    void ParseT'(){
        switch(lookahead){
            case *:
                MatchToken(*);
                ParseF();
                ParseT'();
                break;
            case #,),+:
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseF(){
        switch(lookahead){
            case (:
                MatchToken(();
                ParseE()
                MatchToken());
                break;
            case i:
                MatchToken(i);
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
  • 相关阅读:
    C++网络编程服务器select模型(参考)
    javascript中多维数组的使用
    C++ 网络编程 阻塞I/O模型并发回显服务器
    指针在javascript的使用方式
    C++网络编程之服务器编程
    C++网络编程之客户端程序
    Excel数据提取C++代码(仅供参考)
    SkipOut游戏实现代码
    C++读取Excel 精华
    MFC excel修改类
  • 原文地址:https://www.cnblogs.com/xiaoAP/p/11888328.html
Copyright © 2020-2023  润新知