Scala로 WAE 정의하기
WAE의 문법을 Scala의 case class를 사용해 정의할 수 있다.
trait Expr
case class Num(n: Int) extends Expr
case class Add(lhs: Expr, rhs: Expr) extends Expr
case class Sub(lhs: Expr, rhs: Expr) extends Expr
case class With(name: Symbol, nameExp: Expr, body: Expr) extends Expr
case class Id(name: Symbol) extends Expr
각 클래스를 설명하자면,
Num(n: Int): 숫자를 나타내는 클래스로 Num(5)는 숫자 5를 의미한다.
Add(lhs: Expr, rhs: Expr): 덧셈을 나타내는 클래스로 Add(Num(3), Num(4))는 3 + 4를 의미한다.
With(name: Symbol, nameExp: Expr, body: Expr): with 구문을 나타내는 클래스로 with {x 3} {+ x x}처럼 x에 3을 바인딩하고, x + x를 계산하는 역할을 한다.
Id(name: Symbol): 식별자를 나타내는 클래스로 x, y 같은 변수를 나타낸다.
실제 코드 예시를 살펴보자
val expr = With('x, Num(3), Add(Id('x), Id('x)))
이 예제는 x를 3으로 바인딩하고, x + x를 계산하는 표현식이다.
결과는 3 + 3이니까 6이 나온다.
Scala로 WAE 구현의 장점으로는
case class를 사용해서 표현식을 간결하게 표현할 수 있고,
프로그램 내에서 추상 문법을 처리하기 쉽게 만들어준다.
그리고 복잡한 계산도 변수를 바인딩하면서 단계적으로 처리할 수 있게 한다.