본문 바로가기
잡동사니/컴파일러

[컴파일러 구조와 원리] - 구문 해석( lexical analyze )

by 2KB 2015. 12. 31.

구문 해석

 

수식을 해석할 때는 연산자의 우선순위를 고려해야 되는 것처럼

소스코드는 여러 가지 다양한 방법으로 해석되어야 한다.

 

구문해석 => ( 어휘 해석구문 해석 )

 

어휘해석(lexical analyze)는 소스 코드를 단어로 분할하는 작업. oter. 스캔(scan)

ex) ‘ x = 1 + 2’ ==> ‘x’ ‘=’ ‘1’ ‘+’ ‘2’

어휘해석 담당 모듈을 어휘해석기(lexical analyzer) 또는 스캐너(scanner)라고 한다.


int main(int argc, char** argv)

{

printf(“Hello, World! \n”); // 인사

return 0;

}

int

main

(

int

argc

,

char

*

*

argv

)

{

printf

(

“Hello, World! \n”

)

;

return

0

;

}

*어휘해석 단계에서 공백 또는 코멘트는 버려진다.


의미값

Scanner는 소스코드를 단어로 분할 하고단어의 종류를 추출하거나 의미값을 추가한다.

의미값은 단어가 갖는 의미를 나타내는 값을 말합니다.


ex. 54 (문자열 54), “hello” (문자열 hello)

*예약어의 경우에는 별도의 의미 값이 필요 없다.


- Token

하나의 단어’, ‘단어의 종류’, ‘의미 값을 합쳐 토큰 (‘Token’) 이라 한다.


단어

종류

의미 값

int

예약어 int

-

main

식별자

“main”

(

(

-

int

예약어 int

-

argc

식별자

“argc”

,

,

-

char

예약어 char

-

*

*

-

*

*

-

argv

식별자

“argv”

)

)

-

 


추상 구문 트리와 노드

파서(Parser)스캐너가 생성한 토근열을 해석하고 대응되는 트리구조인 [구문 트리] (1) 를 생성하는데,

구문 트리에서세미콜론이나 괄호등 의미 없는 값을 생략한 [추상 구문 트리] (2) 를 생성한다.

[노드(node)] (3) 라고 하는 데이터 구조를 조합하여 만든다.



( 1 ) 파스 트리(Parse Tree) 라고도 한다.

( 2 ) 추상 구문트리(Abstract Syntax Tree)는 구문 트리의 변형된 형태로꼭 필요한 의미 정보만 갖는다.

( 3 ) 마디교점정점기능의 단위