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
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()
|
|
}
|
|
}
|