/** Ċ Ġ* ĠAn Ġexpression . Ċ Ġ*/ Ċ interface ĠExpr Ġ{ ĊĠĠĠ Ġfun Ġcalc ( env Ġ: ĠEnvironment ) Ġ: ĠInt Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġconst . Ċ Ġ*/ Ċ class ĠConst ( val Ġvalue Ġ: ĠInt ) Ġ: ĠExpr Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcalc ( env Ġ: ĠEnvironment ) Ġ: ĠInt Ġ= Ġvalue ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other Ġ: ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠConst Ġ&& Ġother . value . equals ( value ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġvalue Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġinteger Ġvariable . Ċ Ġ*/ Ċ class ĠVar ( val Ġname Ġ: ĠString ) Ġ: ĠExpr Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcalc ( env Ġ: ĠEnvironment ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġenv . getVar ( name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Variable Ġ$ name Ġnot Ġdefined ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other Ġ: ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠVar Ġ&& Ġother . name . equals ( name ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġname . hashCode () Ċ } Ċ Ċ class ĠBin Op ( val Ġop Type Ġ: ĠChar , Ġval Ġleft Ġ: ĠExpr , Ġval Ġright Ġ: ĠExpr ) Ġ: ĠExpr Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcalc ( env Ġ: ĠEnvironment ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Val Ġ= Ġleft . calc ( env ) ĊĠĠĠĠĠĠĠ Ġval Ġright Val Ġ= Ġright . calc ( env ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( op Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'+' Ġ-> Ġleft Val Ġ+ Ġright Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' Ġ-> Ġleft Val Ġ- Ġright Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'*' Ġ-> Ġleft Val Ġ* Ġright Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'/' Ġ-> Ġleft Val Ġ/ Ġright Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'%' Ġ-> Ġleft Val Ġ% Ġright Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'~ ' Ġ-> Ġif Ġ( left Val Ġ== Ġright Val ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' !' Ġ-> Ġif Ġ( left Val Ġ!= Ġright Val ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' >' Ġ-> Ġif Ġ( left Val Ġ> Ġright Val ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'< ' Ġ-> Ġif Ġ( left Val Ġ< Ġright Val ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'& ' Ġ-> Ġif Ġ( left Val Ġ!= Ġ 0 Ġ&& Ġright Val Ġ!= Ġ 0 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' |' Ġ-> Ġif Ġ( left Val Ġ!= Ġ 0 Ġ|| Ġright Val Ġ!= Ġ 0 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other Ġ: ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠBin Op Ġ&& Ġother . op Type . equals ( op Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . left . equals ( left ) Ġ&& Ġother . right . equals ( right ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġop Type . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġleft . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġright . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }