1. 문법 G (S)
(1) S -> AB
(2) A -> 다 | ε
(3) B -> CC
(4) C -> AADC | ε
(5) D -> B | ε
문법 G (S)는 LL (1) 문법 아니다 확인?
답변 :
증명 : FIRST (다) = {B, A}
FIRST (E) = E {}
FIRST (AADC) = {A}
FIRST (b) = {B}
FOLLOW (A) = {C, B, A, #}
FOLLOW (C) = {#}
FOLLOW (D) = {A, #}
SELECT (A -> 다) = FIRST (다) = {B, A}
SELECT (A -> ε) = FIRST (ε) - {ε} UFOLLOW (A) = FOLLOW (A) = {C, B, A, #}
∩ SELECT (A -> ε) ≠ Ø - SELECT (> 다 A) 이후
따라서, G (S)는 LL (1) 구문 아니다.
2. 좌측 순환 방식의 제거 후 발현 문법은 LL (1) 문법 여부?
A는 : 문법은 다음과 같습니다 (1) E -> TE '
(2) E '-> + TE'| 전자
(3) T -> FT '
(4) T '-> * FT'| ε
(5) F -> (E) | 나는
FIRST (+ TE ')} = {+
FIRST (E) = E {}
FIRST (* FT ') = {} *
FIRST ((E)) = {(}
FIRST (I) = {I}
FOLLOW (E ') = {), #}
FOLLOW (T ') = {+), #}
FOLLOW (F) = {* +), #}
SELECT (E '-> + TE') = 첫 번째 (+ TE ')} = {+
SELECT (E '-> E) = FIRST (E) - {E} UFOLLOW (E') = FOLLOW (E ') = {)} #
SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} *
SELECT (T '-> ε) = FIRST (ε) - {ε} UFOLLOW (T') = FOLLOW (T ') = {+), #}
SELECT (F -> (E)) = FIRST ((E)) = {(}
SELECT (F-> I) = FIRST (I) = {I}
SELECT (E '-> + TE') 이후 ∩ SELECT (E '-> ε) = Ø
SELECT (T '-> * FT') ∩ SELECT (T '-> ε) = Ø
SELECT (F -> (E)) ∩ SELECT (F -> I) = Ø
이 표현 문법은 LL (1) 문법입니다 그래서.
제 2 연결,이 LL 인 경우 (1) 문법 그 재귀 하강 파서 코드 물품.
이자형()
{티();
이자형'();
}
이자형'()
티()
티'()
에프()
A : SELECT 세트 :
SELECT (E-> TE ') = 첫 번째 (TE') = {(I}
SELECT (E '-> + TE') = 첫 번째 (+ TE ')} = {+
SELECT (E '-> E) = FIRST (E) - {E} UFOLLOW (E') = FOLLOW (E ') = {)} #
SELECT (T-> FT ') = 첫 번째 (FT') = {(I}
SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} *
SELECT (T '-> ε) = FIRST (ε) - {ε} UFOLLOW (T') = FOLLOW (T ') = {+), #}
SELECT (F -> (E)) = FIRST ((E)) = {(}
SELECT (F-> I) = FIRST (I) = {I}
재귀 하강 파서 :
보이드 ParseE () {
스위치 (룩어) {
경우 '(', 'I':
Frset ();
ParseE '();
단절;
태만:
( "구문 오류 \ n")을 인쇄;
출구 (0);
}
}
보이드 ParseE '() {
스위치 (룩어) {
경우 '+':
경기 토큰 ( '+');
Frset ();
ParseE '();
단절;
케이스 ')', '#':
단절;
태만:
( "구문 오류 \ n")을 인쇄;
출구 (0);
}
}
보이드 ParseT () {
스위치 (룩어) {
경우 '(', 'I':
ParseF ();
Frset '();
단절;
태만:
( "구문 오류 \ n")을 인쇄;
출구 (0);
}
}
보이드 ParseT '() {
스위치 (룩어) {
경우 '*':
경기 토큰 ( '*');
ParseF ();
Frset '();
단절;
경우 '+', ')', '#':
단절;
태만:
( "구문 오류 \ n")을 인쇄;
출구 (0);
}
}
보이드 ParseF () {
스위치 (룩어) {
경우 '(':
경기 토큰 ( '(');
ParseE ();
경기 토큰 ( ')');
단절;
경우 'I':
( '에서') 일치 토큰;
단절;
태만:
( "구문 오류 \ n")을 인쇄;
출구 (0);
}
}
어휘 분석기를 추가 4. 실험, 파서는 모든 입력 기호 문자열이 유효한 표현하지 분석, 실행을 형성 할 수있다.