タイガーブックchap4の抽象構文木
scalaだと、こんな感じになるんじゃないかっと。
class Absyn { type Pos = Int abstract case class Absyn(pos:Pos) abstract case class Var(override val pos:Pos) extends Absyn(pos) abstract case class Exp(override val pos:Pos) extends Absyn(pos) case class VarExp(override val pos:Pos, v:Var) extends Exp(pos) case class NilExp(override val pos:Pos) extends Exp(pos) case class IntExp(override val pos:Pos, i:Int) extends Exp(pos) case class StringExp(override val pos:Pos,str:String) extends Exp(pos) case class CallExp(override val pos:Pos,func:Symbol, args:List[Exp]) extends Exp(pos) case class OpExp(override val pos:Pos, left:Exp, oper:Oper, right:Exp) extends Exp(pos) case class RecordExp(override val pos:Pos, fields:List[(Symbol,Exp,Int)], typ:Symbol) extends Exp(pos) case class SeqExp(override val pos:Pos,exp:List[Exp]) extends Exp(pos) case class IfExp(override val pos:Pos,test:Exp, then1:Exp, else1:Option[Exp]) extends Exp(pos) case class WhileExp(override val pos:Pos,test:Exp, body:Exp) extends Exp(pos) case class ForExp(override val pos:Pos,var1:Symbol, var escape:Boolean, lo:Exp, hi:Exp, body:Exp) extends Exp(pos) case class BreakExp(override val pos:Pos) extends Exp(pos) case class LetExp(override val pos:Pos, decs:List[Dec], body:Exp) extends Exp(pos) case class ArrayExp(override val pos:Pos, typ:Symbol, size:Exp, init:Exp) extends Exp(pos) abstract class Dec(override val pos:Pos) extends Absyn(pos) case class FunctionDec(override val pos:Pos, list:List[FunDec]) extends Dec(pos) case class VarDec(override val pos:Pos, name:Symbol, var escape:Boolean, typ: Option[(Symbol, Pos)], init:Exp) extends Dec(pos) case class TypeDec(override val pos:Pos, name:Symbol, ty:Ty) extends Dec(pos) abstract case class Ty(override val pos:Pos) extends Absyn(pos) case class NameTy(override val pos:Pos, sym:Symbol) extends Ty(pos) case class RecordTy(override val pos:Pos, l:List[Field]) extends Ty(pos) case class ArrayTy(override val pos:Pos, sym:Symbol) extends Ty(pos) abstract case class Oper(override val pos:Pos) extends Absyn(pos) case class PlusOp(override val pos:Pos) extends Oper(pos) case class MinusOp(override val pos:Pos) extends Oper(pos) case class TimesOp(override val pos:Pos) extends Oper(pos) case class DivideOp(override val pos:Pos) extends Oper(pos) case class EqOp(override val pos:Pos) extends Oper(pos) case class NeqOp(override val pos:Pos) extends Oper(pos) case class LtOp(override val pos:Pos) extends Oper(pos) case class LeOp(override val pos:Pos) extends Oper(pos) case class GtOp(override val pos:Pos) extends Oper(pos) case class GeOp(override val pos:Pos) extends Oper(pos) case class Field(override val pos:Pos, name:Symbol, var escape:Boolean, typ:Symbol) extends Absyn(pos) case class FunDec(override val pos:Pos, name:Symbol, params:List[Field], result: Option[(Symbol, Pos)], body: Exp) extends Absyn(pos) }