lex 와 yacc 을 이용한 calculator 구현

17
Lex 와 Yacc 와 와와와 Calculator 와와 부부부부부 부부∙부부부 부부 부부 2007-2 부부 부부부부 2007.09.06

Upload: charde-wilkinson

Post on 30-Dec-2015

124 views

Category:

Documents


2 download

DESCRIPTION

Lex 와 Yacc 을 이용한 Calculator 구현. 부산대학교 정보∙컴퓨터 공학 전공 2007-2 학기 컴파일러 2007.09.06. The rest of process. source program. ‘Lex’ 를 이용하여 생성. lexical analyzer. syntax analyzer. ‘Yacc’ 을 이용하여 생성. semantic analyzer. symbol-table manager. error handler. intermediate code generator. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lex 와  Yacc 을 이용한  Calculator  구현

Lex 와 Yacc 을 이용한 Calculator 구현

부산대학교정보 컴퓨터 공학 전공∙2007-2학기 컴파일러

2007.09.06

Page 2: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

The rest of process

intermediatecode generator

source program

target program

semanticanalyzer

syntaxanalyzer

lexicalanalyzer

codeoptimizer

codegenerator

errorhandler

symbol-tablemanager

‘Lex’를이용하여 생성

‘Yacc’ 을이용하여 생성

Page 3: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex 를 이용한 lexical analyzer 생성(1/3)

Page 4: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex 를 이용한 lexical analyzer 생성 (2/3) Lex의 input specification

- 정의 , 규칙 , 사용자 부프로그램의 세 부분으로 이루어 짐 .

- 각 부분을 구별하는 구분자로 %% 를 사용 .

정의절- lexer 안에서 lex가 사용할 옵션을 처리하는 부분 .- 일반적으로 lexer가 작동하는 실행 환경을 설정 .- lexer 안으로 그대로 복사되는 C 코드는“ %{”과 “ %}”로

둘러쌈 .- 정의는 규칙 부분에서 사용됨 .

규칙절- lexer의 기능을 지정하는 패턴과 동작을 담고 있는 부분 .- reguiar expression(패턴 ) 과 그것과 매칭되었을 때

실행되는 동작 코드로 이루어 짐 .

Page 5: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex 를 이용한 lexical analyzer 생성 (3/3) 사용자 부프로그램

- 동작 코드를 작성할 때 사용되는 부프로그램들을 정의하기 위한 곳으로 lex의 출력인 lex.yy.c에 그대로 복사 .

- 반드시 입력의 끝을 만났을 때 처리를 해야하는 yywrap() 함수를 작성해야 함 .

Page 6: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Yacc 을 이용한 Syntax Analyzer 생성(1/2)

Page 7: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Yacc 을 이용한 Syntax Analyzer 생성(2/2) Yacc

- 사용자가 정의한 문법을 받아들여 그 문법에 맞는 “문장(sentences)”을 인식하는 syntax analyzer(parser) 생성

Yacc의 input specification- lex와 마찬가지로 정의 , 규칙 , 사용자 부프로그램으로 이루어

짐 .

정의- 문법에서 사용하는 토큰에 대한 선언 , 생성된 parser 내부의

스택에서 사용되는 다양한 값의 타입들을 담고 있음 .

규칙- parser를 위한 문법을 담고 있음

사용자 부프로그램- Yacc이 생성하는 parser에 그대로 복사되는 C 코드를 담고

있음 .

Page 8: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

lex 와 yacc 의 결합

Page 9: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex 와 Yacc 을 이용한 Calculator 구현 Yacc이 생성할 parser에 토근을 제공하기 위한 lex%{#include “calc.tab.h”extern int yylval;%}%%[0-9]+ { yylval = atoi(yytext); return NUMBER;}

[ \t]; \n return 0;\. return yytext[0];%%

정의

규칙

패턴 동작

Page 10: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex 와 Yacc 을 이용한 Calculator 구현 Calculator 문법을 가진 Yacc input specification%token NAME NUMBER%left '-' '+'%left '*' '/'%nonassoc UMINUS%%statement: NAME '=' expression

| expression{ printf("= %d\n", $1); };

expression: expression '+' expression { $$ = $1 + $3; }| expression '-' expression { $$ = $1 - $3; }| expression '*' expression { $$ = $1 * $3; }| expression '/' expression

{if($3 == 0)yyerror("divide by zero");

else$$ = $1 / $3;

}| '-' expression %prec UMINUS { $$ = -$2; }| '(' expression ')' { $$ = $2; }| NUMBER { $$ = $1; };

%%

정의

규칙

Page 11: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20051. Parser Generator 설치

- pargen.zip 의 압축을 푼다 .- [DISK1]의 설치 파일을 실행한다 .- 라이브러리 libcd.lib 을 C:\ParGen\LIB\MSDEV

폴더에 저장한다 .

Page 12: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20052. Visual Studio 2005의 프로젝트 생성

- 응용 프로그램 종류 : 콘솔 응용 프로그램- 추가옵션 : 빈프로젝트

Page 13: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20053. 디렉토리 ( 포함 , 라이브러리 , 소스 ) 환경설정

- [ 도구 ] > [옵션 ]- 디렉터리 표시 : [포함 파일 ] [c:\ParGen\INCLUDE] 추가- 디렉터리 표시 : [라이브러리 ] [c:\ParGen\LIB\MSDEV]

추가- 디렉터리 표시 : [소스파일 ] [c:\ParGen\SOURCE] 추가

Page 14: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20054. 프로젝트 환경 설정

- [ 구성속성 ] > [C/C++] > [전처리기 ] : YYDEBUG 추가- [ 구성속성 ] > [링커 ] > [입력 ] : 추가종속성에

yld.lib 추가

Page 15: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20055. Parser generator로 컴파일

- [Project] > [Compile File] 로 calc.y 컴파일 .- calc.c와 calc.h가 생성됨 .- calc.c -> calc.tab.c, calc.h -> calc.tab.h로

파일명 변경 lex 컴파일 결과와의 중복을 피하기 위해 변경 calc.tab.h는 lex에서 이용

- [Project] > [Compile File] 로 calc.l 컴파일 .- calc.c와 calc.h가 생성됨 .

Page 16: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

Lex/Yacc 사용법 – Visual Studio.NET 20056. Visual Studio로 컴파일

- calc.c, calc.h, calc.tab.c, calc.tab.h를 프로젝트에 추가

- 빌드 후 실행

Page 17: Lex 와  Yacc 을 이용한  Calculator  구현

Artificial Intelligence Laboratory

기타 Visual Studio 2003 환경에서도 동일 . Lex와 Yacc의 종류는 매우 많음 .

- GNU Bison & Flex : win32용도 있음 , 소스 코드 개방 .

- Abraxas Yacc & Lex : MS-DOS용 Pclex와 Pcyacc 포함 .

기타 문의 사항이 있을 경우- 인공지능 연구실 김민호- 전화 : 510-2875- E-mail: [email protected]

Lex와 Yacc에 대한 자료는 웹에 많이 있으므로 여러가지 자료를 참고한다면 어렵지 않을 것임