タイガーブック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)
}