You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

36 lines
970 B
Kotlin

package fr.celticinfo.loxext
import fr.celticinfo.lox.*
class RpnPrinter : ExprVisitor<String> {
fun print(expr: Expr): String {
return expr.accept(this)
}
override fun visitBinary(binary: Binary): String {
return stack(binary.operator.lexeme, binary.left, binary.right)
}
override fun visitGrouping(grouping: Grouping): String {
return stack("", grouping.expression)
}
override fun visitLiteral(literal: Literal): String {
return literal.value?.toString() ?: "nil"
}
override fun visitUnary(unary: Unary): String {
return stack(unary.operator.lexeme, unary.right)
}
private fun stack(name: String, vararg exprs: Expr): String {
val builder = StringBuilder()
for (expr in exprs) {
builder.append(expr.accept(this))
if (name.isNotEmpty()) builder.append(" ")
}
builder.append(name)
return builder.toString()
}
}