Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

κ°œμš”

μ–΄λ–€ 언어에 λŒ€ν•΄, κ·Έ μ–Έμ–΄μ˜ 문법에 λŒ€ν•œ ν‘œν˜„μ„ μ •μ˜ν•˜λ©΄μ„œ 그것(ν‘œν˜„)을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μ–Έμ–΄λ‘œ 기술된 λ¬Έμž₯을 ν•΄μ„ν•˜λŠ” ν•΄μ„μžλ₯Ό ν•¨κ»˜ μ •μ˜ν•œλ‹€.

동기

νŠΉμ •ν•œ μ’…λ₯˜μ˜ λ¬Έμ œκ°€ 자주 λ°œμƒν•  λ•ŒλŠ”, μ–΄λ–€ κ°„κ²°ν•œ μ–Έμ–΄λ₯Ό μ¨μ„œ κ·Έ 문제λ₯Ό λ¬Έμž₯으둜 ν‘œν˜„ν•˜λŠ” 것이 λ‚˜μ„ 수 μžˆλ‹€. 그리고 λ‚˜μ„œ κ·Έ λ¬Έμž₯을 ν•΄μ„ν•˜λŠ” ν•΄μ„μžλ₯Ό λ§Œλ“€μ–΄ λ¬Έμž₯을 ν•΄μ„ν•˜κ²Œ ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•œλ‹€. μ΄λ•Œ 해결에 ν•„μš”ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ°λ³΄λ‹¨ κ°„λ‹¨ν•œ μ–Έμ–΄λ‘œ λ¬Έμž₯을 반볡적으둜 μž‘μ„±ν•˜κΈ°λ§Œ ν•˜λ©΄ ν•΄κ²° 될 수 μžˆλ‹€.

예λ₯Όλ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. μ–΄λ–€ νŒ¨ν„΄μ— μΌμΉ˜λ˜λŠ” λ¬Έμžμ—΄μ„ μ°ΎλŠ” λ¬Έμ œλŠ” 일반적인 λ¬Έμ œμ— μ†ν•œλ‹€. μ΄λ•Œ, μ •κ·œ ν‘œν˜„μ‹μ€ λ¬Έμžμ—΄ νŒ¨ν„΄μ„ μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν‘œμ€€ μ–Έμ–΄λ‹€. λ¬Έμžμ—΄μ—μ„œ μ–΄λ–€ νŒ¨ν„΄μ„ μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ 맀번 μž‘μ„±ν•˜λŠ” 것보닀, λ°œκ²¬ν•  λ¬Έμžμ—΄μ„ μ •μ˜ν•˜λŠ” μ •κ·œ ν‘œν˜„μ‹μ„ ν•΄μ„ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ ν•œ 번 λ§Œλ“œλŠ” 것이 더 λ‚«λ‹€.

ν•΄μ„μž νŒ¨ν„΄μ€ κ°„λ‹¨ν•œ μ–Έμ–΄μ˜ 문법을 μ •μ˜ν•˜λŠ” 방법과 κ·Έ μ–Έμ–΄λ‘œ λ¬Έμž₯을 κ΅¬μ„±ν•˜λŠ” 방법, 이듀 λ¬Έμž₯을 ν•΄μ„ν•˜λŠ” 방법을 μ„€λͺ…ν•œλ‹€.

ν™œμš©μ„±

  • ꡬ문 뢄석 μƒμ„±κΈ°λŠ” 좔상 ꡬ문 트리λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ λ¬Έμž₯을 해석 ν•  수 있기 λ•Œλ¬Έμ—, μ‹œκ°„κ³Ό 곡간을 μ ˆμ•½ ν•  수 μžˆλ‹€.
  • 일차적으둜 ꡬ문 뢄석 트리λ₯Ό λ‹€λ₯Έ ν˜•νƒœλ‘œ λ²ˆμ—­ν•  λ•Œ.

μ˜ˆμ œμ½”λ“œ

sealed class Expression {
    class Constant(val value: Int) : Expression()
    class Add(val left: Expression, val right: Expression) : Expression()
    class Mul(val left: Expression, val right: Expression) : Expression()
    class Interpreter {
        fun interpret(expression: Expression): Int = when (expression) {
            is Mul -> interpret(expression.left) * interpret(expression.right)
            is Add -> interpret(expression.left) + interpret(expression.right)
            is Constant -> expression.value
        }
    }

    fun toInt(): Int = Interpreter().interpret(this)
}

fun main() {
    println(Expression.Constant(2).toInt())
    println(Expression.Add(Expression.Constant(2), Expression.Constant(3)).toInt())
    println(Expression.Mul(Expression.Constant(2), Expression.Constant(3)).toInt())
}