Skip to content

Instantly share code, notes, and snippets.

@Tatskaari
Created October 15, 2017 10:52
Show Gist options
  • Save Tatskaari/6347dc5a77c9ac850f70169726554a88 to your computer and use it in GitHub Desktop.
Save Tatskaari/6347dc5a77c9ac850f70169726554a88 to your computer and use it in GitHub Desktop.
sealed class Expression {
class Add(val lhs: Expression, val rhs: Expression) : Expression() {
override fun accept(visitor: IExpressionVisitor){
visitor.visit(this)
}
}
class Number(val num: Int): Expression() {
override fun accept(visitor: IExpressionVisitor){
visitor.visit(this)
}
}
abstract fun accept(visitor: IExpressionVisitor)
}
interface IExpressionVisitor{
fun visit(add: Expression.Add)
fun visit(num: Expression.Number)
}
class PrettyPrintExpressionVisitor : IExpressionVisitor {
override fun visit(add: Expression.Add){
add.lhs.accept(this)
print(" + ")
add.rhs.accept(this)
}
override fun visit(num: Expression.Number){
print(num.num)
}
}
class JVMExpressionVisitor : IExpressionVisitor {
override fun visit(add: Expression.Add){
add.lhs.accept(this)
add.rhs.accept(this)
println("iadd")
}
override fun visit(num: Expression.Number){
println("iload ${num.num}")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment