어휘분석, 구문분석, 의미분석

chanto11

·

2021. 2. 9. 11:40

1. 어휘 분석 (Lexer)

컴파일러의 첫 번째 단계는 어휘 분석이라고 불린다.

이 단계는 단어들을 그룹화해서 소스 프로그램을 어휘소라고 불리는 의미있는 순서들로 만드는 것과 관련된다.

어휘소는 "정수", "식별자" 같은 토큰 클래스에 속한다.
<토큰 클래스, 속성 값> 형태의 토큰은 각 어휘소를 위해서 만들어진다.

어휘 분석은 또한 스캐닝이라고 불린다.

*토크나이징(tokenizing) - 문법적 의미를 갖는 코드의 최소 단위인 토큰들로 분해한다.

 

ex) printf("Hello World!\n");

< id, printf >, 

< punctuation, ( >,   

< literal, "Hello World!\n" >, 

< punctuation, ) >, 

< punctuation, ; >

2. 구문 분석 (parser)

컴파일러를 설계하는 두 번쨰 단계는 구문 분석이다.

어휘 분석기의 결과는 토큰들의 문법적 구조를 보여주는 표현을 생성하는데 사용된다.

구문 분석은 또한 파싱 이라고도 불린다. 프로그램이 구문적으로 올바른지 판단하기 위해.

 

종류 : 하양식 파서, 상향식 파서, 재귀 하강 파서(가장 많이 쓰임)

 

문법 구조를 따라 트리 형식으로 표현하는 syntax tree 또는 parse tree를 생성한다. 


3. 의미 분석 (semantic analysis)

의미 분석은 컴파일러의 마지막 단계이다.

이 단계 동안, 컴파일러는 의미 규칙들을 파서에 의해 구축된 구문 트리에 적용한다.

이 단계에서의 작업들은 컴파일러의 설계에 따라 다르지만, 일반적으로 형 검사, 범위 검사 그리고 객체 바인딩을 포함한다.

코드 생성을 위한 준비에서 심볼 테이블들 또한 구문 분석 때 만들어진다. 몇몇 경우들에서, 의미 분석은 구문 분석과 함께 수행된다.

 

ex) 지역변수, 전역변수 구별
    변수 선언, 참조 연결
    타입 검사
    ...