package Ġh ach i . lang . domain . node . expression . ar ithmetic Ċ Ċ import Ġh ach i . lang . domain . node . expression . Expression Ċ import Ġh ach i . lang . domain . type . BuiltIn Type Ċ import Ġh ach i . lang . domain . type . Type Ċ import Ġh ach i . lang . util . Type Checker Ċ Ċ abstract Ġclass ĠArithmetic Expression ( val Ġleft Expression : ĠExpression , Ġval Ġright Expression : ĠExpression ) Ġ: ĠExpression Ġ{ ĊĠĠĠ Ġprivate Ġval Ġarithmetic Expression Type Ġ= Ġget Common Type ( left Expression , Ġright Expression ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Common Type ( left Expression : ĠExpression , Ġright Expression : ĠExpression ): ĠType Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Type Checker . isString ( right Expression . getType ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilt In Type . STRING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Expression . getType () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetType (): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . ar ithmetic Expression Type ĊĠĠĠ Ġ} Ċ }