A文法G(S):
(1)S - > AB
(2)A - >ダ|ε
(3)B - > CC
(4)C - > AADC |ε
(5)D - > B |ε
文法G(S)は、LL(1)構文ではないことを確認します。
FIRST集:
FIRST(DA)= {B}
FIRST(E)= {E}
FIRST(AADC)= {}
FIRST(B)= {B}
FOLLOW集:
FOLLOW(A)=最初の(B)+ FIRST(B)+ FIRST(B)+フォロー(C)= {C、A、B、#}
フォロー(C)= {#}
フォロー(D)= {#}
SELECTセット:
SELECT(A->ダ)= {B}
SELECT(A->ε)= {C、B、#}
SELECT(C-> AADC)= {}
SELECT(C->ε)= {#}
SELECT(D-> B)= {B}
SELECT(D->ε)= {#}
理由は次のとおりです。
SELECT(A-> Da)で∩SELECT(A->ε)≠∅
したがって、この文法ではないLL(1)構文。
第二に、文法の除去後の式の文法があればLL(1)文法の再帰を残していますか?
はい。
三つは、それから2、LL(1)文法場合は、その再帰下降パーサのコードを記述します。
ボイドパーシー(){
Frset();
パーシー '();
}
ボイドPARSET(){
ParseF();
Frset「();
}
ボイドパーシー '(){
スイッチ(先読み):
ケース+:
マッチトークン(+);
Frset();
パーシー '();
ブレーク;
ケース番号:
ブレーク;
ケース):
ブレーク;
デフォルト:
printf( 'SYNAXエラー\ nは!');
出口(0);
}
ボイドParseF(){
スイッチ(先読み):
ケース(:
MatchToken(();
ParseE();
MatchToken());
break;
case i:
MatchToken(i);
break;
default:
printf('synax error!\n');
exit(0);
}
void ParseT'()
{
switch(lookahead):
case *:
ParseF();
MatchToken(*);
ParseT'();
break;
case #:
break;
case ):
break;
case +:
break;
default:
printf('synax error!\n');
exit(0);
}