1. 문법 G (S)
(1) S -> AB
(2) A -> 다 | ε
(3) B -> CC
(4) C -> AADC | ε
(5) D -> B | ε
문법 G (S)는 LL (1) 문법 아니다 확인?
해결 방법 :
A-> 다
A-> ε
C-> AADC
C-> ε
D-> B
D-> ε
FIRST 集 :
최초의 (다) = {B, A}
최초의 (E) = E {}
첫 번째 (AADC) = {A}
우선, (B) = {B}
FOLLOW 集 :
따라 (A) = {C, B, A, #}
에 따라 (C) = {#}
에 따라 (D) = {A, #}
SELECT 세트 :
선택 (A-> 다) = {B, A}
선택 (A-> ε) = {C, B, A, #}
선택 (C-> AADC) = {A}
선택 (C-> ε) = {#}
선택 (D-> B) = {B}
선택 (D-> ε) = {A, #}
따라서 얻을 수 : 선택 (A-> 다) ∩ 선택 (A-> ε) ≠ ∅
선택 (C-> AADC) ∩ 선택 (C-> ε) = ∅
(D-> B) ∩ 선택 (D-> ε) = ∅를 선택
따라서 문법을 정의 LL (1) 문법은 LL (1) 구문 아니다.
식 문법은 LL (1) 문법인지 왼쪽 재귀의 제거 후 2 (마지막 작업)?
해결 방법 :
왼쪽 재귀를 제거 :
(1) E-> TE '
E '-> + TE'| 전자
(2) T-> FT '
T '-> * FT'| ε
(3) F -> (E) | 내가
SELECT 세트 :
(E-> TE ') = 첫 번째 (TE')를 선택 = {(I}
= 먼저 (+ TE ') = {+} - ('> + TE 'E)을 선택
(E 선택 '-> 전자) = (우선 (E) = {E}) ∪Follow (E') = {), #}
(T-> FT ') = 첫 번째 (FT')를 선택 = {(I}
(T '-> * FT') 선택 = 우선 (+ TE ') =를 {*}
(T 선택 '-> ε)를 = (우선 (ε) = {ε}) ∪Follow (T') = {+,), #}
선택 (F -> (E)) = 첫 번째 ((E)) = {(}
선택 (F-> I) = 먼저 (I) = {난}
따라서 얻을 수 있고, 선택 (E '-> + TE') ∩ 선택 (E '-> ε) = ∅
∩ 선택 - ( '> * FT'T)를 선택 (T '를 -> ε) = ∅
선택 (F -> (E)) ∩ 선택 (F-> I) = ∅
문법에 의해 정의 된 (1) 문법 그래서 LL LL (1) 구문이다.
제 2 연결,이 LL 인 경우 (1) 문법 그 재귀 하강 파서 코드 물품.
이자형()
{티();
이자형'();
}
이자형'()
티()
티'()
에프()
보이드 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. 실험, 파서는 모든 입력 기호 문자열이 유효한 표현하지 분석, 실행을 형성 할 수있다.