import java.util.* val types = listOf( "Binary : Expr left, Token operator, Expr right", "Grouping : Expr expression", "Literal : Any? value", "Unary : Token operator, Expr right" ) println("package fr.celticinfo.lox") println() println("interface ExprVisitor {") for (type in types) { val parts = type.split(":") val name = parts[0].trim() println(" fun visit$name(${name.lowercase(Locale.getDefault())}: $name): R") } println("}") println() println("""/** * The Expr class represents the different types of expressions that can be parsed by the Parser. */""".trimIndent()) println("sealed class Expr {") println(" abstract fun accept(visitor: ExprVisitor): R") println("}") for (type in types) { val parts = type.split(":") val name = parts[0].trim() val fields = parts[1].trim().split(",").map { it.trim() } println() println("data class $name(") for (field in fields) { val fparts = field.split(" ") val ftype = fparts[0] val fname = fparts[1] val sep = if (field == fields.last()) "" else "," println(" val $fname: $ftype$sep") } println(") : Expr() {") println(" override fun accept(visitor: ExprVisitor): R {") println(" return visitor.visit$name(this)") println(" }") println("}") }