• 编译原理随堂作业十一-------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);
        }
    }
  • 相关阅读:
    opensees中不同命令查询单元力使用的坐标系对比
    应用高德地图API 将地址转换为经纬度
    JS some方法 和includes方法
    antd input控制只能输入数字并进行格式化显示(antd 3版本) ฅ˙
    QT入门
    【装机】i712700+华硕B660m装机体验
    nohup 日志只输出错误日志
    378、有序矩阵中第K小的元素
    IO—文件夹拷贝
    Spring Cloud 整合Zookeeper解决jar包冲突
  • 原文地址:https://www.cnblogs.com/xiaoAP/p/11888328.html
Copyright © 2020-2023  润新知