|
|
|
@ -238,7 +238,7 @@ class Parser(private val tokens: List<Token>) {
|
|
|
|
return Unary(operator, right)
|
|
|
|
return Unary(operator, right)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return primary()
|
|
|
|
return call()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun match(vararg types: TokenType): Boolean {
|
|
|
|
private fun match(vararg types: TokenType): Boolean {
|
|
|
|
@ -251,6 +251,36 @@ class Parser(private val tokens: List<Token>) {
|
|
|
|
return false
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun call(): Expr {
|
|
|
|
|
|
|
|
var expr = primary()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
|
|
|
if (match(LEFT_PAREN)) {
|
|
|
|
|
|
|
|
expr = finishCall(expr)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return expr
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun finishCall(callee: Expr): Expr {
|
|
|
|
|
|
|
|
val arguments: MutableList<Expr> = ArrayList()
|
|
|
|
|
|
|
|
if (!check(RIGHT_PAREN)) {
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
if (arguments.size >= 255) {
|
|
|
|
|
|
|
|
error(peek(), "Cannot have more than 255 arguments.")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
arguments.add(expression())
|
|
|
|
|
|
|
|
} while (match(COMMA))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val paren = consume(RIGHT_PAREN, "Expect ')' after arguments.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Call(callee, paren, arguments)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun primary(): Expr {
|
|
|
|
private fun primary(): Expr {
|
|
|
|
when {
|
|
|
|
when {
|
|
|
|
match(FALSE) -> return Literal(false)
|
|
|
|
match(FALSE) -> return Literal(false)
|
|
|
|
|