1. 문법 G ( S ) :
( 1 ) S -> AB
( 2 ) A -> 다 | ε
( 3 ) B -> CC
( 4 ) C -> AADC | ε
( 5 ) D -> B | ε
문법 확인 G ( S가 ) 아니다 LL ( . 1 ) 문법?
FIRST 集
FIRST (다) = {B, A}
FIRST (E) = E {}
FIRST (CC) = {C}
FIRST (AADC) = {A}
FIRST (b) = {B}
FOLLOW 集
FOLLOW (A) = {C, B, A, #}
其中# 是FOLLOW (A) = FOLLOW (C) = FOLLOW (B) = FOLLOW (S)
FOLLOW (B) = {#}
FOLLOW (C)} = {#
FOLLOW (D = {A, #}
SELECT 설정
SELECT (A-> 다) = FIRST (다) = {B, A}
SELECT (A-> ε) = FOLLOW (A) = {C, B, A, #}
SELECT는 (C-> AADC) = FIRST (AADC) = {A}
SELECT (C-> ε) = FOLLOW (C)} = {#
SELECT (D-> b) = FIRST (b) = {B}
SELECT (D-> ε) = FOLLOW (D) = {A, #}
이후 선택 (SELECT) (A-> 다) ∩ 선택 (SELECT) ( A-> ε- ) ≠ ∅
선택 (C-> AADC ) ∩ SELECT (C-> ε) = ∅
SELECT (D-> b) ∩ SELECT (D-> ε) = ∅
따라서, G (S)가 아닌 LL (1) 구.
2. ( 마지막 작업 ) 이 있는지 여부를 재귀 표현 문법 후 왼쪽 없애기 LL (1) 문법?
너무 왼쪽 재귀를 제거 :
E-> TE '
E '-> + TE'| 전자
T-> FT '
T '-> * FT'| ε
F -> (E) | 내가
FIRST 集:
FIRST (TE ') = {(I}
FIRST (TE + ') = {+ , E}
FIRST (FT ') = {(I}
FIRST (* FT ') = {* ε}
FIRST ((E)) = {(}
FIRST (I) = {I}
FOLLOW 集:
FOLLOW (E) = {)} #
FOLLOW (E ') = {), #}
FOLLOW (T) = {+), #}
FOLLOW (T ') = {+), #}
FOLLOW (F) = {* +), #}
SELECT 세트 :
SELECT (E -> TE ') = 첫 번째 (TE') = {(I}
SELECT (E '-> + TE') = 첫 번째 (+ TE ')} = {+
SELECT (E '-> ε) = FIRST (ε) - {ε} U FOLLOW (E') = FOLLOW (E ') = {), #}
SELECT (T -> FT ') = 첫 번째 (FT') = {(I}
SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} *
SELECT (T '-> ε) = FIRST (ε) - {ε} U FOLLOW (T') = FOLLOW (T ') = {+), #}
SELECT (F -> (E)) = FIRST ((E)) = {(}
SELECT (F -> I) = FIRST (I) = {I}
SELECT (E '-> + TE') = 첫 번째 (+ TE ') = {+} ∩ SELECT (E'-> ε) = FOLLOW (E ') = {)} = # ∅
SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} ∩ SELECT * (T'-> ε) = FOLLOW (T ') = {+), #} = ∅
SELECT (F -> (E)) = FIRST ((E)) = {(} ∩ SELECT (F -> I) = FIRST (I) = {I} = ∅
따라서, 문법은 LL (1) 구.
3. 연결 이 , 그 경우, LL (1) 문법 그 재귀 하강 파서 코드 물품.
이자형()
{ T ();
이자형'();
}
이자형'()
티()
티'()
에프()
공허 ParseE ()
{
스위치 (내다) {
경우 '(', 'I':
Frset ();
ParseE '()
단절;
태만:
의 printf ( "syntx 에러 \ n");
출구 (0);
}
}
공허 ParseE '()
{
스위치 (내다) {
경우 '+':
경기 토큰 (+);
Frset ();
ParseE '();
단절;
케이스 ')', '#'
단절;
태만:
의 printf ( "syntx 에러 \ n");
출구 (0);
}
}
공허 ParseT ()
{
스위치 (내다) {
경우에 '(', 'I'
ParseF ();
Frset '();
단절;
태만:
의 printf ( "syntx 에러 \ n");
출구 (0);
}
}
공허 ParseT '()
{
스위치 (내다) {
경우 '*':
경기 토큰 (*);
ParseF ();
Frset '();
단절;
경우 '+', ')', '#':
단절;
태만:
의 printf ( "syntx 에러 \ n");
출구 (0);
}
}
보이드 ParseF () {
스위치 (룩어) {
경우 '(':
경기 토큰 ( '(');
ParseE ();
경기 토큰 ( ')');
단절;
경우 'I':
( '에서') 일치 토큰;
단절;
태만:
의 printf ( "syntx 에러 \ n");
출구 (0);
}
}