package Ġorg . lex em . ang mar . analyzer . nodes . functional . statements . loops Ċ Ċ import Ġorg . lex em . ang mar .* Ċ import Ġorg . lex em . ang mar . analyzer .* Ċ import Ġorg . lex em . ang mar . analyzer . data . primitives .* Ċ import Ġorg . lex em . ang mar . analyzer . nodes .* Ċ import Ġorg . lex em . ang mar . analyzer . stdlib .* Ċ import Ġorg . lex em . ang mar . parser . functional . statements . loops .* ĊĊ Ċ /** Ċ Ġ* ĠAnalyzer Ġfor Ġconditional Ġloop Ġstatements . Ċ Ġ*/ Ċ internal Ġobject ĠConditional Loop Stmt Analyzer Ġ{ ĊĠĠĠ Ġconst Ġval Ġsignal End Index Ġ= ĠAnalyzer Nodes Common s . signal Start Ġ+ Ġ 1 ĊĠĠĠ Ġconst Ġval Ġsignal End Condition Ġ= Ġsignal End Index Ġ+ Ġ 1 ĊĠĠĠ Ġconst Ġval Ġsignal End Then Block Ġ= Ġsignal End Condition Ġ+ Ġ 1 ĊĠĠĠ Ġconst Ġval Ġsignal End Last Clause Ġ= Ġsignal End Then Block Ġ+ Ġ 1 ĊĊĠĠĠ Ġ// ĠMETHO DS Ġ---------------------------------------------------------------- ĊĊĠĠĠ Ġfun Ġstate Machine ( analyzer : ĠLex em Analyzer , Ġsignal : ĠInt , Ġnode : ĠConditional Loop Stmt Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( signal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġan Ġintermediate Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Common s . create And Assign New Context ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġindex . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . addTo Stack ( Analyzer Common s . Identifiers . Loop Index Value , ĠL xm Integer . Num 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal End Index Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġindex . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Name Ġ= Ġanalyzer . memory . getLast From Stack () Ġas ĠL xm String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . rename Last Stack Cell ( Analyzer Common s . Identifiers . Loop Index Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġindex Ġin Ġthe Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . setProperty ( analyzer . memory , Ġindex Name . primitive , ĠL xm Integer . Num 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal End Condition Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġevaluate Condition ( analyzer , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal End Then Block Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIncrease Ġthe Ġcurrent Ġindex . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Iteration Index ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġcondition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal End Last Clause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġthe Ġcontrol Ġsignals . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Exit Control Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Control ) Ġas ĠL xm Control ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Tag Ġ= ĠAnalyzer Common s . getCurrent Context Tag ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro pag ate Ġthe Ġcontrol Ġsignal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( control . tag Ġ!= Ġnull Ġ&& Ġcontrol . tag Ġ!= Ġcontext Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠControl Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Control ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Next Control Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Control ) Ġas ĠL xm Control ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Tag Ġ= ĠAnalyzer Common s . getCurrent Context Tag ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro pag ate Ġthe Ġcontrol Ġsignal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( control . tag Ġ!= Ġnull Ġ&& Ġcontrol . tag Ġ!= Ġcontext Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠControl Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Control ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIncrease Ġthe Ġcurrent Ġindex . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Iteration Index ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġcondition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Redo Control Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Control ) Ġas ĠL xm Control ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Tag Ġ= ĠAnalyzer Common s . getCurrent Context Tag ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro pag ate Ġthe Ġcontrol Ġsignal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( control . tag Ġ!= Ġnull Ġ&& Ġcontrol . tag Ġ!= Ġcontext Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠControl Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Control ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġblock Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . then Block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Restart Control Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Control ) Ġas ĠL xm Control ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Tag Ġ= ĠAnalyzer Common s . getCurrent Context Tag ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro pag ate Ġthe Ġcontrol Ġsignal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( control . tag Ġ!= Ġnull Ġ&& Ġcontrol . tag Ġ!= Ġcontext Tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove ĠControl Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Control ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġagain Ġthe Ġloop . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . replace Stack Cell ( Analyzer Common s . Identifiers . Loop Index Value , ĠL xm Integer . Num 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġcondition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro pag ate Ġthe Ġcontrol Ġsignal . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Nodes Common s . signal Return Control Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġnode . parent Signal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġthe Ġnext Ġiteration Ġof Ġa Ġloop . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġevaluate Condition ( analyzer : ĠLex em Analyzer , Ġnode : ĠConditional Loop Stmt Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEvaluate Ġthe Ġcondition . ĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġanalyzer . memory . getLast From Stack () ĊĠĠĠĠĠĠĠ Ġvar Ġcondition Truthy Ġ= ĠRel ational Functions . is Truthy ( condition ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove ĠLast Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠ Ġanalyzer . memory . remove Last From Stack () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node . is Until ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Truthy Ġ= Ġ! condition Truthy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( condition Truthy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . then Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Value Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Loop Index Value ) Ġas ĠL xm Integer ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Value . primitive Ġ== Ġ 0 Ġ&& Ġnode . last Clause s ?. else Block Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . last Clause s !!. else Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Value . primitive Ġ!= Ġ 0 Ġ&& Ġnode . last Clause s ?. last Block Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġname Ġof Ġthe Ġintermediate Ġstatement . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . remove Property ( analyzer . memory , ĠAnalyzer Common s . Identifiers . Hidden Context Tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . last Clause s !!. last Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinish ( analyzer , Ġnode ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġanalyzer . next Node ( node . parent , Ġnode . parent Signal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIncrement Ġthe Ġiteration Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġincrement Iteration Index ( analyzer : ĠLex em Analyzer , Ġnode : ĠConditional Loop Stmt Node , Ġcount : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Loop Index Value ) Ġas ĠL xm Integer ĊĠĠĠĠĠĠĠ Ġval Ġnew Index Ġ= ĠL xm Integer . from ( last Index . primitive Ġ+ Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġanalyzer . memory . replace Stack Cell ( Analyzer Common s . Identifiers . Loop Index Value , Ġnew Index ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġindex Ġif Ġthere Ġis Ġan Ġindex Ġexpression . ĊĠĠĠĠĠĠĠ Ġif Ġ( node . index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Name Ġ= Ġanalyzer . memory . get From Stack ( Analyzer Common s . Identifiers . Loop Index Name ) Ġas ĠL xm String ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . setProperty ( analyzer . memory , Ġindex Name . primitive , Ġnew Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġthe Ġfinal ization Ġof Ġthe Ġloop . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfinish ( analyzer : ĠLex em Analyzer , Ġnode : ĠConditional Loop Stmt Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġintermediate Ġcontext . ĊĠĠĠĠĠĠĠ ĠAnalyzer Common s . remove Current Context And Assign Previous ( analyzer . memory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove ĠLoop Index Name Ġand ĠLoop Index Value Ġfrom Ġthe Ġstack . ĊĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Loop Index Value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node . index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalyzer . memory . remove From Stack ( Analyzer Common s . Identifiers . Loop Index Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