1. grammar G (S):
(1)S -> AB
(2)A ->Da|ε
(3)B -> cC
(4)C -> aADC |ε
(5)D -> b|ε
Verify grammar G (S) is not LL (1) grammar?
FIRST集: |
FOLLOW集: |
|
FIRST(A) = { b,a, ε } FIRST(C) = { a } FIRST(D) = { b } |
FIRST(Da) = { b,a } FIRST (e) = {e} FIRST(aADC) = {a} FIRST(b) = { b } |
FOLLOW(A) = { c,b,a,# } FOLLOW(C) = { # } FOLLOW(D) = { a,# }
|
SELECT set: |
||
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 -> ε)=∅
That grammar G (S) is not LL (1) syntax.
2. (last job) after the elimination of left recursion whether the expression grammar is LL (1) grammar?
E -> E+T | T
T -> T*F | F
F -> (E) | i
Eliminate left recursion:
E -> TE '
E '-> + TE' | e
T -> FT’
T’ -> *FT’ | ε
F -> (E) | i
FIRST集: |
FOLLOW集: |
|
FIRST (E ') = {+, e} FIRST(T’) = { * , ε } FIRST(F) = { ( , i } |
FIRST(+TE') = {+} FIRST (e) = {e} FIRST(*FT') = {*} FIRST((E)) = { ( } FIRST(i) = {i} |
FOLLOW(E’) = { ) , # } FOLLOW(T’) = { + , ) ,# } FOLLOW(F) = { * , + , ) ,# } |
SELECT set: |
||
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 } |
Namely: the SELECT (E '-> + the TE') ∩SELECT (E '-> [epsilon]) = ∅
SELECT(T’ -> *FT’)∩SELECT(T’ -> ε)=∅
SELECT(F -> (E))∩SELECT(F -> i)=∅
That is, the grammar is LL (1) syntax.
3. The connection 2, if it is LL (1) grammar, write its recursive descent parser code.
void ParseE(){
if(lookhead==(,i){
Frset ();
ParseE’();
break;
}else{
print(“syntax error \n”);
exit(0);
}
}
void ParseE’(){
Switch(lookhead){
case +:
Match Token (+);
Frset ();
ParseE’();
break;
case ),#:
break;
default:
print(“syntax error \n”);
exit(0);
}
}
void ParseT(){
if(lookhead==(,i){
ParseF();
Frset '();
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.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。