본문 바로가기
프로그래밍 언어

[컴파일러] - 어휘 분석 (Lexical analysis) I

by CHML 2016. 1. 18.
1. 개요

컴파일러의 첫 번째 단계는 소스 코드를 정규 문법 (regular grammar)에 따라 토큰 (token)으로 분류하는 어휘 분석 또는 스캐닝 (scanning)이다. 예를 들어, "Lexical analysis is the first step of compiler"라는 문장에서 'L', 'e', 'x', 'i', 'c', 'a', 'l'을 따로 놓으면 어떠한 의미도 없지만, "Lexical"이라는 하나의 조각으로 보면 의미를 갖게 된다. 어휘 분석 단계에서 검출되는 의미 있는 조각을 어휘항목 (lexeme)이라고 하며, 어휘 분석기는 소스 코드에서 이러한 어휘항목을 검출하여 토큰을 생성한다.


2. 용어 정의

어휘 분석에서 사용하는 용어를 정의한다. 그러나 용어의 정의만으로는 용어가 갖는 의미를 이해하는데 난해한 부분이 있기 때문에 예시와 같이 서술한다.


  • 어휘항목 (lexeme): 소스 코드에 존재하는 의미있는 문자열, 식별자, 숫자, 키워드 등을 의미한다.

  • 패턴 (pattern): 토큰이 어휘항목을 서술하는 규칙으로써, 정규문법에 따라 표현된다.

  • 토큰 (token): 토큰이름과 속성값으로 구성되는 데이터쌍으로써, 각 토큰은 토큰의 패턴에 부합하는 어휘항목을 갖는다.


[표 1] 토큰과 각 토큰에 대한 어휘항목


위의 [표 1]에 나타나는 예시에서는 아래의 [표 2]와 같은 4개의 토큰과 각 토큰의 패턴이 존재한다. [표 2]의 토큰 패턴은 다소 모호하게 정의된 부분이 있으며, 실제 컴파일러에서는 정규문법을 이용하여 토큰의 패턴을 더욱 명확하게 정의한다. 토큰의 속성값은 아직 논의하기에 부족한 점이 있으므로 따로 정의하지 않고 그냥 attribute-value라고 명시한다.


[표 2] 토큰과 각 토큰에 대한 패턴


3. 어휘 오류 검출

어휘 오류라는 것은 소스 코드상에서 정의되지 않은 어휘항목이 발견되었을 때 발생하는 오류이다. 그러나 어휘 분석기가 독립적으로 어휘 오류를 검출하는 것은 매우 어렵거나 많은 비용이 소모된다. 예를 들어, 아래와 같은 코드가 있다.


if2(var == 5)


이 코드에서 어휘 분석기가 if2를 if의 잘못된 입력인지, if2라는 함수를 호출하는 구문인지 판단하는 것은 심볼 테이블을 참조해야 가능하다. 그렇기 때문에 어휘 분석기가 독립적으로 어휘 오류를 검출하기보다는 어휘 분석기는 심볼 테이블을 생성하고, 어휘 분석의 다음 단계인 구문 분석 (syntax analysis)에서 구문 분석기가 어휘 오류를 검출하는 것이 더욱 일반적이다.