열한번째 작업 : 분석 LL (1) 문법, 재귀 하강 파서

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

 

 

추천

출처www.cnblogs.com/zxf001/p/11896743.html