Presentation is loading. Please wait.

Presentation is loading. Please wait.

제  3 장  Lex 사용하기.

Similar presentations


Presentation on theme: "제  3 장  Lex 사용하기."— Presentation transcript:

1 제  3 장  Lex 사용하기

2

3 3.1 Lex를 사용하여 어휘 분석기 만들기 이 lex는 구문 분석기에서 사용할 yacc이라는 유틸리티와 같이 사용
yacc는 파서 생성기인 C 함수로 된 yyparse( )를 생성 그림 3.1 lex와 yacc의 기능

4 3.1.1 Lex의 구조와 원시 코드 그림 3.2 정규 수식으로부터  어휘 분석기 생성

5 lex 원시 코드 만들기 그림 3.3 lex 원시 코드에서 lex.yy.c 생성

6 Lex 원시 코드 구조 %{ #include C 언어의 선언 Lex 정의부분 %} %%
         %{               #include                            C 언어의 선언                Lex 정의부분              %}              %% p1        { action1 }                /*  Lex 패턴과 액션 부분  */                p2        { action2 }                         ········                p3        { action3 }               %%              액션에 의하여 호출되는 C 언어 함수

7 숫자를 인식하는 Lex 원시 코드 예 %{ #include y.tab.h #include math.h
                              %{                                 #include y.tab.h                                 #include math.h                                 int constbl[100] ;                                 void insert_constbl();                                %}                                %% [0-9]+  {insert_constbl(atoi(yytext); return(INT);}                                [∖n∖t];                                . ;                                void insert_constbl(int digit)                                {                                     static  i = 0;                                     constbl[i++] = digit;                                }

8 생성한 어휘 분석 루틴 lex.yy.c #include y.tab.h #include math.h
           int constbl[100];            void insert_constbl();                · · ·            int yylex() {                switch()  {                   case 0 ; insert_constbl(atoi(yytext);                                return (INT);                   case 1 ; break;                   case 2 ; break;                  }                       · · ·            } void insert_constbl(int digit)            {             static j = 0 ;             sym[j++] = digit ;

9 3.1.1.1 Lex 원시 코드의 선언 부분 %{ #include y.tab.h #include math.h
                                %{                                 #include y.tab.h                                 #include math.h                                 int constbl[100] ;                                 void insert_constbl();                                %}

10 Lex 원시 코드의 패턴과 액션 부분        %%        패턴   액션        . %%

11 패턴과 액션의 전체적인 개념 예 %% [a-z]+ printf ("alpha∖n"); /* 영어 알파벳 문자를 인식한다 */
[0-9]+      printf ("numeric∖n");        /*  숫자를 인식한다  */ [a-z0-9]+ printf ("alphanumeric∖n");  /*영어 문자 다음에 숫자가 온다*/ [∖t]+      printf ("space∖n");            /*  빈칸을 인식한다  */   .          printf ("special character∖n");  /*  특수 문자를 인식한다  */ ∖n          ;                               /*  새로운 줄을 인식한다  */

12 상수를 테이블에 저장하는 액션 추가한 코드 %%
[a-z]+      printf ("alpha∖n"); /*  영어 알파벳 문자를 인식하는 패턴  */ [0-9]+     { printf ("numeric∖n");         /*  숫자를 인식하는 패턴  */    insert_constbl(atoi(yytext);  /*  인식한 숫자를 상수 테이블에 삽입 */                 return(INT); }                     [a-z0-9]+  printf ("alphanumeric∖n"); /* 영어 문자 다음에 숫자가 온다  */ [∖t]+      printf ("space∖n");       /*  빈칸을 인식하는 패턴  */   .          printf ("special character∖n"); /*  특수 문자를 인식하는 패턴  */ ∖n          ;                               /*  새로운 줄을 인식하는 패턴  */

13 실습 3.1 아래의 lex 원시 코드의 패턴과 액션에 대하여 “compiler xyz23 254” 가 연속으로 입력될 때의 결과를 보이시오.
   %%    [a-z]+      printf ("alpha∖n");                [0-9]+      printf ("numeric∖n");             [a-z0-9]+  printf ("alphanumeric∖n");         [∖t]+      printf ("space∖n");            .          printf ("special character∖n");      ∖n          ;                                   %%

14 Lex 원시 코드의 호출될 함수 부분 이 부분은 액션에서 호출하는 C 함수로 이루어지며 그대로 lex의 출력 파일인 lex.yy.c에 복사된다. main ( ) 함수도 이 부분에 있어야 한다. lex는 yacc와 같이 사용될 수도 있고 아닐 수도 있다.

15 3.1.2 Lex 원시 프로그램 예 %{ int i; double r; %} %% [0-9]+ {
[0-9]+           {                        sscanf  (yytext, "%d", &i);                         printf ("INTEGER∖n");                       } [0-9]+∖.[0-9]+?([eE][+-]?[0-9]+)?  {                                           sscanf (yytext, "%1f", &r);                                            printf ("REAL∖n");                                           } .                   ;          /*  그외...  */ main  ( ) {  yylex ( ); }

16 실습 3. 2 다음은 입력 파일을 읽어서 정수를 분리하는 lex 원시 코드이다. Lex 원시 코드의 파일을 "test
실습 3.2 다음은 입력 파일을 읽어서 정수를 분리하는 lex 원시 코드이다. Lex 원시 코드의 파일을 "test.l" 으로하고, 입력 파일을 "input.dat" 로 하여 아래와 같이 실행하여 결과를 관찰하시오.  >lex test.l  >cc lex.yy.c  -ll  >a.out < input.dat 입력 문장 파일: "input.dat" 의 내용         World2006  45960Korea CS         12345Programming system59023 abcde

17 Lex 원시 코드 파일 "test.l" 내용 %% [0-9]+ printf("%s ∖n", yytext);
       %%         [0-9]+    printf("%s ∖n", yytext);         "$"        exit(0);         [∖n∖b∖t] ;         .    ;         %%         main()         {          yylex();         }

18 실습 3. 3 C 프로그래밍 언어의 할당연산자(=), 산술연산자, 비교 연산자를 인식하는 lex 원시 코드를 작성하시오

19 3.3 Lex 실행하기 Lex 원시 코드를 작성하면 Unix 환경이나 MS-Windows 환경에서 lex 프로그램을 실행하여 어휘 분석기를 생성하여야 한다. Lex 프로그램을 실행하려면 두 단계가 필요하다.       단계 1: Lex를 사용하여 lex.yy.c 라는 파일을 만든다.       단계 2: 만들어진 lex.yy.c 파일 C 컴파일러로 컴파일한다. C 컴파일러를 통하면 lex 라이브러리를 연결하려면 아래와 같이 -ll 라는 옵션을 사용한다. input.dat는 입력 문자가 있는 파일이다.                 >lex test.l                 >cc lex.yy.c   -ll                 >a.out < input.dat

20 실습 3. 4 C 프로그래밍 언어의 식별자를 인식하는 Lex 원시 코드를 작성하고 실행하시오
실습 3.4 C 프로그래밍 언어의 식별자를 인식하는 Lex 원시 코드를 작성하고 실행하시오. 또 식별자를 인식하는 코드를 이용하여 예약어의 if, for, while 를 인식하는 Lex 원시 코드를 작성하고 실행하시오. 필요한 함수는 스스로 정의하시오.

21 실습 3. 5 아래 프로그램 일부에서 각 토큰을 분리하는 Lex 원시 코드를 작성하고 실행하시오
       switch(state)            {             case 0:                      {                       if (inchar == 'a') {                                    scanf(&inchar);                                    state = 1;                                   }                            else printf("error");                    }            }

22 제 3 장 끝


Download ppt "제  3 장  Lex 사용하기."

Similar presentations


Ads by Google