KOTLIN · 디자인패턴
인터프리터 패턴 (Interpreter)
DSL이나 간단한 언어의 문법을 해석하는 패턴입니다. sealed class로 AST를 정의하고 재귀적으로 평가합니다.
디자인패턴고급interpreterastdslexpression-evaluation
핵심 설명
DSL이나 간단한 언어의 문법을 해석하는 패턴입니다. sealed class로 AST를 정의하고 재귀적으로 평가합니다.
Kotlin code
sealed class Expr {
data class Num(val value: Int) : Expr()
data class Var(val name: String) : Expr()
data class BinOp(val op: String, val left: Expr, val right: Expr) : Expr()
data class Let(val name: String, val value: Expr, val body: Expr) : Expr()
}
typealias Env = Map<String, Int>
fun eval(expr: Expr, env: Env = emptyMap()): Int = when (expr) {
is Expr.Num -> expr.value
is Expr.Var -> env[expr.name] ?: throw RuntimeException("정의되지 않은 변수: ${expr.name}")
is Expr.BinOp -> {
val l = eval(expr.left, env)
val r = eval(expr.right, env)
when (expr.op) {
"+" -> l + r; "-" -> l - r
"*" -> l * r; "/" -> l / r
else -> throw RuntimeException("알 수 없는 연산: ${expr.op}")
}
}
is Expr.Let -> {
val v = eval(expr.value, env)
eval(expr.body, env + (expr.name to v))
}
}
fun main() {
// let x = 10 in (x + 5) * 2
val program = Expr.Let("x", Expr.Num(10),
Expr.BinOp("*",
Expr.BinOp("+", Expr.Var("x"), Expr.Num(5)),
Expr.Num(2)
)
)
println("결과: ${eval(program)}") // 30
// let a = 3 in let b = 4 in a * a + b * b
val pythagoras = Expr.Let("a", Expr.Num(3),
Expr.Let("b", Expr.Num(4),
Expr.BinOp("+",
Expr.BinOp("*", Expr.Var("a"), Expr.Var("a")),
Expr.BinOp("*", Expr.Var("b"), Expr.Var("b"))
)
)
)
println("피타고라스: ${eval(pythagoras)}") // 25
}학습 팁
sealed class로 AST를 정의하면 when에서 모든 노드 타입을 빠짐없이 처리할 수 있습니다.
주의할 점
인터프리터 패턴은 복잡한 문법에는 적합하지 않습니다. 문법이 복잡하면 ANTLR 등 파서 생성기를 사용하세요.
자주 묻는 질문
인터프리터 패턴 (Interpreter)란 무엇인가요?
DSL이나 간단한 언어의 문법을 해석하는 패턴입니다. sealed class로 AST를 정의하고 재귀적으로 평가합니다.
인터프리터 패턴 (Interpreter) 학습 시 주의할 점은 무엇인가요?
인터프리터 패턴은 복잡한 문법에는 적합하지 않습니다. 문법이 복잡하면 ANTLR 등 파서 생성기를 사용하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.