http://craftinginterpreters.com/scanning.html
인터프리터의 간단한 동작 단계는 scanning -> parsing -> evaluating code 로 말 할 수 있습니다. 4장에서는 이중 scanning에 대해 설명합니다.
다음과 같은 코드가 있다고 하면,
var language = "lox";
이 코드는 다음의 5개의 토큰으로 분할됩니다.
var, language, =, "lox", ;
이러한 개별 토큰들의 타입을 TokenType으로 분류합니다. 분류된 토큰들은 이후에 parsing 단계에서 사용되어야 하는데 그 때 필요한 정보들을 저장하고 있어야 하겠죠.
그래서, Token class를 만듭니다. 이 class는 다음의 정보들을 저장하고 있습니다.
type: 토큰의 타입(TokenType)
lexeme: 토큰 string
literal: 토큰의 값
line: 토큰이 있는 소스의 라인값으로 에러 표시에 사용합니다.
lexeme과 literal의 차이에 대한 예
"lox"의 경우 lexeme은 "lox"이고, literal은 "를 제외한 lox 이다.
1234 의 경우 lexeme은 1234이고, literal은 double값인 1234.0이다.
토큰을 나눌 때 주의사항
orchid의 경우 or과 chid로 분리할 것인가 orchid로 분리할 것인가: 긴 토큰으로 분리하는 형태로 한다. - maximal munch
댓글 없음:
댓글 쓰기