package Ġsi il ink ari . types Ċ Ċ import Ġsi il ink ari . ast . Relational Op Ċ import Ġsi il ink ari . env . Binding Ċ import Ġsi il ink ari . objects . Value Ċ Ċ /** Ċ Ġ* ĠRepresents Ġan Ġexpression Ġthat Ġhas Ġbeen Ġtype - checked Ġand Ġtherefore Ġhas Ġa Ġknown Ġ[ type ]. Ċ Ġ* Ċ Ġ* ĠThe Ġtree Ġis Ġmostly Ġanalog ous Ġto Ġexpressions Ġin Ġthe Ġoriginal ĠAST , Ġbut Ġthere Ġare Ġsome Ċ Ġ* Ġdifferences . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġthere Ġare Ġsome Ġnew Ġnodes Ġwith Ġmore Ġexplicit Ġmeaning . ĠFor Ġexample , Ġwhile Ġ` 1 Ġ+ Ġ 2 ` Ġis Ġtranslated Ċ Ġ* Ġto Ġ[ Typed Expression . Binary . Plus ], Ġexpressions Ġ`" foo " Ġ+ Ġ" bar "` Ġor Ġ`" foo " Ġ+ Ġ 1 ` Ġwill Ġbe Ġtranslated Ċ Ġ* Ġto Ġ[ Typed Expression . Binary . Concat String ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠType Ċ Ġ*/ Ċ sealed Ġclass ĠTyped Expression ( val Ġtype : ĠType ) Ġ{ ĊĊĠĠĠ Ġ/** ĠReference Ġto Ġa Ġvariable . Ġ*/ ĊĠĠĠ Ġclass ĠRef ( val Ġbinding : ĠBinding ) Ġ: ĠTyped Expression ( binding . type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Ref Ġ${ binding . name }] " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLiteral Ġvalue Ġ*/ ĊĠĠĠ Ġclass ĠL it ( val Ġvalue : ĠValue , Ġtype : ĠType ) Ġ: ĠTyped Expression ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( value : ĠValue . Integer ): Ġthis ( value , ĠType . Int ) ĊĠĠĠĠĠĠĠ Ġconstructor ( value : ĠValue . Bool ): Ġthis ( value , ĠType . Boolean ) ĊĠĠĠĠĠĠĠ Ġconstructor ( value : ĠValue . String ): Ġthis ( value , ĠType . String ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Lit Ġ${ value . repr ()} ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLogical Ġnot . Ġ*/ ĊĠĠĠ Ġclass ĠNot ( val Ġexp : ĠTyped Expression ): ĠTyped Expression ( Type . Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Not Ġ$ exp ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFunction Ġcall . Ġ*/ ĊĠĠĠ Ġclass ĠCall ( val Ġfunc : ĠTyped Expression , Ġval Ġargs : ĠList < Typed Expression >, Ġtype : ĠType ) Ġ: ĠTyped Expression ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Call Ġ$ func Ġ$ args ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠBinary Ġoperators . Ġ*/ ĊĠĠĠ Ġsealed Ġclass ĠBinary ( val Ġlhs : ĠTyped Expression , Ġval Ġrhs : ĠTyped Expression , Ġtype : ĠType ): ĠTyped Expression ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ ${ java Class . simple Name } Ġ$ lhs Ġ$ rhs ]" ĊĊĠĠĠĠĠĠĠ Ġ/** ĠNumeric Ġaddition Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠPlus ( lhs : ĠTyped Expression , Ġrhs : ĠTyped Expression , Ġtype : ĠType ) Ġ: ĠBinary ( lhs , Ġrhs , Ġtype ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠNumeric Ġsub traction Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠMin us ( lhs : ĠTyped Expression , Ġrhs : ĠTyped Expression , Ġtype : ĠType ) Ġ: ĠBinary ( lhs , Ġrhs , Ġtype ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠNumeric Ġmultiplication Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠMultiply ( lhs : ĠTyped Expression , Ġrhs : ĠTyped Expression , Ġtype : ĠType ) Ġ: ĠBinary ( lhs , Ġrhs , Ġtype ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠNumeric Ġdivision Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠDiv ide ( lhs : ĠTyped Expression , Ġrhs : ĠTyped Expression , Ġtype : ĠType ) Ġ: ĠBinary ( lhs , Ġrhs , Ġtype ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠString Ġconcat enation Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠConcat String ( lhs : ĠTyped Expression , Ġrhs : ĠTyped Expression ) Ġ: ĠBinary ( lhs , Ġrhs , ĠType . String ) ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ= , Ġ!= , Ġ< , Ġ>, Ġ<= , Ġ>= Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠRel ational ( val Ġop : ĠRel ational Op , Ġlhs : ĠTyped Expression , Ġrhs : ĠTyped Expression ) Ġ: ĠBinary ( lhs , Ġrhs , ĠType . Boolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" [$ op Ġ$ lhs Ġ$ rhs ]" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAssign ( val Ġvariable : ĠBinding , Ġval Ġexpression : ĠTyped Expression ) Ġ: ĠTyped Expression ( Type . Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Assign Ġ$ variable Ġ$ expression ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠVar ( val Ġvariable : ĠBinding , Ġval Ġexpression : ĠTyped Expression ) Ġ: ĠTyped Expression ( Type . Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Var Ġ$ variable Ġ$ expression ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠIf ( val Ġcondition : ĠTyped Expression , Ġval Ġcon sequent : ĠTyped Expression , Ġval Ġalternative : ĠTyped Expression ?, Ġtype : ĠType ) Ġ: ĠTyped Expression ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( alternative Ġ!= Ġnull Ġ|| Ġtype Ġ== ĠType . Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ If Ġ$ condition Ġ$ con sequent Ġ${ alternative Ġ?: Ġ" [] "} ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠWhile ( val Ġcondition : ĠTyped Expression , Ġval Ġbody : ĠTyped Expression ) Ġ: ĠTyped Expression ( Type . Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ While Ġ$ condition Ġ$ body ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠExpression List ( val Ġexpressions : ĠList < Typed Expression >, Ġtype : ĠType ) Ġ: ĠTyped Expression ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"[ Expression List Ġ$ expressions ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEmpty Ġ= ĠExpression List ( emptyList (), ĠType . Unit ) ĊĠĠĠ Ġ} Ċ } Ċ