1.文法G(S):
(1)S - > AB
(2)A - >ダ|ε
(3)B - > CC
(4)C - > AADC |ε
(5)D - > B |ε
文法G(S)は、LL(1)構文ではないことを確認します。
解:SELECT(A - >ダ)= {B}
SELECT(A - >ε)= {C、B、#}
SELECT(C - > AADC)= {}
SELECT(C - >ε)= {#}
SELECT(D - > B)= {B}
SELECT(D - >ε)= {#}
。··SELECT(A - > Da)で∩SELECT(A - >ε)≠Ø
SELECT(C - > AADC)∩SELECT(C - >ε)= Oで
SELECT(D - > B)∩SELECT(D - >ε)= Oで
。・・G(S)LL(1)文法ではありません
式の文法を除去した後2.もしLL(1)文法の再帰を残していますか?
ソリューション:E - > TE "
E ' - > + TE' | E
T - > FT」
T ' - > * FT' | ε
F - >(E)| 私
SELECT(E ' - > + TE') - > {+}
SELECT(E」 - >ε) - > {#}
SELECT(T ' - > * FT') - > {*}
SELECT(T」 - >ε) - > {#}
SELECT(F - >(E))- > {(}
SELECT(F - > I) - > {I}
···。 SELECT(E ' - > + TE') ∩ SELECT(E「 - >ε) = O
SELECT(T ' - > * FT') ∩ SELECT(T」 - >ε)= Ø
SELECT(F - >(E))∩ SELECT(F - > I)= Oで
・ある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.実験、パーサは、任意の入力記号列が有効な式ではありません分析し、実行を形成することができます