package Ġedu . kit . compiler . transform Ċ Ċ import Ġedu . kit . compiler . ast . AST Ċ import Ġedu . kit . compiler . semantic . Semantic AST Ċ import Ġedu . kit . compiler . semantic . Semantic Type Ċ import Ġedu . kit . compiler . semantic . Variable Node Ċ import Ġedu . kit . compiler . semantic . visitor . Abstract Visitor Ċ import Ġedu . kit . compiler . semantic . visitor . accept Ċ import Ġedu . kit . compiler . utils . Logger Ċ import Ġfirm . Construction Ċ import Ġfirm . Entity Ċ import Ġfirm . F irm Ċ import Ġfirm . Graph Ċ import Ġfirm . Mode Ċ import Ġfirm . Relation Ċ import Ġfirm . Type Ċ import Ġfirm . bindings . binding _ ir cons Ċ import Ġfirm . nodes . Block Ċ import Ġfirm . nodes . Call Ċ import Ġfirm . nodes . Cond Ċ import Ġfirm . nodes . Div Ċ import Ġfirm . nodes . Load Ċ import Ġfirm . nodes . Node Ċ import Ġfirm . nodes . Start Ċ import Ġfirm . nodes . Store Ċ import Ġjava . util . Stack Ċ Ċ fun ĠSemantic Type . to Variable Type (): ĠType Ġ= Ġwith ( F irm Context . type Registry ) Ġ{ ĊĠĠĠ Ġto Variable Type () Ċ } Ċ Ċ /** Ċ Ġ* ĠF acade Ġfor Ġall Ġj F irm - related Ġcalls . Ċ Ġ* Ċ Ġ* ĠP . S : ĠYou Ġare Ġnot Ġallowed Ġto Ġask Ġabout Ġthe Ġ' pr incip le Ġof Ġlocal ity '. ĠThe Ġ[ Transformation Method Visitor ] Ġis Ġa Ġvery Ġclose Ċ Ġ* Ġfriend Ġof Ġthis Ġclass Ġand Ġstrongly Ġcoup led Ġwith Ġthis Ġimplementation Ċ Ġ*/ Ċ object ĠF irm Context Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUtility Ġto Ġmanage Ġ[ firm - types ][ Type ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġtype Registry : ĠType Registry ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġactive Ġconstruction . ĠThis Ġis Ġhidden Ġhere , Ġbecause Ġwe Ġcan Ġuse Ġthe Ġvisitor Ġpattern , Ġif Ġthe Ġactive ĊĠĠĠĠ Ġ* Ġconstruction Ġis Ġheld Ġin Ġthe Ġbackground Ġ( and Ġnever Ġexposed ). ĠThis Ġcomes Ġwith Ġthe Ġlimitation Ġthat Ġonly Ġone Ġmethod ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġconstructed Ġat Ġa Ġtime , Ġbut Ġthis Ġis Ġin herent Ġto Ġthe ĠAST Ġvisitor Ġpattern Ġanyway . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġconstruction : ĠCon struction ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Construction !! ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Construction : ĠCon struction ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGraph Ġof Ġcurrent Ġactive Ġ[ construction ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġgraph : ĠGraph ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġall Ġreturn Ġnodes Ġof Ġa Ġmethod . ĠMust Ġbe Ġconnected Ġto Ġthe Ġend Ġnode Ġin Ġthe Ġend . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġreturn Nodes Ġ= Ġmutable ListOf < Node >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġblocks Ġcontaining Ġa Ġreturn Ġnode . ĠThose Ġdo Ġnot Ġrequire Ġjumps Ġin Ġthe Ġend Ġ( like Ġthen / else Ġblocks ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġexit Blocks Ġ= Ġmutable ListOf < Block >() ĊĊĠĠĠ Ġfun Ġdoes Current Block Exit () Ġ= Ġexit Blocks . contains ( construction . current Block ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġstack Ġfor Ġconstructing Ġexpressions Ġusing Ġa Ġvisitor . ĠEach Ġconstructed Ġexpression Ġis Ġadded Ġonto Ġthe Ġstack , ĊĠĠĠĠ Ġ* Ġeach Ġexpression Ġthat Ġneeds Ġarguments Ġjust Ġtakes Ġthem Ġfrom Ġthe Ġstack . ĠSince Ġthe ĠAST Ġis Ġguaranteed Ġto Ġbe Ġvalid , ĊĠĠĠĠ Ġ* Ġthis Ġcannot Ġfail . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġexpression Stack Ġ= ĠStack < Node >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġthe Ġfirm Ġframework ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ ĠF irm . VERSION Ġ= ĠF irm . F irm Version . DEBUG ĊĠĠĠĠĠĠĠ ĠF irm . init (" x 8 6 _ 6 4 - linux - gnu ", ĠarrayOf (" pic = 1 ")) ĊĠĠĠĠĠĠĠ ĠLogger . debug Ġ{ Ġ" Initialized Ġlib F irm ĠVersion : Ġ${ F irm . get Major Version ()}. ${ F irm . get Minor Version () }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġtype Registry Ġ= ĠType Registry () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġmethod . ĠWith in Ġ[ block ] Ġno Ġother Ġmethod Ġmay Ġbe Ġconstructed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Entity Ġmethod Ġentity ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Ġmethod ĠAST Ġnode ĊĠĠĠĠ Ġ* Ġ@ param Ġvariables Ġnumber Ġof Ġlocal Ġvariables Ġand Ġparameters Ġwithin Ġthe Ġsubroutine ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġcode Ġfragment Ġthat Ġconstructs Ġthe Ġmethod 's Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconstruct Method ( ĊĠĠĠĠĠĠĠ Ġmethod Entity : ĠEntity , ĊĠĠĠĠĠĠĠ Ġmethod : ĠSemantic AST . Class Member . Sub routine Declaration . Method Declaration , ĊĠĠĠĠĠĠĠ Ġvariables : ĠInt , ĊĠĠĠĠĠĠĠ Ġblock : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠGraph Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameter Tuple Ġ= Ġprepare Sub routine ( method Entity , Ġvariables ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġ` this ` ĊĠĠĠĠĠĠĠ Ġconstruction . set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( parameter Tuple , Ġtype Registry . getClass Reference Type ( method . owner . name . symbol ). mode , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġload Ġparameters Ġinto Ġhelper Ġvariables ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ( 1 .. method . parameters . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( parameter Tuple , Ġmethod . parameters [ index Ġ- Ġ 1 ]. type . mode , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġblock () ĊĊĠĠĠĠĠĠĠ Ġ// Ġin Ġ` void ` Ġmethods , Ġthe Ġlast Ġblock Ġmay Ġnot Ġhave Ġa Ġ` return ` Ġstatement , Ġhence Ġwe Ġconnect Ġit Ġto Ġthe Ġend Ġblock ĊĠĠĠĠĠĠĠ Ġ// Ġmanually . ĊĠĠĠĠĠĠĠ Ġif Ġ( construction . current Block Ġ! in Ġthis . exit Blocks Ġ&& Ġmethod . returnType Ġ== ĠSemantic Type . Void ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Statement ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfinish Sub routine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġthe Ġmain Ġmethod . ĠWith in Ġ[ block ] Ġno Ġother Ġmethod Ġmay Ġbe Ġconstructed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Entity Ġmethod Ġentity ĊĠĠĠĠ Ġ* Ġ@ param Ġvariables Ġnumber Ġof Ġlocal Ġvariables Ġand Ġparameters Ġwithin Ġthe Ġsubroutine ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġcode Ġfragment Ġthat Ġconstructs Ġthe Ġmethod 's Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconstruct Main Method ( ĊĠĠĠĠĠĠĠ Ġmethod Entity : ĠEntity , ĊĠĠĠĠĠĠĠ Ġvariables : ĠInt , ĊĠĠĠĠĠĠĠ Ġblock : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠGraph Ġ{ ĊĠĠĠĠĠĠĠ Ġprepare Sub routine ( method Entity , Ġvariables ) ĊĊĠĠĠĠĠĠĠ Ġblock () ĊĊĠĠĠĠĠĠĠ Ġ// Ġin Ġ` void ` Ġmethods , Ġthe Ġlast Ġblock Ġmay Ġnot Ġhave Ġa Ġ` return ` Ġstatement , Ġhence Ġwe Ġconnect Ġit Ġto Ġthe Ġend Ġblock ĊĠĠĠĠĠĠĠ Ġ// Ġmanually . ĊĠĠĠĠĠĠĠ Ġif Ġ( construction . current Block Ġ! in Ġthis . exit Blocks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Main Return Statement () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfinish Sub routine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrepare Ġconstruction Ġof Ġa Ġnew Ġsubroutine ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Entity Ġthe Ġfirm Ġentity Ġof Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġ@ param Ġvariables Ġthe Ġnumber Ġof Ġparameters Ġ+ Ġlocal Ġvariables Ġof Ġthis Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprepare Sub routine ( method Entity : ĠEntity , Ġvariables : ĠInt ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( this . current Construction Ġ== Ġnull ) Ġ{ Ġ" cannot Ġconstruct Ġa Ġmethod Ġwhile Ġanother Ġis Ġbeing Ġconstructed " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠGraph ( method Entity , Ġvariables ) ĊĠĠĠĠĠĠĠ Ġval Ġconstruction Ġ= ĠCon struction ( graph ) ĊĊĠĠĠĠĠĠĠ Ġthis . graph Ġ= Ġgraph ĊĠĠĠĠĠĠĠ Ġthis . current Construction Ġ= Ġconstruction ĊĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( graph . start , ĠMode . getM (), ĠStart . pn M ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġload Ġparameters Ġand Ġstore Ġin Ġlocal Ġhelper Ġvariables ĊĠĠĠĠĠĠĠ Ġreturn Ġconstruction . new Proj ( graph . start , ĠMode . getT (), ĠStart . pn T Args ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinish Ġconstruction Ġof Ġa Ġsubroutine ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfinish Sub routine (): ĠGraph Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġend Ġnode ĊĠĠĠĠĠĠĠ Ġreturn Nodes . forEach ( this . graph !!. end Block :: add Pred ) ĊĠĠĠĠĠĠĠ Ġthis . construction . new End ( empty Array ()) ĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= Ġthis . graph !! ĊĠĠĠĠĠĠĠ Ġgraph . end Block . m ature () ĊĊĠĠĠĠĠĠĠ Ġthis . construction . finish () ĊĊĠĠĠĠĠĠĠ Ġthis . current Construction Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . graph Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . return Nodes . clear () ĊĠĠĠĠĠĠĠ Ġthis . exit Blocks . clear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġunreachable Ġreturns Ġmay Ġintroduce ĠBad Ġnodes , Ġremove Ġthem Ġbefore Ġsubsequent Ġphases ĊĠĠĠĠĠĠĠ Ġfirm . bindings . binding _ ir go pt . remove _ bad s ( graph . ptr ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgraph ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġbinary Ġexpression . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpr Ġthe Ġ[ Semantic AST . Expression . Binary Operation ] Ġvariant Ġthat Ġis Ġbeing Ġconstructed ĊĠĠĠĠ Ġ* Ġ@ param Ġsurrounding Method Ġthe Ġmethod Ġthis Ġexpression Ġis Ġin ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġthe Ġ[ Transformation Method Visitor ] Ġthat Ġwill Ġgenerate Ġcode Ġfor Ġpartial Ġexpressions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbinary Expression ( ĊĠĠĠĠĠĠĠ Ġexpr : ĠSemantic AST . Expression . Binary Operation , ĊĠĠĠĠĠĠĠ Ġsurrounding Method : ĠSemantic AST . Class Member . Sub routine Declaration , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġwhen Ġ( expr . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . ASSIGN MENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Assignment ( expr , Ġsurrounding Method , Ġtransformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR Ġ-> Ġgenerate Short Circuit Evaluation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND Ġ-> Ġgenerate Short Circuit Evaluation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right . accept ( transformer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Node Ġ= Ġexpression Stack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Kotlin Constant Conditions ") Ġ// Ġinspection Ġfalse - posit ives Ġhere , Ġbecause Ġsmart - casts Ġof Ġcompiler Ġdon 't Ġconsider Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . EQUAL S Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Equal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . NOT _ EQUAL S Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Less Greater ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . LESS _ THAN Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Less ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . GRE ATER _ THAN Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Greater ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . LESS _ EQUAL S Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Less Equal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . GRE ATER _ EQUAL S Ġ-> Ġconvert Bool To Byte ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Cmp ( first Node , Ġsecond Node , ĠRelation . Greater Equal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AD DITION Ġ-> Ġthis . construction . new Add ( first Node , Ġsecond Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . SUB TR ACTION Ġ-> Ġthis . construction . new Sub ( first Node , Ġsecond Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . MULTI PLICATION Ġ-> Ġthis . construction . new Mul ( first Node , Ġsecond Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . DIV ISION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġthis . construction . current Mem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiv Ġ= Ġthis . construction . new Div ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding _ ir cons . op _ pin _ state . op _ pin _ state _ pinned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . current Mem Ġ= Ġconstruction . new Proj ( div , ĠMode . getM (), ĠDiv . pn M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( div , Ġtype Registry . int Type . mode , ĠDiv . pn Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . MOD UL O Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġthis . construction . current Mem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiv Ġ= Ġthis . construction . new Mod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding _ ir cons . op _ pin _ state . op _ pin _ state _ pinned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . current Mem Ġ= Ġconstruction . new Proj ( div , ĠMode . getM (), ĠDiv . pn M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( div , Ġtype Registry . int Type . mode , ĠDiv . pn Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . ASSIGN MENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND Ġ-> Ġthrow ĠAssertionError (" unreachable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . expression Stack . push ( expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġmemory Ġaccess Ġto Ġassign Ġthe Ġright - hand Ġside Ġof Ġ[ expr ] Ġto Ġthe Ġleft - hand Ġside Ġand Ġpush Ġthe Ġvalue Ġonto Ġthe ĊĠĠĠĠ Ġ* Ġexpression Ġstack ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpr Ġthe Ġassignment Ġexpression ĊĠĠĠĠ Ġ* Ġ@ param Ġsurrounding Method Ġthe Ġsurrounding Ġmethod Ġof Ġthis Ġexpression ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġan Ġ[ Abstract Visitor ] Ġthat Ġwill Ġtransform Ġthe Ġpartial Ġexpressions Ġof Ġthis Ġassign em tn ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Assignment ( ĊĠĠĠĠĠĠĠ Ġexpr : ĠSemantic AST . Expression . Binary Operation , ĊĠĠĠĠĠĠĠ Ġsurrounding Method : ĠSemantic AST . Class Member . Sub routine Declaration , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Hand Side Ġ= Ġexpr . left ĊĠĠĠĠĠĠĠ Ġval Ġright Hand Side Ġ= Ġexpr . right ĊĊĠĠĠĠĠĠĠ Ġ// Ġneeds Ġto Ġbe Ġevaluated Ġlast ĊĠĠĠĠĠĠĠ Ġfun Ġeval Right Hand Side (): ĠNode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Hand Side . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( left Hand Side ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Array Access Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Hand Side . target . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Hand Side . index . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Write Access ( left Hand Side , Ġeval Right Hand Side ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Field Access Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Hand Side . target . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Write Access ( left Hand Side , Ġeval Right Hand Side ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Identifier Expression Ġ-> Ġidentifier Write Access ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Hand Side , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurrounding Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeval Right Hand Side () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" invalid ĠAST Ġin Ġtransformation ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġcontrol Ġflow Ġto Ġpush Ġa Ġbyte Ġusing Ġa Ġboolean Ġcondition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcomparison Ġthe Ġboolean Ġcomparison Ġwhose Ġresult Ġgets Ġconverted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconvert Bool To Byte ( comparison : ĠNode ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrue Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġfalse Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġafter Block Ġ= Ġconstruction . new Block () ĊĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition And Jump s ( comparison , Ġtrue Block , Ġfalse Block ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Boolean To Byte Phi ( true Block , Ġfalse Block , Ġafter Block ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block . m ature () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block . m ature () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġphi - expression Ġthat Ġwill Ġevaluate Ġto Ġ 1 Ġif Ġ[ true Block ] Ġwas Ġtaken Ġand Ġ 0 Ġif Ġ[ false Block ] Ġwas Ġtaken . ĠThen ĊĠĠĠĠ Ġ* Ġboth Ġblocks Ġjump Ġto Ġ[ after Block ] Ġand Ġit Ġwill Ġbe Ġthe Ġnew Ġactive Ġblock Ġof Ġ[ construction ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtrue Block Ġthe Ġblock Ġthat Ġshall Ġevaluate Ġto Ġ 1 ĊĠĠĠĠ Ġ* Ġ@ param Ġfalse Block Ġthe Ġblock Ġthat Ġshall Ġevaluate Ġto Ġ 0 ĊĠĠĠĠ Ġ* Ġ@ param Ġafter Block Ġthe Ġblock Ġwhere Ġexecution Ġshall Ġcontinue ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnode Ġcontaining Ġthe Ġbyte Ġvalue Ġof Ġthe Ġboolean Ġoperation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Boolean To Byte Phi ( true Block : ĠBlock , Ġfalse Block : ĠBlock , Ġafter Block : ĠBlock ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġtrue Block ĊĠĠĠĠĠĠĠ Ġval Ġone Node Ġ= Ġconstruction . new Const ( 1 , ĠMode . get Bu ()) ĊĠĠĠĠĠĠĠ Ġcreate Un conditional Jump ( after Block ) ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġfalse Block ĊĠĠĠĠĠĠĠ Ġval Ġzero Node Ġ= Ġconstruction . new Const ( 0 , ĠMode . get Bu ()) ĊĠĠĠĠĠĠĠ Ġcreate Un conditional Jump ( after Block ) ĊĠĠĠĠĠĠĠ Ġafter Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġafter Block ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconstruction . new Phi ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( one Node , Ġzero Node ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . get Bu () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvaluate Ġa Ġbinary Ġboolean Ġexpression Ġusing Ġshort - circuit Ġrules , Ġfor Ġnon - condition Ġoperations . ĊĠĠĠĠ Ġ* ĠUse Ġ[ generate Short Circuit Condition ] Ġfor Ġconditions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġleft Ġleft Ġside Ġof Ġthe Ġexpression ĊĠĠĠĠ Ġ* Ġ@ param Ġright Ġright Ġside Ġof Ġthe Ġexpression ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġan Ġ[ Abstract Visitor ] Ġthat Ġperforms Ġcode Ġtransformation Ġfor Ġexpressions ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġeither Ġ[ AST . Binary Expression . Operation . OR ] Ġor Ġ[ AST . Binary Expression . Operation . AND ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnode Ġthat Ġcontains Ġthe Ġresult Ġof Ġthe Ġboolean Ġoperation Ġ( as Ġa Ġbyte ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Short Circuit Evaluation ( ĊĠĠĠĠĠĠĠ Ġleft : ĠSemantic AST . Expression , ĊĠĠĠĠĠĠĠ Ġright : ĠSemantic AST . Expression , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠAbstract Visitor , ĊĠĠĠĠĠĠĠ Ġoperation : ĠAST . Binary Expression . Operation ĊĠĠĠ Ġ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġleft . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġval Ġright Side Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġtrue Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġfalse Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġafter Block Ġ= Ġconstruction . new Block () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR Ġ-> Ġgenerate Boolean Check ( expression Stack . pop (), Ġtrue Block , Ġright Side Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND Ġ-> Ġgenerate Boolean Check ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . pop (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Side Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġright Side Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġright Side Block ĊĠĠĠĠĠĠĠ Ġright . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġgenerate Boolean Check ( expression Stack . pop (), Ġtrue Block , Ġfalse Block ) ĊĊĠĠĠĠĠĠĠ Ġtrue Block . m ature () ĊĠĠĠĠĠĠĠ Ġfalse Block . m ature () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Boolean To Byte Phi ( true Block , Ġfalse Block , Ġafter Block ). also Ġ{ Ġafter Block . m ature () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġboolean Ġcondition Ġwith Ġjumps Ġto Ġ[ true Block ] Ġand Ġ[ false Block ] Ġfrom Ġan Ġ[ comparison ] Ġ( that Ġmust Ġbe Ġa Ġcomparison ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Boolean Condition And Jump s ( comparison : ĠNode , Ġtrue Block : ĠBlock , Ġfalse Block : ĠBlock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġconstruction . new Cond ( comparison ) ĊĠĠĠĠĠĠĠ Ġtrue Block . add Pred ( construction . new Proj ( condition , ĠMode . getX (), ĠCon d . pn True )) ĊĠĠĠĠĠĠĠ Ġfalse Block . add Pred ( construction . new Proj ( condition , ĠMode . getX (), ĠCon d . pn False )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġcondition Ġthat Ġchecks Ġa Ġboolean Ġ( byte ) Ġexpression Ġfor Ġthe Ġvalue Ġ` 1 ` Ġand Ġjumps Ġto Ġthe Ġrespective Ġblock . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpr Ġthe Ġexpression Ġthat Ġevaluates Ġto Ġ 1 Ġor Ġ 0 ĊĠĠĠĠ Ġ* Ġ@ param Ġtrue Block Ġwhere Ġto Ġjump Ġif Ġthe Ġexpression Ġis Ġ 1 ĊĠĠĠĠ Ġ* Ġ@ param Ġfalse Block Ġwhere Ġto Ġjump Ġif Ġthe Ġexpression Ġis Ġ 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Boolean Check ( expr : ĠNode , Ġtrue Block : ĠBlock , Ġfalse Block : ĠBlock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmp Ġ= Ġconstruction . new Cmp ( expr , Ġconstruction . new Const ( 1 , ĠMode . get Bu ()), ĠRelation . Equal ) ĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition And Jump s ( cmp , Ġtrue Block , Ġfalse Block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġboolean Ġbinary Ġcondition Ġusing Ġshort - circuit Ġlogic Ġas Ġa Ġcondition Ġexpression . ĠDo Ġnot Ġuse Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġfor Ġnon - conditional Ġexpressions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Short Circuit Condition ( ĊĠĠĠĠĠĠĠ Ġexpr : ĠSemantic AST . Expression . Binary Operation , ĊĠĠĠĠĠĠĠ Ġtrue Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġfalse Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor , ĊĠĠĠĠĠĠĠ Ġop : ĠAST . Binary Expression . Operation ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġright Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR Ġ-> Ġgenerate Boolean Condition ( expr . left , Ġtrue Block , Ġright Block , Ġtransformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND Ġ-> Ġgenerate Boolean Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġright Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġright Block ĊĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition ( expr . right , Ġtrue Block , Ġfalse Block , Ġtransformer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġcondition Ġfrom Ġan Ġexpression . ĠThe Ġexpression Ġmust Ġnot Ġbe Ġfurther Ġvisited Ġby Ġthe Ġ[ transformer ], Ġbecause ĊĠĠĠĠ Ġ* Ġthis Ġmethod Ġdec ides Ġwhich Ġparts Ġof Ġthe Ġexpression Ġwill Ġbe Ġvisited , Ġand Ġin Ġwhich Ġorder . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexpr Ġthe Ġexpression Ġto Ġgenerate Ġa Ġcondition Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġtrue Block Ġwhere Ġto Ġjump Ġif Ġthe Ġcondition Ġevaluates Ġto Ġtrue ĊĠĠĠĠ Ġ* Ġ@ param Ġfalse Block Ġwhere Ġto Ġjump Ġif Ġthe Ġcondition Ġevaluates Ġto Ġfalse ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġthe Ġ[ Transformation Method Visitor ] Ġthat Ġis Ġbeing Ġused Ġto Ġgenerated Ġpartial Ġexpressions Ġof Ġthe ĊĠĠĠĠ Ġ* Ġcondition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Boolean Condition ( ĊĠĠĠĠĠĠĠ Ġexpr : ĠSemantic AST . Expression , ĊĠĠĠĠĠĠĠ Ġtrue Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġfalse Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Binary Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . ASSIGN MENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Boolean Check ( expression Stack . pop (), Ġtrue Block , Ġfalse Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Short Circuit Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Short Circuit Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . EQUAL S Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Equal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . NOT _ EQUAL S Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Less Greater , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . LESS _ THAN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Less , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . GRE ATER _ THAN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Greater , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . LESS _ EQUAL S Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Less Equal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . GRE ATER _ EQUAL S Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . Greater Equal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . AD DITION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . SUB TR ACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . MULTI PLICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . DIV ISION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Binary Expression . Operation . MOD UL O Ġ-> Ġthrow ĠAssertionError (" cannot Ġhave Ġa Ġnumeric Ġoperation Ġas Ġa Ġcondition ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Method Invocation Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Field Access Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Identifier Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Array Access Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Boolean Check ( expression Stack . pop (), Ġtrue Block , Ġfalse Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Literal Expression . Literal Bool Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Boolean Check ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Const ( if Ġ( expr . value ) Ġ 1 Ġelse Ġ 0 , ĠMode . get Bu ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Unary Operation Ġ-> Ġwhen Ġ( expr . operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Unary Expression . Operation . NOT Ġ-> Ġgenerate Boolean Condition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . inner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Unary Expression . Operation . MINUS Ġ-> Ġthrow ĠAssertionError (" cannot Ġhave Ġa Ġnumeric Ġoperation Ġas Ġa Ġcondition ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . New Array Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . New Object Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Literal Expression . Literal Int Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Literal Expression . Literal Null Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Literal Expression . Literal This Expression Ġ-> Ġthrow ĠAssertionError (" cannot Ġhave Ġnon - boolean Ġexpression Ġas Ġcondition ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġcondition Ġand Ġthe Ġrespective Ġjumps Ġfor Ġa Ġrelation Ġexpression . ĠThis Ġis Ġonly Ġintended Ġfor Ġrelations , Ġnot ĊĠĠĠĠ Ġ* Ġfor Ġgeneral Ġboolean Ġexpressions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġleft Ġleft Ġargument Ġof Ġthe Ġrelation ĊĠĠĠĠ Ġ* Ġ@ param Ġright Ġright Ġargument Ġof Ġthe Ġrelation ĊĠĠĠĠ Ġ* Ġ@ param Ġtrue Block Ġwhere Ġto Ġjump Ġif Ġthe Ġarguments Ġare Ġin Ġrelation ĊĠĠĠĠ Ġ* Ġ@ param Ġfalse Block Ġwhere Ġto Ġjump Ġif Ġthe Ġarguments Ġare Ġnot Ġin Ġrelation ĊĠĠĠĠ Ġ* Ġ@ param Ġrelation Ġthe Ġrelation Ġto Ġtest Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġthe Ġtransformer Ġthat Ġis Ġbeing Ġused Ġto Ġgenerate Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Relation Condition ( ĊĠĠĠĠĠĠĠ Ġleft : ĠSemantic AST . Expression , ĊĠĠĠĠĠĠĠ Ġright : ĠSemantic AST . Expression , ĊĠĠĠĠĠĠĠ Ġtrue Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġfalse Block : ĠBlock , ĊĠĠĠĠĠĠĠ Ġrelation : ĠRelation , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠAbstract Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġleft . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġval Ġleft Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġright . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġval Ġright Node Ġ= Ġexpression Stack . pop () ĊĊĠĠĠĠĠĠĠ Ġval Ġcmp Ġ= Ġconstruction . new Cmp ( left Node , Ġright Node , Ġrelation ) ĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition And Jump s ( cmp , Ġtrue Block , Ġfalse Block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġunary Ġexpression . ĠThis Ġis Ġvery Ġsimilar Ġto Ġ[ binary Expression ] Ġand Ġthe Ġgiven Ġsample Ġcode Ġcan Ġbe Ġapplied ĊĠĠĠĠ Ġ* Ġdirectly Ġto Ġunary Ġexpressions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Ġthe Ġ[ AST . Unary Expression . Operation ] Ġvariant Ġthat Ġis Ġbeing Ġconstructed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunary Expression ( operation : ĠAST . Unary Expression . Operation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Unary Expression . Operation . NOT Ġ-> Ġthis . construction . new E or ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . pop (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Const ( 1 , ĠMode . get Bu ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAST . Unary Expression . Operation . MINUS Ġ-> Ġthis . construction . new Minus ( expression Stack . pop ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . expression Stack . push ( expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPush Ġa Ġboolean Ġliteral Ġinto Ġthe Ġcurrently Ġconstructed Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġliteral Bool ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġint Repr Ġ= Ġif Ġ( value ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . expression Stack . push ( this . construction . new Const ( int Repr , Ġtype Registry . bool Type . mode )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPush Ġan Ġinteger Ġliteral Ġinto Ġthe Ġcurrently Ġconstructed Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġliteral Int ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . expression Stack . push ( this . construction . new Const ( value , Ġtype Registry . int Type . mode )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġwhile - loop Ġwith Ġall Ġnecessary Ġcontrol Ġflow . ĠAll Ġcondition Ġexpressions Ġwill Ġbe Ġevaluated Ġusing Ġthe ĊĠĠĠĠ Ġ* Ġshort - circuit Ġrules . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwhile Statement ( while Statement : ĠSemantic AST . Statement . While Statement , Ġtransformer : ĠTransformation Method Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcondition Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġdo Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġafter Block Ġ= Ġconstruction . new Block () ĊĊĠĠĠĠĠĠĠ Ġcondition Block . add Pred ( construction . new J mp ()) ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġcondition Block ĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition ( while Statement . condition , Ġdo Block , Ġafter Block , Ġtransformer ) ĊĊĠĠĠĠĠĠĠ Ġdo Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġdo Block ĊĠĠĠĠĠĠĠ Ġwhile Statement . statement . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġcreate Un conditional Jump ( condition Block ) ĊĠĠĠĠĠĠĠ Ġcondition Block . m ature () ĊĊĠĠĠĠĠĠĠ Ġafter Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġafter Block ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġan Ġif - statement Ġand Ġall Ġnecessary Ġcontrol Ġflow . ĠAll Ġcondition Ġexpressions Ġwill Ġbe Ġevaluated Ġusing Ġthe ĊĠĠĠĠ Ġ* Ġshort - circuit Ġrules . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġif Statement ( ĊĠĠĠĠĠĠĠ Ġwith Else : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġif Statement : ĠSemantic AST . Statement . If Statement , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthen Block Ġ= Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġval Ġafter Block Ġ= Ġconstruction . new Block () ĊĊĠĠĠĠĠĠĠ Ġval Ġelse Block Ġ= Ġif Ġ( with Else ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Block () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Block ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Boolean Condition ( if Statement . condition , Ġthen Block , Ġelse Block , Ġtransformer ) ĊĠĠĠĠĠĠĠ Ġthen Block . m ature () ĊĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġthen Block ĊĠĠĠĠĠĠĠ Ġif Statement . then Case . accept ( transformer ) ĊĠĠĠĠĠĠĠ Ġcreate Un conditional Jump ( after Block ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( with Else ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Block . m ature () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġelse Block ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Statement . else Case ?. accept ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Un conditional Jump ( after Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġafter Block . m ature () ĊĠĠĠĠĠĠĠ Ġconstruction . current Block Ġ= Ġafter Block ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġan Ġun conditional Ġjump Ġ( iff Ġthe Ġblock Ġdoes Ġnot Ġcontain Ġa Ġ` return ` Ġstatement ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Un conditional Jump ( target : ĠBlock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! exit Blocks . contains ( construction . current Block )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . add Pred ( construction . new J mp ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġreturn Ġstatement Ġand Ġadd Ġthe Ġreturned Ġexpression Ġto Ġit , Ġif Ġany . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreturn Statement ( with Expression : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmem Ġ= Ġthis . construction . current Mem ĊĊĠĠĠĠĠĠĠ Ġval Ġreturn Node Ġ= Ġif Ġ( with Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Return ( mem , ĠarrayOf ( expression Stack . pop ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Return ( mem , Ġempty Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . return Nodes . add ( return Node ) ĊĠĠĠĠĠĠĠ Ġthis . exit Blocks . add ( construction . current Block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġspecial Ġreturn Ġstatement Ġfor Ġmain Ġmethods Ġ( which Ġreturns Ġ 0 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġspecial Main Return Statement () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreturn Node Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . new Return ( this . construction . current Mem , ĠarrayOf ( construction . new Const ( 0 , ĠMode . getIs ()))) ĊĠĠĠĠĠĠĠ Ġthis . return Nodes . add ( return Node ) ĊĠĠĠĠĠĠĠ Ġthis . exit Blocks . add ( construction . current Block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġan Ġaccess Ġnode Ġto Ġany Ġdefined Ġidentifier : ĠA Ġfield Ġof Ġthe Ġlocal Ġclass , Ġa Ġlocal Ġvariable Ġor Ġa Ġparameter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġidentifier Expression Ġthe Ġexpression Ġreferencing Ġthe Ġvalue Ġto Ġload ĊĠĠĠĠ Ġ* Ġ@ param Ġsurrounding Method Ġthe Ġmethod Ġthat Ġcontains Ġthe Ġ[ identifier Expression ] ĊĠĠĠĠ Ġ* Ġ@ param Ġtransformer Ġthe Ġ[ Transformation Method Visitor ] Ġthat Ġgenerates Ġcode Ġfor Ġthe Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġidentifier Read Access ( ĊĠĠĠĠĠĠĠ Ġidentifier Expression : ĠSemantic AST . Expression . Identifier Expression , ĊĠĠĠĠĠĠĠ Ġsurrounding Method : ĠSemantic AST . Class Member . Sub routine Declaration , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Node Ġ= Ġwhen Ġ( val Ġdefinition Ġ= Ġidentifier Expression . definition !!. node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġidentifier Expression Ġon Ġa Ġfield Ġis Ġalways Ġan Ġimplicit Ġfield Ġaccess Ġon Ġ` this `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġhave Ġto Ġload Ġthe Ġpointer . ĠIf Ġit Ġwasn 't Ġan Ġaccess Ġon Ġ` this `, Ġit Ġwouldn 't Ġbe Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġidentifier - expression Ġbut Ġa Ġfield - access - expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload This ( sur rounding Method Ġas ĠSemantic AST . Class Member . Sub routine Declaration . Method Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Node Ġ= Ġconstruction . new Load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Field Member ( definition . node ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition . type . mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( load Node , ĠMode . getM (), ĠLoad . pn M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( load Node , Ġidentifier Expression . definition !!. node . type . mode , ĠLoad . pn Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Local Variable Ġ-> Ġconstruction . get Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . local Variable Declarations [ definition . node ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition . node . type . mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Parameter Ġ-> Ġconstruction . get Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . parameter Declarations [ definition . node ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition . node . type . mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( value Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġ[ value ] Ġto Ġa Ġmember Ġor Ġvariable Ġidentified Ġby Ġ[ identifier Expression ] Ġand Ġthen Ġpush Ġ[ value ] Ġonto Ġthe ĊĠĠĠĠ Ġ* Ġexpression Ġstack . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġidentifier Write Access ( ĊĠĠĠĠĠĠĠ Ġidentifier Expression : ĠSemantic AST . Expression . Identifier Expression , ĊĠĠĠĠĠĠĠ Ġsurrounding Method : ĠSemantic AST . Class Member . Sub routine Declaration , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor , ĊĠĠĠĠĠĠĠ Ġvalue : ĠNode ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġdefinition Ġ= Ġidentifier Expression . definition !!. node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġidentifier Expression Ġon Ġa Ġfield Ġis Ġalways Ġan Ġimplicit Ġfield Ġaccess Ġon Ġ` this `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġhave Ġto Ġload Ġthe Ġpointer . ĠIf Ġit Ġwasn 't Ġan Ġaccess Ġon Ġ` this `, Ġit Ġwouldn 't Ġbe Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġidentifier - expression Ġbut Ġa Ġfield - access - expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload This ( sur rounding Method Ġas ĠSemantic AST . Class Member . Sub routine Declaration . Method Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Node Ġ= Ġconstruction . new Store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Field Member ( definition . node ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Registry . getField ( definition . node . owner . name . symbol , Ġdefinition . node . name . symbol ). type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( load Node , ĠMode . getM (), ĠLoad . pn M ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Local Variable Ġ-> Ġconstruction . set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . local Variable Declarations [ definition . node ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Node . Parameter Ġ-> Ġconstruction . set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . parameter Declarations [ definition . node ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġan Ġaccess Ġnode Ġto Ġany Ġdefined Ġfield Ġof Ġan Ġexplicit Ġtarget Ġexpression Ġ( like Ġ` a . field `). ĠImp licit Ġfield ĊĠĠĠĠ Ġ* Ġaccess Ġon Ġthe Ġ` this ` Ġpointer Ġare Ġnot Ġ[ Semantic AST . Expression . Field Access Expression ] Ġand Ġtherefore Ġnot Ġhandled Ġhere . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġaccess Ġis Ġwriting , Ġthe Ġnode Ġpushed Ġto Ġthe Ġexpression Ġstack Ġwill Ġbe Ġthe Ġaccessed Ġmember , Ġif Ġthe Ġaccess Ġis ĊĠĠĠĠ Ġ* Ġreading , Ġthe Ġnode Ġwill Ġbe Ġthe Ġmember 's Ġcontent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Access Expression Ġthe Ġexpression Ġreferencing Ġthe Ġfield Ġto Ġload ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfield Read Access ( ĊĠĠĠĠĠĠĠ Ġfield Access Expression : ĠSemantic AST . Expression . Field Access Expression , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Node Ġ= Ġconstruction . new Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Field Member ( field Access Expression . definition !!. node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Access Expression . definition !!. node . type . mode ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( load Node , ĠMode . getM (), ĠLoad . pn M ) ĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Access Expression . definition !!. node . type . mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad . pn Res ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġwrite Ġaccess Ġevent Ġto Ġa Ġfield Ġand Ġpush Ġthe Ġresult Ġvalue Ġonto Ġthe Ġexpression Ġstack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfield Write Access ( field Access Expression : ĠSemantic AST . Expression . Field Access Expression , Ġvalue : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Node Ġ= Ġconstruction . new Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Field Member ( field Access Expression . definition !!. node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Registry . getField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Access Expression . definition !!. node . owner . name . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Access Expression . field . symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). type ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( store Node , ĠMode . getM (), ĠStore . pn M ) ĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġfield Ġmember Ġnode Ġfor Ġaccess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Field Member ( field Declaration : ĠSemantic AST . Class Member . Field Declaration ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconstruction . new Member ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . pop (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Registry . getField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Declaration . owner . name . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Declaration . name . symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġmemory Ġaccess Ġto Ġan Ġarray . ĠThe Ġindex Ġcalculation Ġwill Ġbe Ġdone Ġmanually , Ġbecause Ġarray Ġin ĠMini - Java ĊĠĠĠĠ Ġ* Ġaren 't Ġfixed - size . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġarray Access Ġthe Ġarray Ġaccess Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġarray Read Access ( array Access : ĠSemantic AST . Expression . Array Access Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġaddress Node Ġ= Ġget Array Pointer ( array Access , Ġindex Node , Ġtarget Node ) ĊĊĠĠĠĠĠĠĠ Ġval Ġload Node Ġ= Ġconstruction . new Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access . actual Type . mode ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Mem Ġ= Ġconstruction . new Proj ( load Node , ĠMode . getM (), ĠLoad . pn M ) ĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġnew Mem ĊĊĠĠĠĠĠĠĠ Ġthis . expression Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Access . actual Type . to Variable Type (). mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad . pn Res ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġwrite Ġaccess Ġevent Ġto Ġan Ġarray Ġand Ġpush Ġthe Ġresult Ġvalue Ġonto Ġthe Ġexpression Ġstack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġarray Write Access ( array Access : ĠSemantic AST . Expression . Array Access Expression , Ġvalue : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Node Ġ= Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġaddress Node Ġ= Ġget Array Pointer ( array Access , Ġindex Node , Ġtarget Node ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Node Ġ= Ġconstruction . new Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . construction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Mem Ġ= Ġconstruction . new Proj ( store Node , ĠMode . getM (), ĠStore . pn M ) ĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġnew Mem ĊĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġthe Ġaddress Ġof Ġan Ġarray Ġelement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Array Pointer ( ĊĠĠĠĠĠĠĠ Ġarray Access : ĠSemantic AST . Expression . Array Access Expression , ĊĠĠĠĠĠĠĠ Ġindex Node : ĠNode , ĊĠĠĠĠĠĠĠ Ġtarget Node : ĠNode ĊĠĠĠ Ġ): ĠNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconstruction . new Add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Mul ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Const ( array Access . actual Type . mode . size Bytes , ĠMode . get Ls ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Conv ( index Node , ĠMode . get Ls ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġmethod Ġcall Ġand Ġpush Ġits Ġresult Ġonto Ġthe Ġexpression Ġstack . ĠIf Ġthe Ġcall Ġdoes Ġnot Ġreturn Ġa Ġvalue , Ġa ĊĠĠĠĠ Ġ* Ġdummy Ġvalue Ġwill Ġbe Ġplaced Ġon Ġthe Ġstack , Ġso Ġexpression - statements Ġ( which Ġcontain Ġmethod Ġcalls Ġthat Ġdon 't Ġreturn ĊĠĠĠĠ Ġ* Ġanything ) Ġdon 't Ġpop Ġwrong Ġdata Ġfrom Ġthe Ġstack . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmethod Invocation ( ĊĠĠĠĠĠĠĠ Ġmethod Invocation Expression : ĠSemantic AST . Expression . Method Invocation Expression , ĊĠĠĠĠĠĠĠ Ġsurrounding Method : ĠSemantic AST . Class Member . Sub routine Declaration ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Arguments Ġ= Ġmethod Invocation Expression . arguments . size ĊĊĠĠĠĠĠĠĠ Ġval Ġcall : ĠNode Ġ= Ġwhen Ġ( val Ġtype Ġ= Ġmethod Invocation Expression . type !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Method Invocation Expression . Type . Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġ( 0 Ġuntil ĠnumberOf Arguments ). map Ġ{ Ġthis . expression Stack . pop () Ġ}. as Re versed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtype Registry . get Internal Method ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Address ( method ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSemantic AST . Expression . Method Invocation Expression . Type . Normal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġno Ġtarget Ġis Ġspecified , Ġit Ġis Ġimplicit ely Ġ` this `, Ġbut Ġwe Ġneed Ġto Ġgenerate Ġthe Ġcode Ġfor Ġit Ġmanually , Ġbecause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtransformer Ġwon 't Ġdo Ġit Ġif Ġ` target Ġ== Ġnull ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Invocation Expression . target Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload This ( sur rounding Method Ġas ĠSemantic AST . Class Member . Sub routine Declaration . Method Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġexpression Stack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġ( 0 Ġuntil ĠnumberOf Arguments ). map Ġ{ Ġthis . expression Stack . pop () Ġ}. as Re versed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtype Registry . getMethod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . definition . node . owner . name . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Invocation Expression . method . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Address ( method ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( listOf ( target ) Ġ+ Ġargs ). to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Tuple Ġ= Ġconstruction . new Proj ( call , ĠMode . getT (), ĠCall . pn TResult ) ĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( call , ĠMode . getM (), ĠCall . pn M ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġspecial Ġcase Ġfor Ġ" void Ġreturn " ĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġmethod Invocation Expression . actual Type ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType Ġis ĠSemantic Type . Void ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . push ( construction . new Bad ( Mode . get ANY ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Proj ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Tuple , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġ` this ` Ġpointer Ġinto Ġexpression Ġstack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġload This ( method Declaration : ĠSemantic AST . Class Member . Sub routine Declaration . Method Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . get Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Registry . getClass Reference Type ( method Declaration . owner . name . symbol ). mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStore Ġthe Ġinitial Ġvalue Ġof Ġa Ġlocal Ġvariable Ġin Ġits Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlocal Variable Declaration ( ĊĠĠĠĠĠĠĠ Ġlocal Variable Declaration : ĠSemantic AST . Statement . Local Variable Declaration , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠTransformation Method Visitor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( local Variable Declaration . initializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . local Variable Declarations [ local Variable Declaration ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġa Ġnull - pointer Ġonto Ġthe Ġexpression Ġstack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġload Null () Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( construction . new Const ( 0 , ĠMode . getP ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġexpression Ġstatement Ġjust Ġp ops Ġthe Ġexpression Ġresult Ġfrom Ġthe Ġexpression Ġstack . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexpression Statement () Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression Stack . pop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllocate Ġspace Ġfor Ġan Ġarray Ġon Ġthe Ġheap Ġand Ġpush Ġthe Ġpointer Ġto Ġit Ġinto Ġthe Ġexpression Ġstack . ĠThe Ġallocated ĊĠĠĠĠ Ġ* Ġmemory Ġwill Ġbe Ġinitialized Ġconform ing Ġto Ġthe Ġjava Ġstandard . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Array Expression Ġthe Ġnew - array Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew Array Allocation ( new Array Expression : ĠSemantic AST . Expression . New Array Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Size Node Ġ= Ġconstruction . new Const ( new Array Expression . type . elementType . mode . size Bytes , ĠMode . get Lu ()) ĊĠĠĠĠĠĠĠ Ġval Ġarray Length Node Ġ= Ġconstruction . new Conv ( expression Stack . pop (), ĠMode . get Lu ()) ĊĠĠĠĠĠĠĠ Ġval Ġarray Size Node Ġ= Ġconstruction . new Mul ( type Size Node , Ġarray Length Node ) ĊĠĠĠĠĠĠĠ Ġallocate Memory ( construction . new Conv ( array Size Node , ĠMode . get Lu ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllocate Ġspace Ġfor Ġan Ġobject Ġon Ġthe Ġheap Ġand Ġpush Ġthe Ġpointer Ġto Ġit Ġinto Ġthe Ġexpression Ġstack . ĠThe Ġallocated ĊĠĠĠĠ Ġ* Ġmemory Ġwill Ġbe Ġinitialized Ġconform ing Ġto Ġthe Ġjava Ġstandard . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Object Expression Ġthe Ġnew - object Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew Object Allocation ( new Object Expression : ĠSemantic AST . Expression . New Object Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Size Node Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Const ( type Registry . getClass Type ( new Object Expression . type . name . symbol ). size , ĠMode . get Lu ()) ĊĠĠĠĠĠĠĠ Ġallocate Memory ( construction . new Conv ( type Size Node , ĠMode . get Lu ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllocate Ġmemory Ġand Ġpush Ġa Ġpointer Ġto Ġthat Ġmemory Ġonto Ġthe Ġexpression Ġstack . ĠThe Ġmemory Ġis Ġzero - initialized . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsize Node Ġa Ġnode Ġcontaining Ġthe Ġsize Ġof Ġallocated Ġmemory . ĠIt Ġmust Ġbe Ġof Ġtype ĠLu . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġallocate Memory ( size Node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtype Registry . allocate ĊĊĠĠĠĠĠĠĠ Ġval Ġcall Node Ġ= Ġconstruction . new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . current Mem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction . new Address ( method ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( size Node ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . type ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconstruction . current Mem Ġ= Ġconstruction . new Proj ( call Node , ĠMode . getM (), ĠCall . pn M ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Tuple Ġ= Ġconstruction . new Proj ( call Node , ĠMode . getT (), ĠCall . pn TResult ) ĊĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġconstruction . new Proj ( result Tuple , ĠMode . getP (), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġexpression Stack . push ( pointer ) ĊĠĠĠ Ġ} Ċ } Ċ