作业十一

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 \n");
            exit(0);
    }
}
void ParseE'(){
    switch(lookahead){
        case +:
            MatchToken(+);
            ParseT();
            ParseE'();
            break;
        case #,):
            break;
        default:
            printf("syntax error \n");
            exit(0);
    }
}
void ParseT(){
    switch(lookahead){
        case (,i:
            ParseF();
            ParseT'();
            break;
        default:
            printf("syntax error \n");
            exit(0);
    }
     
}
void ParseT'(){
    switch(lookahead){
        case *:
            MatchToken(*);
            ParseF();
            ParseT'();
            break;
        case #,),+:
            break;
        default:
            printf("syntax error \n");
            exit(0);
    }
}
void ParseF(){
    switch(lookahead){
        case (:
            MatchToken(();
            ParseE()
            MatchToken());
            break;
        case i:
            MatchToken(i);
            break;
        default:
            printf("syntax error \n");
            exit(0);
    }
}
 
 
 
 
4.
posted on 2019-11-21 21:12  邓伟江  阅读(91)  评论(0编辑  收藏  举报