
소스코드를 입력받아 처음으로 들어와 진행되는 과정이 어휘분석기 라는 것 까지는 이해 했다.
그렇다면 어휘 분석기는 어떠한 논리로 복잡하고 긴 내용의 코드를 토큰으로 변환할 수 있는 걸까?
해당 내용을 이해하기 위해 2.토큰화 작업의 핵심 개념 , 3.어휘 항목을 입력받는 방법 에 대한 이해가 먼저 필요하다.
𝑑𝑖𝑔𝑖𝑡 → [0-9]
𝑑𝑖𝑔𝑖𝑡𝑠 → 𝑑𝑖𝑔𝑖𝑡+
𝑛𝑢𝑚𝑏𝑒𝑟 → 𝑑𝑖𝑔𝑖𝑡𝑠 (. 𝑑𝑖𝑔𝑖𝑡𝑠)? ( E [+-]? 𝑑𝑖𝑔𝑖𝑡𝑠 )?
𝑙𝑒𝑡𝑡𝑒𝑟 → [A-Za-z]
𝑖𝑑 → 𝑙𝑒𝑡𝑡𝑒𝑟 ( 𝑙𝑒𝑡𝑡𝑒𝑟 | 𝑑𝑖𝑔𝑖𝑡 )*
𝑖𝑓 → if
𝑡ℎ𝑒𝑛 → then
𝑒𝑙𝑠𝑒 → else
𝑟𝑒𝑙𝑜𝑝 → < | > | <= | >= | = | <>
𝑤𝑠 → ( blank | tab | newline )+
해당 그림이 공식적인 토큰을 위한 패턴이다. 이러한 표현 방식을 우리는 정규 표현식이라고 부르며, 논리적인 단계에서 풀이가 가능한 형태라고 볼 수 있다.
정규 표현식은 다양한 패턴을 정의할 수 있어 복잡한 문자열 매칭이 가능하며, 간결하게 많은 규칙을 표현할 수 있으며, 논리적인 규칙이 명확하고 단순하기에 여러 환경에서 활용 할 수 있다. 즉 유연성,표현력,이식성이 모두 좋은 형태이다.
2.토큰화 작업의 핵심 개념 에서 나온 형태로도 인간이 어느정도 보기 편한 형태로 설명은 할 수 있지만 확실히 활용하거나 사용하기에 좋은 형태는 아니다.
정규 표현식은 매우 강력하지만, 복잡한 패턴을 정의할 경우 인간의 눈으로는 읽기 어려울 수 있으므로, 사용하는 목적에 맞게 간단하게 유지하는 것이 좋다.
위에서 정의된 그림에서 각 문장이 무슨 의미를 표현하는지 설명하도록 하겠다.
𝑑𝑖𝑔𝑖𝑡 → [0-9]
𝑑𝑖𝑔𝑖𝑡 이라는 토큰은 0부터 9까지의 숫자를 나타냅니다. 즉, 한 자리 숫자를 정의합니다.
𝑑𝑖𝑔𝑖𝑡𝑠 → 𝑑𝑖𝑔𝑖𝑡+
𝑑𝑖𝑔𝑖𝑡𝑠 토큰은 하나 이상의 𝑑𝑖𝑔𝑖𝑡으로 구성된 문자열을 나타냅니다. +는 1회 이상 반복을 의미합니다. 따라서 𝑑𝑖𝑔𝑖𝑡𝑠 0 이상의 숫자로 이루어진 수를 의미합니다.
𝑛𝑢𝑚𝑏𝑒𝑟 → 𝑑𝑖𝑔𝑖𝑡𝑠 (. 𝑑𝑖𝑔𝑖𝑡𝑠)? ( E [+-]? 𝑑𝑖𝑔𝑖𝑡𝑠 )?
이 문장은 조금 복잡해 보이는데 어렵게 생각할 필요 없다. 천천히 확인해보자.
𝑛𝑢𝑚𝑏𝑒𝑟 토큰은 다음과 같은 형식을 가질 수 있다.
𝑑𝑖𝑔𝑖𝑡𝑠 : 정수 부분
(. 𝑑𝑖𝑔𝑖𝑡𝑠)? : 소수점 이하 부분 (선택적)
( E [+-]? 𝑑𝑖𝑔𝑖𝑡𝑠 )? : 지수 부분 (선택적)
예를 들어, 123, 45.67, 8E+10 등이 모두 유효한 𝑛𝑢𝑚𝑏𝑒𝑟가 된다.
𝑙𝑒𝑡𝑡𝑒𝑟 → [A-Za-z]
letter는 알파벳 대문자(A-Z)와 소문자(a-z)를 포함한 문자입니다. 즉, 영문자 하나를 의미합니다.
𝑖𝑓 → if
𝑡ℎ𝑒𝑛 → then
𝑒𝑙𝑠𝑒 → else
𝑖𝑓,𝑡ℎ𝑒𝑛,𝑒𝑙𝑠𝑒 는 모두 키워드로, 정확히 문자열 if,then,else 와 일치해야 하는 키워드입니다. 3가지 키워드 모두 조건문에서 사용됩니다.
𝑟𝑒𝑙𝑜𝑝 → < | > | <= | >= | = | <>
𝑟𝑒𝑙𝑜𝑝 는 관계 연산자를 정의하여, 해당 모든 기호의 표현식이 𝑟𝑒𝑙𝑜𝑝 토큰으로 정의됩니다.
𝑤𝑠 → ( blank | tab | newline )+
𝑤𝑠 는 특수한 토큰이다. 어휘 분석기에게 여백을 제거하는 작업을 할당하여 , blank,tab 과 newline은 같은 이름의 𝐴𝑆𝐶𝐼𝐼 문자를 표시하기 위해 사용하는 추상적인 기호이다.
토큰 𝑤𝑠 는 인식될 때 파서에게 반환되지 않지만 어휘 분석을 여백 다음에 오는 문자부터 다시 시작한다는 관점에서 다른 토큰과는 다르다. 파서에게 반환하는 토큰은 다음 토큰이 된다.
구체적으로 정의해보자면, 하나 이상의 공백 문자 (스페이스,탭,줄바꿈)이 연속적으로 나타나는 경우를 매칭하여 이와 같은 문자열들이 이 패턴에 해당된다.
𝑟𝑒𝑙𝑜𝑝 → < | > | <= | >= | = | <>
𝑖𝑑 → 𝑙𝑒𝑡𝑡𝑒𝑟 ( 𝑙𝑒𝑡𝑡𝑒𝑟 | 𝑑𝑖𝑔𝑖𝑡 )*
𝑛𝑢𝑚𝑏𝑒𝑟 → 𝑑𝑖𝑔𝑖𝑡𝑠 (. 𝑑𝑖𝑔𝑖𝑡𝑠)? ( E [+-]? 𝑑𝑖𝑔𝑖𝑡𝑠 )?
어휘 분석기는 입력을 스캔하여 해당 패턴과 일치하는 문자열을 발견하면, 이를 단순히 "식별자"라는 토큰 유형으로만 분류하지 않습니다. 대신, 이 토큰에 속성 값(attribute value) 을 추가로 부여하여 해당 식별자가 구체적으로 어떤 것인지를 나타냅니다. 이 속성 값은 보통 심볼 테이블(symbol table) 항목을 가리키는 포인터나 참조로 구현됩니다.
x12 y34 z_ab
이들 세 개의 문자열(x12, y34, z_ab)은 모두 동일한 𝑖𝑑 토큰 유형을 가지지만, 속성 값을 통해 각각 고유하게 관리됩니다. 아래 그림의 속성 값은 예시 입니다.
| 어휘항목 | 토큰 이름 | 속성 값 |
|---|---|---|
| x12 | id | varriable_array |
| x34 | id | function |
| z_ab | id | varriable_int |
요약하자면, 속성 값(attribute value) 은 어휘 분석기가 단순히 토큰을 분류하는 것을 넘어, 각 토큰에 고유한 의미를 부여하고 이를 관리할 수 있도록 해주는 중요한 메커니즘입니다. 이를 통해 단일 토큰 유형 내에서도 여러 식별자를 효과적으로 다룰 수 있습니다.