feat(lexer): Scan dot
This commit is contained in:
parent
f72501fde2
commit
3e80aee0db
6 changed files with 67 additions and 33 deletions
|
@ -1,11 +1,44 @@
|
|||
package lexer
|
||||
|
||||
class Lexer {
|
||||
fun scan(source: String): List<Token> {
|
||||
if (source.isEmpty()) {
|
||||
return listOf(Token(TokenType.EOF, LexerPosition(1, 1, 0)))
|
||||
import java.util.LinkedList
|
||||
|
||||
class Lexer(private val source: String) {
|
||||
private var tokens: List<Token> = LinkedList()
|
||||
private val position: LexerPosition = LexerPosition(0, 0, 0)
|
||||
private var offset: Int = 0
|
||||
|
||||
fun scan(): List<Token> {
|
||||
while (hasNext()) {
|
||||
val token = scanToken()
|
||||
tokens += token
|
||||
}
|
||||
|
||||
return emptyList()
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue