LL(1)文法的判斷,遞歸降低分析程序

1. 文法 G(S):spa

(1)S -> AB遞歸

(2)A ->Da | εit

(3)B -> cC語法

(4)C -> aADC | ε程序

(5)D -> b | εerror

驗證文法 G(S)是否是 LL(1)文法?co

FIRST集:cas

FIRST(A) → { a,b }void

FIRST(Da) → { a,b }

FIRST(ε)→{ ε }

FIRST(cC)→{ a,c }

FIRST(b)→{ b }

FOLLOW集:

FOLLOW(S)→{ # }

FOLLOW(A)→{ a,b,c,# }

FOLLOW(B)→{ # }

FOLLOW(C)→{ # }

FOLLOW(D)→{ a,#  }

SELECT集:

SELECT(A→Da)={b,a}

SELECT(A→ε)={a,b,c,#}

SELECT(B→cC)={c}

SELECT(C→aADC)={a}

SELECT(C→ε)={#}

SELECT(D→b)={b}

 SELECT(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

FIRST集:

FIRST(E) → { ( , i }

FIRST(E') → { +,ε }

FIRST(T) → { ( , i }

FIRST(T') → { *,ε }

FIRST(F) → { ( , i }

FOLLOW集:

FOLLOW(E) → { ) , #  }

FOLLOW(E') → { ) , # }

FOLLOW(T) → { + , ) , # }

FOLLOW(T') → { + , ) , # }

FOLLOW(F) → { * , + , ) , # }

SELECT集:

SELECT(E→TE') → { ( , i }

SELECT(E'→+TE') → {+}

SELECT(E'→ε)= FIRST(ε)-{ ε } U FOLLOW(E') = FOLLOW(E') →  { ) , # }

SELECT(T→FT') → { ( , i }

SELECT(T'→*FT') → {*}

SELECT(T'→ε) → {+,),#}

SELECT(F→(E)) → { ( }

SELECT(F→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()

SELECT集:

SELECT(E→TE') → { ( , i }

SELECT(E'→+TE') → {+}

SELECT(E'→ε)= FIRST(ε)-{ ε } U FOLLOW(E') = FOLLOW(E') →  { ) , # }

SELECT(T→FT') → { ( , i }

SELECT(T'→*FT') → {*}

SELECT(T'→ε) → {+,),#}

SELECT(F→(E)) → { ( }

SELECT(F→i) → { i }

遞歸降低語法分析程序:

void ParseE() {

switch (lookahead) {

case '(','i':

ParseT();

ParseE '();

break;

default:

print("syntax error \n");

exit(0);

}

}

void ParseE'(){

switch(lookahead)

{

case '+':

MatchToken('+');

ParseT();

ParseE '();

break;

case ')','#':

break;

default:

print("syntax error \n");

exit(0);

}

}

void ParseT() {

switch (lookahead) {

case '(','i':

ParseF();

ParseT '();

break;

default:

print("syntax error \n");

exit(0);

}

}

void ParseT'(){

switch(lookahead){

case'*':

MatchToken('*');

ParseF();

ParseT'();

break;

case'+',')','#':

break;

default:

print("syntax error \n");

exit(0);

}

}

void ParseF(){

switch(lookahead){

case'(':

MatchToken('(');

ParseE();

MatchToken(')');

break;

case'i':

MatchToken('i');

break;

default:

print("syntax error \n");

exit(0);

}

}

 

 4.加上實驗一的詞法分析程序,造成可運行的語法分析程序,分析任意輸入的符號串是否是合法的表達式。

相關文章
相關標籤/搜索