작업 11 LL (1) 문법이 결정되고, 재귀 하강 파서

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. 실험, 파서는 모든 입력 기호 문자열이 유효한 표현하지 분석, 실행을 형성 할 수있다.

추천

출처www.cnblogs.com/yeli1629/p/11895876.html