컴파일러_Compiler

[Compiler]어휘분석_Lexical Analysis

vhxpffltm 2019. 6. 6. 22:07

본 내용은 아래의 출처에서 본것이고 허락을 맡고 포스트한다.

 

출처 : https://talkingaboutme.tistory.com/category/About%20Study/Compiler

 

 

 

먼저, 컴파일의 단계를 정리하면, 

 

어휘분석(스캐닝) -> 구문분석(파싱) -> 의미분석(타입검사) -> 중간코드생성기-> 최적화-> 코드생성-> 종속코드 최적화

 

위와 같다. 첫 번째 단계인 어휘분석에 대해 정리해보자

 

어휘 분석이란 컴파일러를 통해 어휘나 규칙을 정해, code stream을 구분하는 요소를 Lexeme(어휘소)라고함.
컴파일러가 기본적으로 수행하는 작업 중 하나

 

code stream -> Lexical Analysis -> Token stream

 

예시:

#include

int main(){
printf("aaa\n");               -> 문장 하나하나를 stream, 컴퓨터는 이 stream을 이해못함
return 0;                        뛰어쓰기 및 공백을 통해 단어별로 자름 -> 잘라진 단어가 Token
                                              -> 이 Token을 뽑아내는 것이 어휘 분석의 최종 목적
}

 

위의 code stream 첫 문장에서 "include", "<", ">" 와 같이 구분할 수 있다. 이 Token을 뽑아내는 것이 어휘분석이다.

 

사전에 정의된 토큰의 분류 : identifier, keywords, integer, operator, separators, whitespace, etx....


사전에 정해놓은 규칙이 바로 pattern이고 이를 토대로 lexeme을 뽑아냄. '드래곤 컴파일러' 에서는 patter과 Lexeme을 아래와 같이 정의한다.

 

Pattern : 토큰의 어휘항목이 가능하도록 정의한 규칙  _ rule defining the possible lexemes of a token
Lexeme : 토큰을 위한 패턴에 매칭되는 연속 문자  _ sequence of charaters that match the pattern for a token

 

Token의 형식  -  <Token name, Token과 관련한 정보>

 

ex) 위의 문장에서 "printf("aaa\n");

< id, printf >, 

< punctuation, ( >,   

< literal, "aaa\n" >, 

< punctuation, ) >, 

< punctuation, ; >

 

위와 같이 나누어진다. "  "와 같이 큰따움표의 내용은 'literal'로 구분하는게 patter에 정의되어있다.

 

이렇게 분류된 Token들은 하나의 Symbol Table로 정의되어 Syntax Analysis의 Parser가 사용하게 됨.
Paresr는 printf와 같은 구문을 발견하면 그에 해당하는 기능을 수행

 

이처럼 특정 문구를 보고 patter을 추출하는 여러가지 방법이 있다. 이 중 대표적으로 사용되는 것이 

Regulat Expression(정규 표현식) 이라 하며, 이를 추출해주는 Lex같은 프로그램이 있다.