PHpullh
학습 라이브러리/Kotlin/인터프리터 패턴 (Interpreter)

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 등 파서 생성기를 사용하세요.