토큰화

나루 위키
둘러보기로 가기 검색하러 가기

토큰화 과정은 유니코드 스칼라 값의 열을 토큰열로 바꾸어 파싱 과정으로 넘긴다.

토큰화는 기본적으로 가장 긴 올바른 토큰을 찾는(maximal munching rule) 간단한 규칙으로 동작하지만, 두 가지 예외가 있다. 우선 문법 맥락에 따라 현재 시점에서 올바른 토큰의 목록이 늘어날 수 있다. 이렇게 늘어난 목록은 그 맥락을 감싸던 구획이 닫힐 때 원상 복귀된다.

{
    use comefrom (syntax label, syntax comefrom) -- 패키지로부터 예약어를 불러 오면
    comefrom foo -- 이제부터는 해당 예약어가 특수한 의미를 가지게 된다
    `comefrom` = "foo" -- ``로 감싼 이름으로 예약어를 보통 이름으로 쓸 수 있다
    #"Coming from #(`comefrom`)" println()
    label foo
}

label bar -- 오류: `label`은 더 이상 예약어가 아니다

또한 구획은 대응하는 구획에 따라 다르게 토큰화될 수 있다. 이미 지나간 여는 구획이 닫는 구획에 의해 쪼개질 수도 있다. (당연한 기술적 이유로, 실제로는 이 과정은 토큰화가 아니라 파싱 단계에서 일어난다.)

( (( a ))) -- `)))`는 `))`와 `)`로 나뉜다
(( ( a ))) -- `)))`는 `)`와 `))`로 나뉜다
((( a )))  -- `)))`는 하나의 토큰이다

(((a + b) + c) + d) -- `( ( (a + b) + c) + d)`와 같다
(a + (((b + c)) + d)) -- `(a + ( ((b + c)) + d) )`와 같다