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 (AADC) = {A}
FIRST (b) = {B}
FOLLOW 集 :
FOLLOW (A) = {C, B, A, #}
FOLLOW (C) = {#}
FOLLOW (D) = {A, #}
SELECT 세트 :
SELECT (A-> 다) = FIRST (다) = {B, A}
SELECT (A-> ε) = FIRST (ε) - {ε} UFOLLOW (A) = FOLLOW (A) = {C, B, A, #}
해결 방법 :
SELECT (A-> 다) ∩ SELECT (A-> ε) ≠ Ø
이는 G (S)는 LL (1) 구문없는 것으로 나타났다.
식 문법은 LL (1) 문법인지 왼쪽 재귀의 제거 후 2 (마지막 작업)?
왼쪽 재귀를 제거 :
E -> TE '
E '-> + TE'| 전자
T -> FT '
T '-> * FT'| ε
F -> (E) | 나는
FIRST 集 :
FIRST (TE ') = {(I}
FIRST (+ TE ')} = {+
FIRST (E) = 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 '-> 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}
해결 방법 :
SELECT (E '-> + TE') ∩ SELECT (E '-> ε) = O
SELECT (T '-> * FT') ∩ SELECT (T '-> ε) = Ø
SELECT (F -> (E)) ∩ SELECT (F-> I) = Ø
따라서, 좌측 순환 식 문법의 제거 이후 LL (1) 문법이다.
제 2 연결,이 LL 인 경우 (1) 문법 그 재귀 하강 파서 코드 물품.
이자형()
{티();
이자형'();
}
이자형'()
티()
티'()
에프()
코드 :
보이드 ParseE () {
스위치 (룩어) {
경우에 '(', 'I', '*':
Frset ();
ParseEP ();
단절;
태만:
( "syntx 오류 \ n!") 인쇄;
출구 (0);
}
}
보이드 ParseEP () {
스위치 (룩어) {
경우 '+':
경기 토큰 ( '+');
Frset ();
ParseEP ();
단절;
경우 '#', ')':
단절;
태만:
( "syntx 오류 \ n!") 인쇄;
출구 (0);
}
}
보이드 ParseT () {
스위치 (룩어) {
경우 '(', 'I':
ParseF ();
ParseTP ();
단절;
태만:
( "syntx 오류 \ n!") 인쇄;
출구 (0);
}
}
보이드 ParseTP () {
스위치 (룩어) {
경우 '*':
경기 토큰 ( '*');
ParseF ();
ParseTP ();
단절;
경우 '#', ')', '+':
단절;
태만:
( "syntx 오류 \ n!") 인쇄;
출구 (0);
}
}
보이드 ParseF () {
스위치 (룩어) {
경우 '(':
경기 토큰 ( '(');
ParseE ();
경기 토큰 ( ')');
단절;
경우 'I':
( '에서') 일치 토큰;
단절;
태만:
( "syntx 오류 \ n!") 인쇄;
출구 (0);
}
}
어휘 분석기를 추가 4. 실험, 파서는 모든 입력 기호 문자열이 유효한 표현하지 분석, 실행을 형성 할 수있다.