Lexical Analysis 1 컴파일러 입문 제 4 장 어휘 분석. Lexical Analysis Page 2 목 차목 차목 차목 차 4.1 서론 4.2 토큰 인식 4.3 어휘분석기의 구현 4.4 렉스 (Lex)

Slides:



Advertisements
Similar presentations
Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
제 5 장 구문 정의  프로그래밍 언어의 기본 문자 집합  Alphabet 문자 (A-Z) 26 개 + 아라비아 숫자 (0 - 9) 10 개  예 ) Fortran : 기본 문자 집합 + 13 개의 특수문자 (=+ - * / ( ),. $ ‘ : 공백 ) Algol60.
컴퓨터와 인터넷.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
YACC 응용 예 Desktop Calculator.
3주 강의 Lexical Elements, Operators, and the C System
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
1. 컴파일러 개론 1-1. Compiler 정의 1-2. Language Processing System
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
유한 오토마타 Finite Automata
제  2 장  어휘 분석.
제 9 장 구조체와 공용체.
3장 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
어휘분석기 생성기 Lex.
Lex와 Yacc을 이용한 Calculator 구현
제3장 스택과 큐.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Lex와 Yacc을 이용한 Calculator 구현
6장. printf와 scanf 함수에 대한 고찰
14장. 포인터와 함수에 대한 이해.
공학컴퓨터프로그래밍 Python 염익준 교수.
자바 5.0 프로그래밍.
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
5. Context-free 문법 5-1. 서 론 5-2. 유도와 유도 트리 5-3. CFG표기법.
인터넷응용프로그래밍 JavaScript(Intro).
4. 어휘 분석(Lexical analysis)
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
제 9장 트랜스레이터.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
3. 정규 언어(Regular Language)
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 02. 자바 기본 문법.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
4. 어휘 분석(Lexical analysis)
Fucntion 요약.
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Flow Diagram IV While.
Lecture 02 프로그램 구조 및 문법 Kwang-Man Ko
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
함수, 모듈.
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
.Net FrameWork for Web2.0 한석수
제 4 장 Record.
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
어서와 C언어는 처음이지 제21장.
Presentation transcript:

Lexical Analysis 1 컴파일러 입문 제 4 장 어휘 분석

Lexical Analysis Page 2 목 차목 차목 차목 차 4.1 서론 4.2 토큰 인식 4.3 어휘분석기의 구현 4.4 렉스 (Lex)

Lexical Analysis Page 서 론  어휘분석  원시프로그램을 하나의 긴 문자열로 보고 차례대로 문자를 검사하여 문법적으로 의미 있는 최소의 단위로 분할 해내는 것  어휘분석기  Scanner  Lexer

Lexical Analysis Page 4  토큰  문법적으로 의미 있는 최소 단위 (terminal symbol) Token Number - 토큰들을 효율적으로 처리하기 위한 고유의 내부번호. Token Value 토큰이 프로그래머가 사용한 값을 가질 때 그 값을 말한다 명칭의 토큰값은 그 자신의 스트링 값 상수의 토큰값은 그 자신의 상수 값

Lexical Analysis Page 5 ex) if ( a > 10 )... Token Number : Token Value : 0 0 ‘ a ’

Lexical Analysis Page 6  토큰의 종류 일반 형태 특수 형태 명 칭 상 수 지정어 연산자기호 구분자 : stk, ptr, exp 등 : 526, 2.3, “string” 등 : begin, end, for, goto 등 : +, -, *, /, <, := 등 : ;,,, (, [, : 등

Lexical Analysis Page 7  Lexical Analyzer 와 Parser 의 관계  Scanner 는 Parser 가 token 이 필요할 때 호출하는 서브루틴 L.A.  Finite Automata. S.A.  Pushdown Automata.  Token type  scanner 가 parser 에게 넘겨주는 토큰 형태. (token number, token value) ex) if ( x > y ) x = 10 ; (32,0) (7,0) (4,x) (25,0) (4,y) (8,0) (4,x) (23,0) (5,10) (20,0)

Lexical Analysis Page 8  Symbol table  L.A 와 S.A 시 identifier 에 관한 정보를 수집하여 저장.  Semantic analysis 와 Code generation 시에 사용.  name + attributes ex) Hashed symbol table  chapter 12 참조

