package fr.celticinfo.loxext import fr.celticinfo.lox.* class RpnPrinter : ExprVisitor { 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() } }