gradle: 8.4 and parser: lazy tokenization

This commit is contained in:
2023-10-13 08:56:04 -07:00
parent 5078f38f61
commit e96bcd8754
8 changed files with 59 additions and 11 deletions

View File

@ -0,0 +1,38 @@
package gay.pizza.pork.parser
class LazyTokenSource(val tokenizer: Tokenizer) : TokenSource {
private val queue = mutableListOf<Token>()
private var index = 0
override val currentIndex: Int
get() = index
override fun next(): Token {
index++
if (queue.isNotEmpty()) {
return queue.removeFirst()
}
return tokenizer.next()
}
override fun peek(): Token {
if (queue.isNotEmpty()) {
return queue.first()
}
val token = tokenizer.next()
queue.add(token)
return token
}
override fun peekTypeAhead(ahead: Int): TokenType {
wantAtLeast(ahead + 1)
return queue[ahead].type
}
private fun wantAtLeast(ahead: Int) {
if (queue.size < ahead) {
for (i in 1..ahead) {
queue.add(tokenizer.next())
}
}
}
}

View File

@ -14,6 +14,9 @@ interface TokenSource : PeekableSource<Token> {
return tokens
}
fun streamAllRemainingTokens(): TokenStream =
TokenStream(consumeAllRemainingTokens().filter { !TokenType.ParserIgnoredTypes.contains(it.type) })
fun ignoringParserIgnoredTypes(): TokenSource =
TokenStreamSource(TokenStream(consumeAllRemainingTokens().filter { !TokenType.ParserIgnoredTypes.contains(it.type) }))
TokenStreamSource(streamAllRemainingTokens())
}