Lexical Analysis Page 토큰 인식  설계 시 주의사항  프로그래밍 언어의 각 토큰의 구조를 기술 할 때 이용되는 방법인 정규표현을 알고 있어야 하며, 이것들을 식별하기 위한 인식기가 필요한데, 인식기를 설계하는 방법인 상태 전이도와 유한 오토마타를 사용  상태전이도  유한 오토마타를 그림으로 표현한 흐름도로 어떤 모양의 토큰을 인식 할 수 있는지를 쉽게 알 수 있는 그림

Lexical Analysis Page 10  Character classification  letter : a | b | c... | z | A | B | C | … | Zl  digit : 0 | 1 | 2... | 9 d  special character : + | - | * | / |. |, |...

Lexical Analysis Page 명칭의 인식  Transition diagram  Regular grammar S  lA | _A A  lA | dA | _A | ε  Regular expression S = lA + _A = (l + _)A A = lA + dA + _A + ε = (l + d + _)A + ε = (l + d + _) *  S = (l + _)( l + d + _) *

Lexical Analysis Page 정수 상수의 인식  Form : 10 진수, 8 진수, 16 진수로 구분되어진다. 10 진수 : 0 이 아닌 수 시작 8 진수 : 0 으로 시작, 16 진수 : 0x, 0X 로 시작  Transition diagram n : non-zero digit o : octal digit h : hexa digit

Lexical Analysis Page 13  Regular grammar S  nA | 0B A  dA | ε B  oC | xD | XD | ε C  oC | ε D  hE E  hE | ε  Regular expression E = hE + ε = h*ε = h* D = hE = hh* = h + C = oC + ε = o* B = oC + xD + XD + ε = o + + (x + X)D = o + + (x + X)h + + ε A = dA + ε = d* S = nA + 0B = nd* + 0(o + + (x + X)h + + ε) = nd* o + + 0(x + X)h + ∴ S = nd* o + + 0(x + X)h +

Lexical Analysis Page 실수 상수의 인식  형태 : 고정소수점 수와 보동소수점 수  Transition diagram  Regular grammar S  dA D  dE | +F | -G A  dA |.B E  dE |ε B  dC F  dE C  dC | eD |ε G  dE

Lexical Analysis Page 15  Regular expression E = dE + ε = d * F = dE = dd * = d + G = dE = dd* = d + D = dE + '+'F + -G = dd * + '+'d + + -d + = d + + '+'d + + -d + = (ε + '+' +-)d + C = dC + eD + ε = dC+e(ε + '+' +-)d + + e = d * (e(ε + '+' +-) d + + ε) B = dC=dd * (e(ε + '+' +-)d + +ε) = d + +(e(ε + '+' +-) d + +ε) A = dA +.B = d *.d+(e(ε + '+' +-)d + + ε) S = dA = dd *. d + (e(ε + '+' +-) d + +ε) = d +.d + (e(ε + '+' +-) d + + ε) = d +.d + + d +.d + e(ε + '+' +-) d + 참고 Terminal + 를 ‘+' 로 표기.

Lexical Analysis Page 스트링 상수의 인식  Form : a sequence of characters between a pair of double quotes.  Transition diagram where, a = char_set - {", \} and c = char_set  Regular grammar S  "A A  aA | "B | \C B  ε C  cA

Lexical Analysis Page 17  Regular expression A = aA + " B + \C = aA + " + \cA = (a + \c)A + " = (a + \c)* " S = " A = "(a + \c)*" ∴ S = "(a + \c)* "

Lexical Analysis Page 주석의 처리  Transition diagram where, a = char_set - {*} and b = char_set - {*, /}.  Regular grammar S  /A A  *B B  aB | *C C  *C | bB | /D D  ε

Lexical Analysis Page 19  Regular expression C = *C + bB + /D = * * (bB + /) B = aB + ** * (bB + /) = aB + ** * bB + ** * / = (a + ** * b)B + ** * /= (a + ** * b) * ** * / A = *B = *(a + ** * b) * ** * /  S = /A = /* (a + ** * b) * ** * /  A program which recognizes a comment statement. do { while (ch != ' * ' ) ch = getchar(); ch = getchar(); } while (ch != ' / ' );

Lexical Analysis Page 어휘분석기의 구현  어휘분석기 설계방법  범용 프로그래밍 언어를 사용.  어휘분석 생성기 LEX 를 이용.  Programming vs. Constructing

Lexical Analysis Page 21  The Tokens of Mini C  Special symbols (30 개 ) !!=%=&& ()* *=+ +++=,--- -= //=;< >= []{ ∥ }  Reserved symbols (7 개 ) const else if int return void while  State diagram for Mini C-- pp  Mini C Scanner Source-- pp

Lexical Analysis Page LEX - A Lexical Analyzer Generator M.E. Lesk Bell laboratories, Murry Hill, N.J October, 1975

Lexical Analysis Page 23  정의  1975 년에 레스크에 의해 발표된 어휘분석기 생성기  기능  사용자가 정의한 정규 표현과 실행코드를 입력 받아 C 언어로  쓰여진 프로그램 출력 렉 스 어휘 분석기 일련의 토큰들입력 스트림 렉스 입력

Lexical Analysis Page 24  렉스의 입력 %{ 실행코드를 C 언어로 기술할 때 필요한 자료구조, 변수 상수 }% 이름 정의 부분 : 특정한 정규표현을 하나의 이름으로 정의하여 그 형태의 정규표현이 필요 할 때만 쓸 수 있도록 해주는 부분 % : 토큰의 형태를 표현하는 정규표현과 그 토큰이 인식되었을 때 처리할 행위를 기술하기 위한 부분인 실행코드 % : 렉스의 입력 작성시 사용되는 부 프로그램들을 정의

Lexical Analysis Page 25  렉스의 정규표현  렉스에서 사용되는 연산자 “ \ [ ] ^ - ?. * + | ( ) $ / { } %  “ : “ 사이에 있는 모든 문자는 텍스트문자로 취급 예 ) ( a “ * ” b = a * b )  ( a * b = a*b )  \ : 한 개의 문자를 에스케이프 하기 위하여 사용 예 ) XYZ “ ++ ”, “ XYZ++ ”, XYZ\+\+  [] : 문자들의 클래스를 정의하는데 사용 예 ) [abc] : a, b, c 중에서 한문자  - : 범위를 나타내는 연산자 문자 예 ) [a-z] : a 부터 z 사이의 문자 중에 한문자  ^ : 여집합을 표현 예 ) [^*] : * 를 제외한 모든 문자  \ : C 언어의 에스케이프 문자열로 간주 예 ) [ \t\n] : 공백, 탭, 개행 문자중의 하나

Lexical Analysis Page 26  * : 0 번 이상 반복을 의미 예 ) [a-zA-Z][a-zA-Z0-9]* : 변수 인식을 위한 정규표현  + : 한번 이상 반복 할 수 있음을 의미 예 ) [a-z]+ : 모든 소문자 문자열을 인식하는 정규표현  ? : 선택을 의미 예 ) ab?c : abc 또는 ac  | : 택일을 위한 연산자 예 ) (ab | cd) : ab 또는 cd (ab | cd+)?(ef)* : abefef, efefef, cdef, cddd

Lexical Analysis Page 27  ^ : 라인의 시작을 인식 예 ) ^abc : 라인의 시작에서 abc 가 있을 때만 토큰으로 처리  $ : 라인의 끝에서만 인식  / : 접미 문맥을 명시할 때 사용 예 ) ab/cd : ab 다음에 cd 가 이어서 있을 때만 ab 를 토큰으로 처리 . :. 는 newline 문자를 제외한 모든 문자들 예 ) “ - - ”.* : - - 부터 한 라인의 끝까지와 부합  {} : 정의된 이름을 치환식으로 확장 할 때 사용

Lexical Analysis Page 28  렉스의 실행코드  총괄변수와 함수  yyleng : 매칭된 문자열의 길이를 저장하고 있는 변수  yymore() : 현재 매칭된 문자열의 끝에 다음에 인식될 문자열이 덧붙여 지도록 하는 함수  yyless(n) : n 개의 문자만을 yytext 에 남겨두고 나머지는 다시 처리 하기 위하여 입력 스트림으로 되돌려 보내는 함수  input() : 입력 스트림으로부터 다음 문자를 읽는 함수  output(c) : 출력 스트림으로부터 문자 c 를 내보내는 함수  unput(c) : 함수 input() 에 의해 다시 읽혀지도록 문자 c 를 입력 스트림으로 되돌려 보내는 기능을 하는 함수  yywrap() : 렉스가 입력의 끝을 만났을 때 호출하는 함수 정상적인 경우에 복귀값은 1 이다.

Lexical Analysis Page 29  스캐너의 생성 및 동작  스캐너의 생성과정  렉스의 선택규칙  가장 길게 인식된 토큰을 우선으로 한다.  인식될 수 있는 토큰의 길이가 같은 경우 먼저 나타난 규칙의 정 규 표현으로 인식한다. lexcc lex.yy.c 렉스 입력스캐너 lex library