1.文法G(S):
(1)S - > AB
(2)A - >ダ|ε
(3)B - > CC
(4)C - > AADC |ε
(5)D - > B |ε
文法G(S)は、LL(1)文法ではない検証?
回答:
証明:FIRST(DA)= {B}
FIRST(E)= {E}
FIRST(AADC)= {}
FIRST(B)= {B}
FOLLOW(A)= {C、B、#}
フォロー(C)= {#}
フォロー(D)= {#}
SELECT(A - >ダ)= FIRST(DA)= {B}
SELECT(A - >ε)= FIRST(ε) - {ε} UFOLLOW(A)= FOLLOW(A)= {C、B、#}
∩SELECT(A - >ε)≠○ - SELECT(>ダA)以来
したがって、G(S)は、LL(1)構文ではありません。
2.左再帰法の廃止後の式の文法は、LL(1)文法があるかどうか?
A:文法は次のとおりです。(1)E - > TE "
(2)E ' - > + TE' | E
(3)T - > FT」
(4)T ' - > * FT' | ε
(5)F - >(E)| 私
FIRST(+ TE ')= {+}
FIRST(E)= {E}
FIRST(* FT ')= {*}
FIRST((E))= {(}
FIRST(I)= {I}
フォロー(E ')= {)、#}
フォロー(T ')= {+、)、#}
フォロー(F)= {*、+、)、#}
SELECT(E」 - > + TE ')=最初の(+ TE')= {+}
SELECT(E ' - > E)=最初の(E) - {E} UFOLLOW(E')=フォロー(E「)= {)、#}
SELECT(T」 - > * FT ')=最初の(* FT')= {*}
SELECT(T」 - >ε)= FIRST(ε) - {ε} UFOLLOW(T ')=フォロー(T')= {+、)、#}
SELECT(F - >(E))= FIRST((E))= {(}
SELECT(F-> I)=最初の(I)= {I}
SELECT(E ' - > + TE')以来∩SELECT(E「 - >ε)= Oで
SELECT(T」 - > * FT ')∩SELECT(T' - >ε)= Oで
SELECT(F - >(E))∩SELECT(F - > I)= Oで
この式の文法は、LL(1)文法であるようにします。
それは、LL(1)文法であれば3接続2、その再帰下降構文解析コードを書きます。
E()
{T();
E '();
}
E '()
T()
T '()
F()
A:SELECTセット:
SELECT(E-> TE ')=最初の(TE')= {(I}
SELECT(E ' - > + TE')=最初の(+ TE ')= {+}
SELECT(E ' - > E)=最初の(E) - {E} UFOLLOW(E')=フォロー(E「)= {)、#}
SELECT(T-> FT ')=最初の(FT')= {(I}
SELECT(T ' - > * FT')=最初の(* FT ')= {*}
SELECT(T ' - >ε)= FIRST(ε) - {ε} UFOLLOW(T')=フォロー(T ')= {+、)、#}
SELECT(F - >(E))= FIRST((E))= {(}
SELECT(F-> I)=最初の(I)= {I}
再帰下降構文解析:
ボイドパーシー(){
スイッチ(ルックアヘッド){
ケース '('、 'I':
Frset();
パーシー '();
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドパーシー '(){
スイッチ(ルックアヘッド){
場合 '+':
マッチトークン( '+');
Frset();
パーシー '();
ブレーク;
ケース ')'、 '#':
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドPARSET(){
スイッチ(ルックアヘッド){
ケース '('、 'I':
ParseF();
Frset「();
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドPARSET '(){
スイッチ(ルックアヘッド){
ケース '*':
マッチトークン( '*');
ParseF();
Frset「();
ブレーク;
場合 '+'、 ')'、 '#':
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドParseF(){
スイッチ(ルックアヘッド){
ケース '(':
マッチトークン( '(');
パーシー();
マッチトークン( ')');
ブレーク;
ケース 'I':
マッチトークン(「中」);
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
字句解析を追加4.実験では、パーサは、任意の入力記号列が有効な式ではありません分析し、実行を形成することができます。