1.文法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)構文。
2.左再帰法の廃止後の式の文法は、LL(1)文法があるかどうか?
A:はい、LL(1)文法。
それは、LL(1)文法であれば3接続2、その再帰下降構文解析コードを書きます。
E()
{T();
E '();
}
E '()
T()
T '()
F()
回答:
ボイドパーシー(){
Frset();
パーシー '();
}
ボイドPARSET(){
ParseF();
Frset「();
}
ボイドパーシー '(){
スイッチ(先読み):
ケース+:
マッチトークン(+);
Frset();
パーシー '();
ブレーク;
ケース番号:
ブレーク;
ケース):
ブレーク;
デフォルト:
printf( 'SYNAXエラー\ nは!');
出口(0);
}
ボイドParseF(){
スイッチ(先読み):
ケース(:
マッチトークン(();
パーシー();
MatchToken())。
ブレーク;
ケースI:
マッチトークン(中)。
ブレーク;
デフォルト:
printf( 'SYNAXエラー\ nは!');
出口(0);
}
無効PARSET '()
{
スイッチ(先読み):
ケース*:
ParseF();
マッチトークン(*);
Frset「();
ブレーク;
ケース番号:
ブレーク;
ケース):
ブレーク;
ケース+:
ブレーク;
デフォルト:
printf( 'SYNAXエラー\ nは!');
出口(0);
}
字句解析を追加4.実験では、パーサは、任意の入力記号列が有効な式ではありません分析し、実行を形成することができます。