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.
47 lines
1.3 KiB
Kotlin
47 lines
1.3 KiB
Kotlin
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<R> {")
|
|
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 <R> accept(visitor: ExprVisitor<R>): 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 <R> accept(visitor: ExprVisitor<R>): R {")
|
|
println(" return visitor.visit$name(this)")
|
|
println(" }")
|
|
println("}")
|
|
}
|