作业11 LL(1)文法的判断,递归下降分析程序
1. 文法 G(S):
(1)S -> AB
(2)A ->Da|ε
(3)B -> cC
(4)C -> aADC |ε
(5)D -> b|ε
验证文法 G(S)是不是 LL(1)文法?
|
FIRST集: |
FOLLOW集: |
|
|
FIRST(A) = { b,a, ε } FIRST(C) = { a } FIRST(D) = { b } |
FIRST(Da) = { b,a } FIRST(ε) = {ε} FIRST(aADC) = {a} FIRST(b) = { b } |
FOLLOW(A) = { c,b,a,# } FOLLOW(C) = { # } FOLLOW(D) = { a,# }
|
|
SELECT集: |
||
|
SELECT(A -> Da) = FIRST(Da) = { b , a } SELECT(A -> ε) = FIRST(ε) - {ε} U FOLLOW(A) = FOLLOW(A) = { c,b,a,# } SELECT(C ->aADC) = FIRST(aADC) = { a } SELECT(C -> ε) = FIRST(ε) - {ε} U FOLLOW(aADC) = FOLLOW(C) = { # } SELECT(D ->b) = FIRST(b) = { b } SELECT(D -> ε) = FIRST(ε) - {ε} U FOLLOW(D) = FOLLOW(D) = { a,# } |
||
即有: SELECT(A -> Da)∩SELECT(A -> ε)≠∅
SELECT(C ->aADC)∩SELECT(C -> ε)=∅
SELECT(D ->b)∩SELECT(D -> ε)=∅
即文法G(S)不是LL(1)文法。
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
E -> E+T | T
T -> T*F | F
F -> (E) | i
消除左递归:
E -> TE’
E’ -> +TE’ | ε
T -> FT’
T’ -> *FT’ | ε
F -> (E) | i
|
FIRST集: |
FOLLOW集: |
|
|
FIRST(E’) = {+ , ε } FIRST(T’) = { * , ε } FIRST(F) = { ( , i } |
FIRST(+TE') = {+} FIRST(ε) = {ε} FIRST(*FT') = {*} FIRST((E)) = { ( } FIRST(i) = {i} |
FOLLOW(E’) = { ) , # } FOLLOW(T’) = { + , ) ,# } FOLLOW(F) = { * , + , ) ,# } |
|
SELECT集: |
||
|
SELECT(E’ -> +TE’) = FIRST(+TE’) = { + } SELECT(E’ -> ε) = FIRST(ε) - {ε} U FOLLOW(E’) = FOLLOW(E’) = { ) , # } SELECT(T’ -> *FT’) = FIRST(*FT’) = { * } SELECT(T’ -> ε) = FIRST(ε) - {ε} U FOLLOW(T’) = FOLLOW(T’) = { + , ) ,# } SELECT(F -> (E)) = FIRST((E)) = { ( } SELECT(F -> i) = FIRST(i) = { i } |
||
即有: SELECT(E’ -> +TE’)∩SELECT(E’ -> ε)=∅
SELECT(T’ -> *FT’)∩SELECT(T’ -> ε)=∅
SELECT(F -> (E))∩SELECT(F -> i)=∅
即该文法是LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
void ParseE(){
if(lookhead==(,i){
ParseT();
ParseE’();
break;
}else{
print(“syntax error \n”);
exit(0);
}
}
void ParseE’(){
Switch(lookhead){
case +:
MatchToken(+);
ParseT();
ParseE’();
break;
case ),#:
break;
default:
print(“syntax error \n”);
exit(0);
}
}
void ParseT(){
if(lookhead==(,i){
ParseF();
ParseT’();
break;
}else{
print(“syntax error \n”);
exit(0);
}
}
void ParseT’(){
Switch(lookhead){
case *:
MatchToken(*);
ParseF();
ParseT’();
break;
case +,),#:
break;
default:
print(“syntax error \n”);
exit(0);
}
}
void ParseF’(){
Switch(lookhead){
case (:
MatchToken(();
ParseE();
MatchToken());
break;
case i:
MatchToken(i);
break;
default:
print(“syntax error \n”);
exit(0);
}
}
4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。
浙公网安备 33010602011771号