package Ġcom . github . j om of . k ane . impl Ċ Ċ import Ġcom . github . j om of . k ane . Expr Ċ import Ġcom . github . j om of . k ane . Matrix Expr Ċ import Ġcom . github . j om of . k ane . Scalar Expr Ċ import Ġcom . github . j om of . k ane . impl . sheet . Sheet Ċ import Ġcom . github . j om of . k ane . impl . visitor . Difference Visitor Ċ import Ġcom . github . j om of . k ane . impl . visitor . Sheet Rew rit ing Visitor Ċ Ċ data Ġclass ĠScalar Reference ( val Ġname : ĠId ) Ġ: ĠScalar Expr Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠIdentifier . string ( name ) Ċ } Ċ Ċ data Ġclass ĠMatrix Reference ( val Ġname : ĠId ) Ġ: ĠMatrix Expr Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠIdentifier . string ( name ) Ċ } Ċ Ċ private Ġclass ĠMake Referenced Ġ: ĠSheet Rew rit ing Visitor () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrewrite ( expr : ĠExpr ): ĠExpr Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsuper . rewrite ( expr ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠScalar Reference ) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠMatrix Reference ) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠScalar Variable ) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġif Ġ(! in Sheet ()) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġif Ġ( result . has Name ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġresult . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cells . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Cell ( name , Ġresult . to Unnamed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScalar Expr Ġ-> Ġreturn ĠScalar Reference ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMatrix Expr Ġ-> Ġreturn ĠMatrix Reference ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ("${ result . java Class }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠMake Dere fer enced Ġ: ĠSheet Rew rit ing Visitor () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrewrite ( expr : ĠScalar Reference ): ĠExpr Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Ġ= Ġcells [ expr . name ] !! ĊĠĠĠĠĠĠĠ Ġreturn Ġrewrite ( lookup ). to Named ( expr . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrewrite ( expr : ĠMatrix Reference ): ĠExpr Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrewrite ( cells [ expr . name ] !! ). to Named ( expr . name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġmake Referenced Ġ= ĠMake Referenced () Ċ private Ġval Ġmake Dere fer enced Ġ= ĠMake Dere fer enced () Ċ Ċ fun ĠSheet . make Referenced () Ġ= Ġmake Referenced . sheet ( this ) Ċ fun ĠExpr . make Referenced () Ġ= Ġmake Referenced . rewrite ( this ) Ċ fun ĠSheet . make Dere fer enced () Ġ= Ġmake Dere fer enced . sheet ( this ) Ċ fun ĠExpr . make Dere fer enced () Ġ= Ġmake Dere fer enced . rewrite ( this )