재귀 하강 파서 (구문 분석)

 

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 (CC) = {C}

FIRST (AADC) = {A}

FIRST (b) = {B}

 

FOLLOW

FOLLOW (A) = {C, B, A, #}

其中# FOLLOW (A) = FOLLOW (C) = FOLLOW (B) = FOLLOW (S)

FOLLOW (B) = {#}

FOLLOW (C)} = {#

FOLLOW (D = {A, #}

 

SELECT 설정

SELECT (A-> 다) = FIRST (다) = {B, A}

SELECT (A-> ε) = FOLLOW (A) = {C, B, A, #}

SELECT는 (C-> AADC) = FIRST (AADC) = {A}

SELECT (C-> ε) = FOLLOW (C)} = {#

SELECT (D-> b) = FIRST (b) = {B}

SELECT (D-> ε) = FOLLOW (D) = {A, #}

 

이후 선택 (SELECT) (A-> 다) 선택 (SELECT) ( A-> ε- ) ≠ ∅

선택 (C-> AADC ) ∩ SELECT (C-> ε) =

SELECT (D-> b) SELECT (D-> ε) =

따라서, G (S)가 아닌 LL (1) 구.

 

 

 

 

 

 

 

 

 

 

2. ( 마지막 작업 ) 이 있는지 여부를 재귀 표현 문법 후 왼쪽 없애기 LL (1) 문법?

너무 왼쪽 재귀를 제거 :

E-> TE '

E '-> + TE'| 전자

T-> FT '

T '-> * FT'| ε

F -> (E) | 내가

 

FIRST 集:

FIRST (TE ') = {(I}

FIRST (TE + ') = {+ , 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 '-> ε) = FIRST (ε) - {ε} U FOLLOW (E') = FOLLOW (E ') = {), #}

SELECT (T -> FT ') = 첫 번째 (FT') = {(I}

SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} *

SELECT (T '-> ε) = FIRST (ε) - {ε} U FOLLOW (T') = FOLLOW (T ') = {+), #}

SELECT (F -> (E)) = FIRST ((E)) = {(}

SELECT (F -> I) = FIRST (I) = {I}

 

SELECT (E '-> + TE') = 첫 번째 (+ TE ') = {+} ∩ SELECT (E'-> ε) = FOLLOW (E ') = {)} = #

SELECT (T '-> * FT') = 첫 번째 (* FT ') = {} ∩ SELECT * (T'-> ε) = FOLLOW (T ') = {+), #} =

SELECT (F -> (E)) = FIRST ((E)) = {(} SELECT (F -> I) = FIRST (I) = {I} =

따라서, 문법은 LL (1) 구.

 

 

 

 

 

 

 

3. 연결 , 그 경우, LL (1) 문법 그 재귀 하강 파서 코드 물품.

이자형()

    { T ();

       이자형'();

     }

이자형'()

티()

티'()

에프()

 

공허 ParseE ()

{       

         스위치 (내다) {

         경우 '(', 'I':

                  Frset ();

                  ParseE '()

단절;

태만:

의 printf ( "syntx 에러 \ n");

    출구 (0);

}

}

 

공허 ParseE '()

{

         스위치 (내다) {

                  경우 '+':

                            경기 토큰 (+);

                            Frset ();

                            ParseE '();

                            단절;

       케이스 ')', '#'

                            단절;

태만:

의 printf ( "syntx 에러 \ n");

                 출구 (0);

 

}

}

 

공허 ParseT ()

{       

         스위치 (내다) {

         경우에 '(', 'I'

                  ParseF ();

                  Frset '();

                  단절;

태만:

의 printf ( "syntx 에러 \ n");

        출구 (0);

 

}

 

}

공허 ParseT '()

{       

         스위치 (내다) {

          경우 '*':

                   경기 토큰 (*);

                   ParseF ();

                   Frset '();

                   단절;

         경우 '+', ')', '#':

                   단절;

태만:

의 printf ( "syntx 에러 \ n");

        출구 (0);

 

}

}

보이드 ParseF () {

  스위치 (룩어) {

        경우 '(':

                경기 토큰 ( '(');

                ParseE ();

                경기 토큰 ( ')');

                단절;

        경우 'I':

               ( '에서') 일치 토큰;

               단절;

        태만:

              의 printf ( "syntx 에러 \ n");

                출구 (0);

    }

}

 

 

추천

출처www.cnblogs.com/zhff/p/11897801.html