제  3 장  Lex 사용하기.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

조건문, 함수 정대진 ( ) C Programming -3 일차 ITA 8 월 강의.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
C 언어 컴퓨터학과 C 언어 ( STS ) (Chap5. Selection-Making Decisions ) C 언어.
제6장 조건문.
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
어서와 Java는 처음이지! 제3장선택과 반복.
YACC 응용 예 Desktop Calculator.
Recursion SANGJI University KO Kwangman
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
제 8 장  파서 생성기 YACC 사용하기.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
C 6장. 함수 #include <stdio.h> int main(void) { int num;
제5장 제어명령
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
4장 어휘 / 구문 분석 (Term project 포함)
Chapter 13 문자 데이터와 문자열 문자 데이터 문자열.
7. while 문의 흐름 제어.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Department of Computer Engineering
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
프로그래밍 서울대학교 통계학과 2009년 2학기 컴퓨터의 개념 및 실습 (
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
Chapter 06. 선택문.
변수와 자료형.
1장. 프로그래밍 언어, C 프로그래밍.
제 3 장 상수와 변수
1주차: 프로그래밍언어란 무엇인가? C 언어란? C 프로그래밍을 위한 준비
4장 제어문 선택문: if 문, if – else 문, switch 문
제 11 장 전처리기.
adopted from KNK C Programming : A Modern Approach
13. 포인터와 배열! 함께 이해하기.
4. 어휘 분석(Lexical analysis)
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제어문 & 반복문 C스터디 2주차.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
CHAP 2:순환.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
처음으로 배우는 C 프로그래밍 제3부 함수 제 6 장 함수 작성.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
Chapter 11. 배열과 포인터.
[INA470] Java Programming Youn-Hee Han
자바 5.0 프로그래밍.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
4. 어휘 분석(Lexical analysis)
Department of Computer Engineering
-Part1- 제7장 반복문이란 무엇인가.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
C언어 개론.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
어서와 C언어는 처음이지 제16장.
C.
printf("Global Korea\n");
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Choi Younghwan CSE HUFS
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
11장. 1차원 배열.
Presentation transcript:

제  3 장  Lex 사용하기

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

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

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

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

숫자를 인식하는 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;                                }

생성한 어휘 분석 루틴 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 ;

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();                                %}

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

패턴과 액션의 전체적인 개념 예 %% [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          ;                               /*  새로운 줄을 인식한다  */

상수를 테이블에 저장하는 액션 추가한 코드 %% [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          ;                               /*  새로운 줄을 인식하는 패턴  */

실습 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          ;                                   %%

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

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 ( ); }

실습 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

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

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

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

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

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

제 3 장 끝