• 作业十一


    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

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

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

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

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

     4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

    1.

    Select(A ->Da)=First(Da)={b,a}

    Select(A ->ε)=Follow(A)={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.

     消除左递归:

    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.

    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);
        }
    }
     
     
     
     
    4.
  • 相关阅读:
    总结一些css加载动画
    写日历的一些总结(三)
    写日历的一些总结(二)
    写日历的一些总结
    兼容性问题总结(转)
    关于npm(转)
    关于NaN
    面向对象与原型
    git命令
    python django 数据库树形菜单的设计
  • 原文地址:https://www.cnblogs.com/dengweijiang/p/11908444.html
Copyright © 2020-2023  润新知