1.文法G(S):
(1)S - > AB
(2)A - >ダ|ε
(3)B - > CC
(4)C - > AADC |ε
(5)D - > B |ε
文法G(S)は、LL(1)文法ではない検証?
FIRST集
FIRST(AB)= {B、C}
FIRST(DA)= {B}
FIRST(E)= {E}
FIRST(CC)= {C}
FIRST(AADC)= {}
FIRST(B)= {B}
フォロー集
フォロー(S)= {C、B、}
フォロー(A)= {A、B、C、#}
フォロー(B)= {A、B、C}
フォロー(C)= {#}
フォロー(D)= {#}
選択セット
Sellect(A->ダ)= {B}
Sellect(A->ε)= {A、B、C、#}
式の文法は、LL(1)文法であるかどうか、左再帰を除去した後2.(最後のジョブ)?
1. SELECT(E '→+ TE')∩SELECT(E「→ε)=∅
SELECT(T '→* FT')∩SELECT(T '→ε)=∅
SELECT(F→(E))∩SELECT(F→I)=∅
だから、LL(1)文法であります
2.(A '→ABE)∩SELECT(A' →ε)=∅
SELECT∩SELECT(B-B '→' B)(B '→ε)=∅
だから、LL(1)文法であります
3.(S '→のBaS')∩SELECT(S '→ε)=∅
だから、LL(1)文法であります
4. SELECT(A→A)∩SELECT(A→ε)∩SELECT(A→CA)∩SELECT(A→AA)≠∅
だからではなく、LL(1)文法の
5. [(S-> AP)∩SELECT(S->ベクレル)=∅
SELECT(A-> A)∩SELECT(A-> CA)=∅
SELECT(B-> B)∩SELECT(B->デシベル)=∅
だから、LL(1)文法であります
それは、LL(1)文法であれば3接続2、その再帰下降構文解析コードを書きます。
E()
{T();
E '();
}
E '()
T()
T '()
F()
ソースコードは以下のとおりです。
ボイドパーシー(){
スイッチ(ルックアヘッド){
ケース '('、 'I':
Frset();
パーシー '();
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドパーシー '(){
スイッチ(ルックアヘッド){
場合 '+':
マッチトークン( '+');
Frset();
パーシー '();
ブレーク;
ケース ')'、 '#':
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドPARSET(){
スイッチ(ルックアヘッド){
ケース '('、 'I':
ParseF();
Frset「();
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドPARSET '(){
スイッチ(ルックアヘッド){
ケース '*':
マッチトークン( '*');
ParseF();
Frset「();
ブレーク;
場合 '+'、 ')'、 '#':
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}
ボイドParseF(){
スイッチ(ルックアヘッド){
ケース '(':
マッチトークン( '(');
パーシー();
マッチトークン( ')');
ブレーク;
ケース 'I':
マッチトークン(「中」);
ブレーク;
デフォルト:
印刷( "構文エラー\ nは");
出口(0);
}
}