package Ġnet . earth computer . mult icon nect . compiler . opt o Ċ Ċ import Ġnet . earth computer . mult icon nect . compiler . Emitter Ċ import Ġnet . earth computer . mult icon nect . compiler . node . Mc Node Ċ import Ġnet . earth computer . mult icon nect . compiler . node . Pre cedence Ċ import Ġjava . util . TreeMap Ċ import Ġjava . util . Tree Set Ċ Ċ fun ĠMc Node . optimize (): ĠMc Node Ġ{ ĊĠĠĠ Ġval Ġoptimizer Ġ= ĠOptim izer ( this ) ĊĠĠĠ Ġoptimizer . optimize () ĊĠĠĠ Ġreturn Ġoptimizer . root Node Ċ } Ċ Ċ internal Ġclass ĠOptim izer ( var Ġroot Node : ĠMc Node ) Ġ{ ĊĠĠĠ Ġfun Ġoptimize () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Unused Nodes () ĊĠĠĠĠĠĠĠ Ġextract Common Nodes () ĊĠĠĠĠĠĠĠ Ġextract Statements In Expressions () ĊĠĠĠĠĠĠĠ Ġadd Try Catch If Ne cessary () ĊĠĠĠĠĠĠĠ Ġremove Unused Nodes () ĊĠĠĠĠĠĠĠ Ġname Variables ( root Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġparent - first ĊĠĠĠ Ġinternal Ġinline Ġfun ĠforEach Node ( func : ĠNode Iteration .( Mc Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Node . forEach Node ( func ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdepth Ġfirst Ġis Ġdangerous Ġwhile Ġmut ating Ġthe Ġtree Ġbecause Ġthe Ġiteration Ġmay Ġnot Ġtake Ġinto Ġaccount Ġthe Ġmutations . ĊĠĠĠ Ġ// Ġuse Ġmark Changed () Ġwhenever Ġyou Ġmutate Ġthe Ġtree Ġto Ġsolve . ĊĠĠĠ Ġinternal Ġfun ĠforEach Node Depth First Unsafe ( func : ĠDepth First Iterator .( Mc Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitr Ġ= ĠDepth First Iterator () ĊĠĠĠĠĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < Mc Node >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( itr . internal Is Changed () Ġ&& Ġroot Node Ġ! in Ġvisited ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitr . internal Mark Un changed () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Node Depth First Unsafe ( root Node , Ġfunc , Ġitr , Ġvisited , Ġmutable Set Of ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġinline Ġfun ĠMc Node . forEach Node ( func : ĠNode Iteration .( Mc Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < Mc Node >() ĊĠĠĠ Ġvar Ġto Visit Ġ= Ġmutable Set Of ( this ) ĊĠĠĠ Ġvar Ġvisit ing Ġ= Ġmutable Set Of < Mc Node >() ĊĠĠĠ Ġval Ġiteration Ġ= ĠNode Iteration () ĊĠĠĠ Ġwhile Ġ( to Visit . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisited Ġ+= Ġto Visit ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġto Visit ĊĠĠĠĠĠĠĠ Ġto Visit Ġ= Ġvisit ing ĊĠĠĠĠĠĠĠ Ġvisit ing Ġ= Ġtemp ĊĠĠĠĠĠĠĠ Ġto Visit . clear () ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġvisit ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiteration . func ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! iteration . internal Should Visit Children ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiteration . internal Un skip Children () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( input Ġin Ġnode . inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Ġ! in Ġvisited ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Visit Ġ+= Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠNode Iteration Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġvisit Children Ġ= Ġtrue ĊĊĠĠĠ Ġinternal Ġfun Ġskip Children () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Children Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinternal Un skip Children () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Children Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinternal Should Visit Children () Ġ= Ġvisit Children Ċ } Ċ Ċ private Ġfun ĠforEach Node Depth First Unsafe ( from Node : ĠMc Node , Ġfunc : ĠDepth First Iterator .( Mc Node ) Ġ-> ĠUnit , Ġitr : ĠDepth First Iterator , Ġvisited : ĠMutable Set < Mc Node >, Ġvisit ing : ĠMutable Set < Mc Node >) Ġ{ ĊĠĠĠ Ġvisit ing Ġ+= Ġfrom Node ĊĠĠĠ Ġfor Ġ( input Ġin Ġfrom Node . inputs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( input Ġ! in Ġvisited Ġ&& Ġinput Ġ! in Ġvisit ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Node Depth First Unsafe ( input , Ġfunc , Ġitr , Ġvisited , Ġvisit ing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( itr . internal Is Changed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvisited Ġ+= Ġfrom Node ĊĠĠĠ Ġitr . func ( from Node ) Ċ } Ċ Ċ internal Ġclass ĠDepth First Iterator Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġchanged Ġ= Ġtrue ĊĊĠĠĠ Ġinternal Ġfun Ġmark Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinternal Is Changed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchanged ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġinternal Mark Un changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġchanged Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġname Variables ( from Node : ĠMc Node ) Ġ{ ĊĠĠĠ Ġvar Ġvar Index Ġ= Ġ 1 ĊĠĠĠ Ġfrom Node . forEach Node Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġfor Ġ( declared Var Ġin Ġnode . op . declared Variables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! declared Var . is Immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Var . name Ġ= Ġ" var $ var Index " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠMc Node . debug Convert ToString (): ĠString Ġ{ ĊĠĠĠ Ġname Variables ( this ) ĊĠĠĠ Ġval Ġemitter Ġ= ĠEmit ter (" foo . Bar ", ĠTree Set (), ĠTreeMap (), ĠStringBuilder (), Ġdebug Mode Ġ= Ġtrue ) ĊĠĠĠ Ġemit ( emitter . add Member (" foo ") !! , ĠPre cedence . COMMA ) ĊĠĠĠ Ġreturn Ġemitter . createClass Text () Ċ } Ċ