구문 해석
수식을 해석할 때는 연산자의 우선순위를 고려해야 되는 것처럼
소스코드는 여러 가지 다양한 방법으로 해석되어야 한다.
구문해석 => ( 어휘 해석, 구문 해석 )
어휘해석(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 ) 마디, 교점, 정점, 기능의 단위
'잡동사니 > 컴파일러' 카테고리의 다른 글
[컴파일러 구조와 원리] - TOKEN (0) | 2015.12.31 |
---|---|
[컴파일러 구조와 원리] - 어휘 해석 (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 파서 제네레이터 (Parser Generator) (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 컴파일의 4단계 (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 컴파일의 과정 (0) | 2015.12.31 |