package lexer import java.util.LinkedList class Lexer(private val source: String) { private var tokens: List = LinkedList() private val position: LexerPosition = LexerPosition(0, 0, 0) private var offset: Int = 0 fun scan(): List { while (hasNext()) { val token = scanToken() tokens += token } tokens += Token(TokenType.EOF, position) return tokens } private fun scanToken(): Token { val c = peek() val token = when (c) { '.' -> Token(TokenType.DOT, position) else -> throw Error("Unknown symbol: $c", position) } offset++ position.column++ return token } private fun hasNext(): Boolean { return offset < source.length } private fun peek(): Char { if (!hasNext()) { throw Error("Unexpected end of input", position) } return source[offset] } }