작업 열한 --LL 1 문법 판단

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

 

추천

출처www.cnblogs.com/xiaolan-Lin/p/11887114.html
1LL