어휘 분석기: 어휘 단위와 토큰
sum이 한 덩어리라는 것을 컴퓨터는 어떻게 알까?
끊기
소스는 글자 한 줄입니다
컴퓨터가 받는 소스는 글자가 한 줄로 늘어선 것입니다. 어휘 분석기는 이것을 앞에서부터 읽어 뜻이 있는 조각으로 끊습니다. 1강과 2강에서 어휘 단위(lexeme)라고 부른 것이 이 조각입니다. 원어대로 렉심이라고도 합니다.
빈칸은 어휘 단위가 아닙니다. 조각 사이를 띄울 뿐이어서 건너뜁니다.
종류 붙이기
조각마다 종류가 붙습니다
어휘 단위가 어떤 종류인지를 나타내는 것이 토큰(token)입니다. sum과 total은 글자가 달라도 둘 다 식별자(identifier), 곧 변수나 함수에 붙인 이름입니다. 파서는 글자가 아니라 이 종류를 봅니다.
정수 리터럴(integer literal)은 코드에 직접 적은 정수입니다. 번호는 교재의 예제 프로그램이 토큰에 매긴 것입니다.
패턴 매칭
종류는 생김새의 패턴으로 가립니다
어휘 분석기는 패턴 매처(pattern matcher)입니다. 토큰마다 정해 둔 글자 패턴이 있고, 거기에 맞는 글자 묶음을 찾아냅니다. 글자로 시작하면 식별자, 숫자만 이어지면 정수 리터럴입니다.
x2는 설명을 위해 만든 예시입니다.
일하는 때
파서가 부를 때마다 하나씩 줍니다
어휘 분석기는 소스를 미리 다 끊어 두지 않습니다. 파서가 다음 토큰이 필요할 때마다 부르는 함수입니다. 부를 때마다 어휘 단위 하나를 읽어 그 토큰을 돌려줍니다.
교재의 예제 코드에서는 이 함수의 이름이 lex입니다. 입력이 끝나면 끝을 뜻하는 토큰(번호 -1)을 돌려줍니다.
만드는 길
어휘 분석기를 만드는 세 가지 길
토큰의 패턴을 형식에 맞춰 적어 도구에 맡길 수 있습니다. 아니면 상태 다이어그램(state diagram), 곧 글자를 읽을 때마다 어디로 옮겨 가는지를 그린 그림을 만들고, 그것을 프로그램이나 표로 옮깁니다.
표를 보고 움직이게 만든 것을 테이블 구동(table-driven) 방식이라고 합니다.
다음 편