어휘 분석 (lexical analysis)

컴퓨터과학·AI
한 줄 정의: 소스 코드의 문자열을 처음부터 훑으며 의미 있는 최소 단위인 토큰(식별자, 숫자, 연산자 등)으로 나누는 컴파일러의 첫 번째 처리 단계.

쉽게 풀면

어휘 분석은 컴파일러가 소스 코드를 처리하는 첫 단계로, 문자들의 연속된 나열을 의미 있는 단위인 '토큰'으로 잘라내는 작업이다. 예를 들어 'x = 10 + y'라는 코드는 어휘 분석을 거치면 '식별자 x', '대입 연산자', '숫자 10', '더하기 연산자', '식별자 y'라는 다섯 개의 토큰으로 나뉜다. 이렇게 나뉜 토큰들이 다음 단계인 구문 분석(파싱)의 입력으로 사용된다. 어휘 분석기는 보통 정규 표현식으로 정의된 패턴을 유한 오토마타로 변환하여 매우 빠르게 동작하도록 구현된다.

왜 중요한가

어휘 분석은 컴파일러와 인터프리터뿐 아니라 정적 분석 도구, 코드 포매터, 자연어 텍스트 전처리 파이프라인 등 문자열을 구조화된 단위로 다뤄야 하는 거의 모든 언어 처리 시스템의 출발점입니다. 이후 단계인 구문 분석과 의미 분석의 성능과 정확도가 토큰화 품질에 크게 좌우되기 때문에, 새로운 언어나 도메인 특화 언어(DSL)를 설계하는 논문에서 빠짐없이 다뤄지는 기초 단계입니다.

논문에서는 이렇게 쓰입니다

"본 컴파일러의 어휘 분석기는 유한 오토마타 기반으로 구현되어 소스 코드를 선형 시간에 토큰 스트림으로 변환한다."

컴파일러 파이프라인의 첫 단계로서 소스 코드를 토큰화하는 과정을 설명할 때 사용된다.

"제안된 도메인 특화 언어(DSL)의 어휘 분석기는 정규 표현식 기반 규칙 집합을 통해 사용자 정의 연산자와 예약어를 인식하도록 확장되었다."

새로운 프로그래밍 언어나 DSL을 설계하는 논문에서 언어 고유의 토큰 규칙을 정의할 때 사용된다.

"자연어 전처리 단계에서 어휘 분석에 해당하는 토큰화 과정을 통해 원시 텍스트를 형태소 단위의 토큰 시퀀스로 변환하였다."

자연어처리 연구에서 컴파일러 이론의 어휘 분석 개념을 텍스트 토큰화 과정에 유비적으로 적용할 때 인용된다.

조금 더 깊게 보면

어휘 분석기(렉서, lexer)는 흔히 정규 표현식으로 각 토큰 유형의 패턴을 정의하고, 이를 결정적 유한 오토마타(DFA)로 변환해 입력 문자열을 한 번만 훑으며 선형 시간에 토큰화하도록 구현됩니다. 최장 일치(maximal munch) 규칙에 따라 가능한 가장 긴 문자열을 하나의 토큰으로 인식하는 방식이 일반적이며, 이 과정에서 공백이나 주석처럼 이후 처리에 불필요한 부분을 걸러내는 역할도 함께 수행합니다.

주의할 점

어휘 분석은 문법적으로 올바른 토큰의 나열을 만들 뿐, 그 토큰들이 언어의 문법 규칙에 맞게 배열되었는지는 검사하지 않으며 이는 다음 단계인 구문 분석의 역할이다.

관련 용어