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(CC)= {C}
FIRST(AADC)= {}
FIRST(B)= {B}
FOLLOW 集
FOLLOW(A)= {C、B、#}
其中#是FOLLOW(A)=フォロー(C)=フォロー(B)=フォロー(S)
フォロー(B)= {#}
フォロー(C)= {#}
フォロー(D = {#}
SELECT 設定
SELECT(A->ダ)= FIRST(DA)= {B}
SELECT(A->ε)= FOLLOW(A)= {C、B、#}
(C-> AADC)= FIRST(AADC)SELECT = {}
SELECT(C->ε)=フォロー(C)= {#}
SELECT(D-> B)=最初の(B)= {B}
SELECT(D->ε)=フォロー(D)= {#}
以降SELECT(A-> Da)で∩ SELECT (A-> [イプシロン] )≠∅
SELECT(C-> AADC )∩ SELECT(C->ε)= ∅
SELECT(D-> B)∩ SELECT(D->ε)= ∅
したがって、G(S)はないLL(1)構文。
2.(最後のジョブ)それがあるかどうかを再帰式の文法の後に左排除するためにLL(1)文法?
あまりにも左再帰を排除します:
E-> TE "
E ' - > + TE' | E
T-> FT」
T ' - > * FT' |ε
F - >(E)| I
FIRST 集:
FIRST(TE ')= {(I}
FIRST(TE +「)= {+ 、 E}
FIRST(FT ')= {(I}
FIRST(* FT ')= {*、ε}
FIRST((E))= {(}
FIRST(I)= {I}
FOLLOW 集:
フォロー(E)= {)、#}
フォロー(E ')= {)、#}
フォロー(T)= {+、)、#}
フォロー(T ')= {+、)、#}
フォロー(F)= {*、+、)、#}
SELECT セット:
SELECT(E - > TE ')=最初の(TE')= {(I}
SELECT(E」 - > + TE ')=最初の(+ TE')= {+}
SELECT(E」 - >ε)= FIRST(ε) - {ε} Uフォロー(E ')=フォロー(E')= {)、#}
SELECT(T - > FT ')=最初の(FT')= {(I}
SELECT(T」 - > * FT ')=最初の(* FT')= {*}
SELECT(T」 - >ε)= FIRST(ε) - {ε} Uフォロー(T ')=フォロー(T')= {+、)、#}
SELECT(F - >(E))= FIRST((E))= {(}
SELECT(F - > I)=最初の(I)= {I}
SELECT(E ' - > + TE ')=最初の(+ TE')= {+}∩SELECT(E' - >ε)=フォロー(E ')= {)、#} = ∅
SELECT(T ' - > * FT ')=最初の(* FT')= {*}∩SELECT(T' - >ε)=フォロー(T ')= {+、)、#} = ∅
SELECT(F - >(E))= FIRST((E))= {(} ∩ SELECT(F - > I)=最初の(I)= {I} = ∅
したがって、文法は、LL(1)構文。
3. 接続2 がある場合、LL(1)文法、その再帰下降構文解析コードを書きます。
E()
{ T();
E '();
}
E '()
T()
T '()
F()
ボイドパーシー()
{
スイッチ(ルックアヘッド){
ケース '('、 'I':
Frset();
パーシー '()
ブレーク;
デフォルト:
printf( "syntxエラー\ n個");
出口(0);
}
}
ボイドパーシー '()
{
スイッチ(ルックアヘッド){
場合 '+':
マッチトークン(+);
Frset();
パーシー '();
ブレーク;
ケース ')'、 '#'
ブレーク;
デフォルト:
printf( "syntxエラー\ n個");
出口(0);
}
}
ボイドPARSET()
{
スイッチ(ルックアヘッド){
ケース '('、 'I'
ParseF();
Frset「();
ブレーク;
デフォルト:
printf( "syntxエラー\ n個");
出口(0);
}
}
ボイドPARSET '()
{
スイッチ(ルックアヘッド){
ケース '*':
マッチトークン(*);
ParseF();
Frset「();
ブレーク;
場合 '+'、 ')'、 '#':
ブレーク;
デフォルト:
printf( "syntxエラー\ n個");
出口(0);
}
}
ボイドParseF(){
スイッチ(ルックアヘッド){
ケース '(':
マッチトークン( '(');
パーシー();
マッチトークン( ')');
ブレーク;
ケース 'I':
マッチトークン(「中」);
ブレーク;
デフォルト:
printf( "syntxエラー\ n個");
出口(0);
}
}