package Ġnet . tor val d . ter ran vm . runtime . compiler . c flat Ċ Ċ import Ġnet . tor val d . ter ran vm . V MO p codes R ISC Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ /** Ċ Ġ* ĠA Ġcompiler Ġfor ĠC - flat Ġlanguage Ġthat Ġcompiles Ġinto ĠT err an VM ĠT erra ĠInstruction ĠSet . Ċ Ġ* Ċ Ġ* Ġ# ĠDis claimer Ċ Ġ* Ċ Ġ* Ġ 0 . ĠThis Ġcompiler , ĠBY ĠNO ĠME ANS , Ġguarantees Ġto Ġimplement Ġstandard ĠC Ġlanguage ; Ġc 'm on , Ġ$ 1 0 0 + Ġfor Ġa Ġstandard Ġdocument ? Ċ Ġ* Ġ 1 . ĠI Ġs uck Ġat Ġcode Ġand Ġtest . ĠPlease Ġreport Ġbugs ! Ċ Ġ* Ġ 2 . ĠPlease Ġmove Ġalong Ġwith Ġmy Ġter rible Ġsense Ġof Ġhum our . Ċ Ġ* Ċ Ġ* Ġ# ĠAbout ĠC - flat Ċ Ġ* Ċ Ġ* ĠC - flat Ġis Ġa Ġst upid Ġversion Ġof ĠC . ĠEverything Ġis Ġglobal Ġand Ġa Ġword Ġ( or Ġbyte Ġif Ġit 's Ġarray ). Ċ Ġ* Ċ Ġ* Ġ## ĠNew ĠFeatures Ċ Ġ* Ċ Ġ* Ġ- ĠType less Ġ( everything Ġis Ġa Ġword ), Ġnon - zero Ġis Ġtruth y Ġand Ġzero Ġis Ġf alsy Ċ Ġ* Ġ- ĠIn finite Ġloop Ġusing Ġ``` fore ver ``` Ġblock . ĠYou Ġcan Ġstill Ġuse Ġ``` for Ġ(;;) ``` , Ġ``` while Ġ( true ) ``` Ċ Ġ* Ġ- ĠCount ed Ġsimple Ġloop Ġ( without Ġloop Ġcounter Ġref ) Ġusing Ġ``` repeat ``` Ġblock Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ## ĠImport ant ĠChanges Ġfrom ĠC Ċ Ġ* Ċ Ġ* Ġ- ĠAll Ġfunction Ġdefinition Ġmust Ġspecify Ġreturn Ġtype , Ġeven Ġif Ġthe Ġtype Ġis Ġ``` void ``` . Ċ Ġ* Ġ- Ġ``` float ``` Ġis ĠIEEE Ġ 7 5 4 ĠBinary 3 2 . Ċ Ġ* Ġ- ĠEverything Ġis Ġglobal Ċ Ġ* Ġ- ĠEverything Ġis Ġa Ġword Ġ( 3 2 - bit ) Ċ Ġ* Ġ- ĠEverything Ġis Ġ``` int ``` , Ġ``` float ``` Ġand Ġ``` pointer ``` Ġat Ġthe Ġsame Ġtime . ĠYou Ġdecide . Ċ Ġ* Ġ- ĠUnary Ġpre - Ġand Ġpost - Ġincre ments / de crements Ġare Ġconsidered Ġ_ evil _ Ġand Ġthus Ġpro hibited . Ċ Ġ* Ġ- ĠUnsigned Ġtypes Ġare Ġalso Ġconsidered Ġ_ evil _ Ġand Ġthus Ġpro hibited . Ċ Ġ* Ġ- ĠEverything Ġexcept Ġfunction 's Ġlocal Ġvariable Ġis Ġ``` extern ``` , Ġany Ġusage Ġof Ġthe Ġkeyword Ġwill Ġthrow Ġerror . Ċ Ġ* Ġ- ĠFunction Ġcannot Ġhave Ġnon - local Ġvariable Ġdefined Ġinside , Ġas Ġ``` static ``` Ġkeyword Ġis Ġillegal . Ċ Ġ* Ġ- ĠAnd Ġthus , Ġfollowing Ġkeywords Ġwill Ġthrow Ġerror : Ċ Ġ* ĠĠĠĠĠ Ġ- Ġauto , Ġregister , Ġvolatile Ġ( not Ġsupported ) Ċ Ġ* ĠĠĠĠĠ Ġ- Ġsigned , Ġunsigned Ġ( pro hibited ) Ċ Ġ* ĠĠĠĠĠ Ġ- Ġstatic Ġ( no Ġglobal Ġinside Ġfunction ) Ċ Ġ* ĠĠĠĠĠ Ġ- Ġextern Ġ( everything Ġis Ġglobal ) Ċ Ġ* Ġ- ĠAssignment Ġdoes Ġnot Ġreturn Ġsh it . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ## ĠIssues Ċ Ġ* Ġ- ĠFIXME Ġ Ġarithmetic Ġops Ġwill Ġnot Ġwork Ġwith Ġintegers , Ġneed Ġto Ġaut ode t ect Ġtypes Ġand Ġs lap Ġin ĠADD INT Ġinstead Ġof Ġjust ĠADD Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġmin ja es ong Ġon Ġ 2 0 1 7 - 0 6 - 0 4 . Ċ Ġ*/ Ċ object ĠC flat Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstruct Open Ġ= Ġ'{ ' ĊĠĠĠ Ġprivate Ġval Ġstruct Close Ġ= Ġ' }' ĊĊĠĠĠ Ġprivate Ġval Ġp aren Open Ġ= Ġ'(' ĊĠĠĠ Ġprivate Ġval Ġp aren Close Ġ= Ġ')' ĊĊĠĠĠ Ġprivate Ġval Ġpre processor Token Sep Ġ= ĠRegex (""" [ Ġ\ t ]+ """) ĊĊĠĠĠ Ġprivate Ġval Ġnull char Ġ= Ġ 0 . to Char () ĊĊĠĠĠ Ġprivate Ġval Ġinfinite Lo ops Ġ= Ġarray ListOf < Regex >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex (""" while \( true \) "" "), Ġ// Ġwh ites p aces Ġare Ġfiltered Ġon Ġpreprocess ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex (""" for \ ([\ s ]* ; [\ s ]* ; [\ s ]* \) """) ĊĠĠĠ Ġ) Ġ// Ġmore Ġtypes Ġof Ġinfinite Ġloops Ġare Ġmust Ġbe Ġde alt Ġwith Ġ( e . g . Ġwhile Ġ( 0 xFFFFFFFF Ġ< Ġ 0 x 7 FFFF FFF )) ĊĊĠĠĠ Ġprivate Ġval Ġregex Register Literal Ġ= ĠRegex (""" ^[ Rr ][ 0 - 9 ]+ $ """) Ġ// Ġsame Ġas Ġthe Ġassembler ĊĠĠĠ Ġprivate Ġval Ġregex Boolean Whole Ġ= ĠRegex (""" ^( true | false )$ """) ĊĠĠĠ Ġprivate Ġval Ġregex Hex Whole Ġ= ĠRegex (""" ^( 0 [ Xx ][ 0 - 9 A - Fa - f _ ]+ ? )$ """) Ġ// ĠDI FFER ENT ĠFROM Ġthe Ġassembler ĊĠĠĠ Ġprivate Ġval Ġregex Oct Whole Ġ= ĠRegex (""" ^( 0 [ 0 - 7 _ ]+ )$ """) ĊĠĠĠ Ġprivate Ġval Ġregex Bin Whole Ġ= ĠRegex (""" ^( 0 [ Bb ][ 0 1 _ ]+ )$ """) Ġ// ĠDI FFER ENT ĠFROM Ġthe Ġassembler ĊĠĠĠ Ġprivate Ġval Ġregex FP Whole Ġ= Ġ ĠRegex (""" ^ ([- + ]? [ 0 - 9 ]* [ . ][ 0 - 9 ]+ [ e E ]* [- + 0 - 9 ]* [ f F ]* | [- + ]? [ 0 - 9 ]+ [ . e Ef F ][ 0 - 9 +- ]* [ f F ]? )$ """) Ġ// Ġsame Ġas Ġthe Ġassembler ĊĠĠĠ Ġprivate Ġval Ġregex Int Whole Ġ= ĠRegex (""" ^ ([- + ]? [ 0 - 9 _ ]+ [ Ll ]? )$ """) Ġ// ĠDI FFER ENT ĠFROM Ġthe Ġassembler ĊĊĠĠĠ Ġprivate Ġfun ĠString . matches Number Literal () Ġ= Ġthis . matches ( regex Hex Whole ) Ġ|| Ġthis . matches ( regex Oct Whole ) Ġ|| Ġthis . matches ( regex Bin Whole ) Ġ|| Ġthis . matches ( regex Int Whole ) Ġ|| Ġthis . matches ( regex FP Whole ) ĊĠĠĠ Ġprivate Ġfun ĠString . matches Float Literal () Ġ= Ġthis . matches ( regex FP Whole ) ĊĠĠĠ Ġprivate Ġfun ĠString . matches StringLiteral () Ġ= Ġthis . endsWith ( 0 . to Char ()) ĊĠĠĠ Ġprivate Ġfun Ġgenerate Temporary Var Name ( inst : ĠString , Ġarg 1 : ĠString , Ġarg 2 : ĠString ) Ġ= Ġ"$ $ ${ inst }_${ arg 1 }_ $ arg 2 " ĊĠĠĠ Ġprivate Ġfun Ġgenerate Super Temporary Var Name ( lineNum : ĠInt , Ġinst : ĠString , Ġarg 1 : ĠString , Ġarg 2 : ĠString ) Ġ= Ġ"$ $ ${ inst }_${ arg 1 }_${ arg 2 }_ \$ l $ lineNum " ĊĊĊĠĠĠ Ġprivate Ġval Ġregex Var Name Whole Ġ= ĠRegex (""" ^ ([ A - Za - z _ ][ A - Za - z 0 - 9 _ ]*) $ """) ĊĊĠĠĠ Ġprivate Ġval Ġregex Whitespace No SP Ġ= ĠRegex (""" [\ t \ r \ n \ v \ f ] """) ĊĠĠĠ Ġprivate Ġval Ġregex Ind ents Ġ= ĠRegex (""" ^ Ġ+ | ^\ t + |( ? <= \ n ) Ġ+ |( ? <= \ n )\ t + """) ĊĊĠĠĠ Ġprivate Ġval Ġdig raph s Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< :" Ġto Ġ'[ ', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ": >" Ġto Ġ' ]', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< %" Ġto Ġ'{ ', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"% >" Ġto Ġ' }', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"% :" Ġto Ġ'#' ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġtri graphs Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? =" Ġto Ġ"# ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? /" Ġto Ġ"'", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? '" Ġto Ġ"^ ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? (" Ġto Ġ"[", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? )" Ġto Ġ" ]", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? !" Ġto Ġ"| ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? < " Ġto Ġ"{ ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"? ?>" Ġto Ġ" }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ?? -" Ġto Ġ"~ " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġkeywords Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclassic ĠC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto "," break "," case "," char "," const "," continue "," default "," do "," double "," else "," enum "," extern "," float ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" for "," goto "," if "," int "," long "," register "," return "," short "," signed "," static "," struct "," switch "," sizeof ", Ġ// Ġis Ġan Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" typedef "," union "," unsigned "," void "," volatile "," while ", ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC - flat Ġcode Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" fore ver "," repeat " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC - flat Ġdropped Ġkeywords Ġ( keywords Ġthat Ġwon 't Ġdo Ġanything / be have Ġdifferently Ġthan ĠC 9 5 , Ġetc . ): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ- Ġauto , Ġregister , Ġsigned , Ġunsigned , Ġvolatile , Ġstatic : Ġnot Ġimplemented ; ĠWILL ĠTHROW ĠERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ- Ġfloat : Ġwill Ġact Ġsame Ġas Ġdouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ- Ġextern : Ġever thing Ġis Ġglobal , Ġanyway ; ĠWILL ĠTHROW ĠERROR ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC - flat Ġexclusive Ġkeywords : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ- Ġbool , Ġtrue , Ġfalse : Ġbool Ġalgebra ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġunsupported Keywords Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto "," register "," signed "," unsigned "," volatile "," static ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" extern ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" long ", Ġ" short ", Ġ" double ", Ġ" bool " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġoperators Hierarchy Internal Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġop ir ator Ġprecedence Ġin Ġinternal Ġformat Ġ(# _ name in lowercase ) Ġ ĠPUT ĠNO ĠP ARE NS ĠHERE ! ĠĠ ĠTODO Ġ[ Ġ] Ġare Ġallowed ? Ġpl s Ġchk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmost Ġimportant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" ++ "," -- "," [ ", Ġ"] "," ."," -> "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("# _ pre inc "," #_ pre dec "," #_ unary plus "," #_ unary minus "," ! "," ~ "," #_ ptr deref "," #_ address of "," sizeof "," ( char Ġ*) "," ( short Ġ*) "," ( int Ġ*) "," ( long Ġ*) "," ( float Ġ*) "," ( double Ġ*) "," ( bool Ġ*) "," ( void Ġ*) ", Ġ"( char ) "," ( short ) "," ( int ) "," ( long ) "," ( float ) "," ( double ) "," ( bool )"), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("* "," / "," %"), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("+ "," - "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" << ", "> >", "> >> "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("< "," < =", "> ", "> =" ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" ==" ," ! =" ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("& "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("^ "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of ("| "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" && "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" || "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" ?", ": "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (" =" ," +=" ," - =" ," * =" ," / =" ,"% =" ," << =", ">> =" ," & =" ," ^ =" ," | =" ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Set Of (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleast Ġimportant ĊĠĠĠ Ġ). reversed Array () Ġ// Ġthis Ġmakes Ġop Ġwith Ġhighest Ġprecedence Ġhave Ġbigger Ġnumber ĊĠĠĠ Ġ// Ġoperators Ġmust Ġreturn Ġvalue Ġwhen ĠT REE Ġis Ġevaluated Ġ-- Ġwith ĠNO ĠEXCEPTION ; Ġ'=' Ġmust Ġreturn Ġvalue Ġtoo ! Ġ( not Ġjust Ġbecause Ġof ĠC Ġstandard , Ġbut Ġdesign Ġof Ġ# _ assign var ) ĊĠĠĠ Ġprivate Ġval Ġunary Ops Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ++ "," -- ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"# _ pre inc "," #_ pre dec "," #_ unary plus "," #_ unary minus "," ! "," ~ "," #_ ptr deref "," #_ address of "," sizeof "," ( char Ġ*) "," ( short Ġ*) "," ( int Ġ*) "," ( long Ġ*) "," ( float Ġ*) "," ( double Ġ*) "," ( bool Ġ*) "," ( void Ġ*) ", Ġ"( char ) "," ( short ) "," ( int ) "," ( long ) "," ( float ) "," ( double ) "," ( bool )" ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġoperators Hierarchy RTL Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , false , false , false , false , false , false , false , false , false , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , true , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġoperators No Order Ġ= ĠHashSet < String >() ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġoperators Hierarchy Internal . forEach Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . forEach Ġ{ Ġword Ġ-> Ġoperators No Order . add ( word ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġsplit table Tokens Ġ= ĠarrayOf ( Ġ// Ġorder Ġis Ġimportant ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"<< =", ">> =" ," ...", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ++ "," -- "," && "," || "," << ", ">> "," -> "," < =", "> =" ," ==" ," ! =" ," +=" ," - =" ," * =" ," / =" ,"% =" ," & =" ," ^ =" ," | =", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< ", "> "," ^ "," | "," ?", ": "," =", ", "," ."," + "," - "," ! "," ~ "," * "," & "," / "," % "," (",") ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ" ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġargument Def Bad Tokens Ġ= Ġsplit table Tokens . to Mutable List (). minus ("," ). minus ("* "). minus (" ... "). to HashSet () ĊĠĠĠ Ġprivate Ġval Ġev il Operators Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ++ "," -- " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfunc Annotations Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto ", Ġ// Ġdoes Ġnothing ; Ġuseless Ġeven Ġin ĠC Ġ( it 's Ġderived Ġfrom ĠB Ġlanguage , Ġactually ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" extern " Ġ// Ġnot Ġused Ġin ĠC - flat ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfunc Types Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" char ", Ġ" short ", Ġ" int ", Ġ" long ", Ġ" float ", Ġ" double ", Ġ" bool ", Ġ" void " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġvar Annotations Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto ", Ġ// Ġdoes Ġnothing ; Ġuseless Ġeven Ġin ĠC Ġ( it 's Ġderived Ġfrom ĠB Ġlanguage , Ġactually ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" extern ", Ġ// Ġnot Ġused Ġin ĠC - flat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" const ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" register " Ġ// Ġnot Ġused Ġin ĠC - flat ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġvar Types Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" struct ", Ġ" char ", Ġ" short ", Ġ" int ", Ġ" long ", Ġ" float ", Ġ" double ", Ġ" bool ", Ġ" var ", Ġ" val " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġvalid Func Pre word Ġ= Ġ( func Annotations Ġ+ Ġfunc Types ). to HashSet () ĊĠĠĠ Ġprivate Ġval Ġvalid Variable Pre word Ġ= Ġ( var Annotations Ġ+ Ġvar Types ). to HashSet () ĊĠĠĠ Ġprivate Ġval Ġcode Block Keywords Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" do ", Ġ" else ", Ġ" enum ", Ġ" for ", Ġ" if ", Ġ" struct ", Ġ" switch ", Ġ" union ", Ġ" while ", Ġ" fore ver ", Ġ" repeat " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfunctional Keywords With One Arg Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" goto ", Ġ" return " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfunctional Keywords No Arg Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" break ", Ġ" continue ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return " Ġ// Ġreturn Ġnothing ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġpre processor Keywords Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"# include "," # ifndef "," # ifdef "," # define "," # if "," # else "," # elif "," # endif "," # undef "," # pragma " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġescape Sequences Ġ= Ġhash Map Of < String , ĠChar >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ a """ Ġto Ġ 0 x 0 7 . to Char (), Ġ// ĠAlert Ġ( Be ep , ĠB ell ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ b """ Ġto Ġ 0 x 0 8 . to Char (), Ġ// ĠBack space ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ f """ Ġto Ġ 0 x 0 C . to Char (), Ġ// ĠForm feed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ n """ Ġto Ġ 0 x 0 A . to Char (), Ġ// ĠNew line Ġ( Line ĠFeed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ r """ Ġto Ġ 0 x 0 D . to Char (), Ġ// ĠCar riage ĠReturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ t """ Ġto Ġ 0 x 0 9 . to Char (), Ġ// ĠHorizontal ĠTab ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ v """ Ġto Ġ 0 x 0 B . to Char (), Ġ// ĠVertical ĠTab ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \\ """ Ġto Ġ 0 x 5 C . to Char (), Ġ// ĠBack slash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \' """ Ġto Ġ 0 x 2 7 . to Char (), Ġ// ĠSingle Ġquot ation Ġmark ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \"" "" Ġto Ġ 0 x 2 2 . to Char (), Ġ// ĠDouble Ġquot ation Ġmark ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" \ ? """ Ġto Ġ 0 x 3 F . to Char () Ġ Ġ// Ġ uest ion Ġmark Ġ( used Ġto Ġavoid Ġtri graphs ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġbuiltin Functions Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"# _ declare var " Ġ// Ġ# _ declare var ( Syntax TreeNode < Raw String > Ġvar name , ĠSyntax TreeNode < Raw String > Ġv art ype ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfunction With Single Arg No Paren Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return ", Ġ" goto ", Ġ" come from " ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġcompiler Internal Func Args Count Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"# _ declare var " Ġto Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" end func def " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"=" Ġto Ġ 2 , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" endif " Ġto Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" en del se " Ġto Ġ 0 ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġ/* ĠError Ġmessages Ġ*/ ĊĊĠĠĠ Ġval Ġerror Un declared Variable Ġ= Ġ" Un declared Ġvariable " ĊĠĠĠ Ġval Ġerror In compatible Type Ġ= Ġ" In compatible Ġtype ( s )" ĊĠĠĠ Ġval Ġerror Re declaration Ġ= Ġ" Re declaration " ĊĊĊĠĠĠ Ġfun Ġsizeof Primitive ( type : ĠString ) Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" char " Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ" short " Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġ" int " Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġ" long " Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠ Ġ" bool " Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ" void " Ġ-> Ġ 1 Ġ// ĠGCC Ġfeature ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġprimitive Ġtype : Ġ$ type ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfunctions Implicit End Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" if ", Ġ" else ", Ġ" for ", Ġ" while ", Ġ" switch " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġexpr To IR Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"# _ declare var " Ġto Ġ" DECLARE ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return " Ġto Ġ" RETURN ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" +" Ġto Ġ" ADD ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-" Ġto Ġ" SUB ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"*" Ġto Ġ" MUL ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/" Ġto Ġ" DIV ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"^ " Ġto Ġ" PO W ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"% " Ġto Ġ" MOD ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" <<" Ġto Ġ" SH L ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >> " Ġto Ġ" SH R ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >> >" Ġto Ġ" US HR ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" and " Ġto Ġ" AND ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" or " Ġto Ġ" OR ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" xor " Ġto Ġ" XOR ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" not " Ġto Ġ" NOT ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"=" Ġto Ġ" ASSIGN ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ==" Ġto Ġ" I SEQ ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"! =" Ġto Ġ" IS N EQ ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" >" Ġto Ġ" IS GT ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< " Ġto Ġ" IS LS ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġto Ġ" IS G TE Q ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġto Ġ" IS L SEQ ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" if " Ġto Ġ" IF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" endif " Ġto Ġ" ENDIF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" else " Ġto Ġ" ELSE ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" en del se " Ġto Ġ" EN DEL SE ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" goto " Ġto Ġ" G OT OL AB EL ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" come from " Ġto Ġ" DE FL AB EL ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" asm " Ġto Ġ" INLINE ASM ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" func def " Ġto Ġ" FUNC DEF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" end func def " Ġto Ġ" END FUNC DEF ", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" stack push " Ġto Ġ" STACK PUSH " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġir Cmp Inst Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" I SEQ _ II ", Ġ" I SEQ _ IF ", Ġ" I SEQ _ FI ", Ġ" I SEQ _ FF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IS N EQ _ II ", Ġ" IS N EQ _ IF ", Ġ" IS N EQ _ FI ", Ġ" IS N EQ _ FF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IS GT _ II ", Ġ" IS GT _ IF ", Ġ" IS GT _ FI ", Ġ" IS GT _ FF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IS LS _ II ", Ġ" IS LS _ IF ", Ġ" IS LS _ FI ", Ġ" IS LS _ FF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IS G TE Q _ II ", Ġ" IS G TE Q _ IF ", Ġ" IS G TE Q _ FI ", Ġ" IS G TE Q _ FF ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IS L SEQ _ II ", Ġ" IS L SEQ _ IF ", Ġ" IS L SEQ _ FI ", Ġ" IS L SEQ _ FF " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġjmp Commands Ġ= Ġhash Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" J MP ", Ġ" JZ ", Ġ" J NZ ", Ġ" J GT ", Ġ" J LS " ĊĠĠĠ Ġ) ĊĊĊĊĊ ĊĊĠĠĠ Ġ// Ġcompiler Ġoptions ĊĠĠĠ Ġvar Ġuse Dig raph Ġ= Ġtrue ĊĠĠĠ Ġvar Ġuse Tri graph Ġ= Ġfalse ĊĠĠĠ Ġvar Ġerror In compatible s Ġ= Ġtrue ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoptions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Dig raph : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Tri graph : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror In compatible : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . use Dig raph Ġ= Ġuse Dig raph ĊĠĠĠĠĠĠĠ Ġthis . use Tri graph Ġ= Ġuse Tri graph ĊĠĠĠĠĠĠĠ Ġthis . error In compatible s Ġ= Ġerror In compatible ĊĊĊĠĠĠĠĠĠĠ Ġ// val Ġtree Ġ= Ġtoken ise ( preprocess ( program )) ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġstruct Dict Ġ= ĠArrayList < C Struct >() ĊĠĠĠ Ġprivate Ġval Ġstruct Name Dict Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġval Ġfunc Dict Ġ= ĠArrayList < C Function >() ĊĠĠĠ Ġprivate Ġval Ġfunc Name Dict Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġval Ġvar Dict Ġ= ĠHashSet < C Data >() ĊĠĠĠ Ġprivate Ġval Ġvar Name Dict Ġ= ĠHashSet < String >() ĊĊĊĠĠĠ Ġprivate Ġval Ġincludes User Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġval Ġincludes Lib Ġ= ĠHashSet < String >() ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Func ByName ( name : ĠString ): ĠC Function ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfunc Dict . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== Ġname ) Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġstruct Search ByName ( name : ĠString ): ĠC Struct ? Ġ{ ĊĠĠĠĠĠĠĠ Ġstruct Dict . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== Ġname ) Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġpreprocess ( program : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprogram Ġ= Ġprogram ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . replace ( regex Ind ents , Ġ"") Ġ// Ġmust Ġcome Ġbefore Ġregex Whitespace No SP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . replace ( regex Whitespace No SP , Ġ"") ĊĊĠĠĠĠĠĠĠ Ġvar Ġout Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( use Tri graph ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtri graphs . forEach Ġ{ Ġfrom , Ġto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Ġ= Ġprogram . replace ( from , Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrules Ġ= ĠPre processor Rules () ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠScan Ġth ru Ġline Ġby Ġline Ġ( ass uming Ġsingle Ġcommand Ġper Ġline ... ?) ĊĠĠĠĠĠĠĠ Ġprogram . lines (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . startsWith ('# ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġit . split ( preprocessor Token Sep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġtokens [ 0 ]. drop ( 1 ). toLowerCase () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( cmd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" include " Ġ-> ĠTODO (" Pre processor Ġkeyword Ġ' include '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" define " Ġ-> Ġrules . add Definition ( tokens [ 1 ], Ġtokens . sub List ( 2 , Ġtokens . size ). join ToString (" Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" undef " Ġ-> Ġrules . remove Definition ( tokens [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUndefined Statement (" Pre processor Ġmacro Ġ'$ cmd ' Ġis Ġnot Ġsupported .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprocess Ġeach Ġline Ġaccording Ġto Ġrules ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrules . forEach Keyword For Tokens Ġ{ Ġreplace Regex , Ġreplace Word Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġline . replace ( replace Regex , Ġ" Ġ$ replace Word Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ("$ line \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprintln ( out . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠNo Ġpre processor Ġshould Ġexist Ġat Ġthis Ġstage ! Ġ*/ ĊĠĠĠ Ġfun Ġtoken ise ( program : ĠString ): ĠArrayList < Line Structure > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdebug 1 ( any : ĠAny ) Ġ{ Ġif Ġ( true ) Ġprintln ( any ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ////////////////////////////////// / ĊĠĠĠĠĠĠĠ Ġ// ĠSTEP Ġ 0 . ĠDiv ide Ġthings Ġclean ly Ġ// ĊĠĠĠĠĠĠĠ Ġ////////////////////////////////// / ĊĠĠĠĠĠĠĠ Ġ// Ġa . k . a . Ġtoken ise Ġproperly Ġe . g . Ġ{ extern Ġint Ġfoo Ġ( Ġint Ġinit Size Ġ, ĠSome Struct Ġstr ut Ġ, Ġ)} Ġor Ġ{ int Ġfoo Ġ= Ġget ch Ġ( Ġ) Ġ* Ġ( Ġ( Ġnum 1 Ġ+ Ġnum 3 Ġ% Ġ 1 6 Ġ) Ġ- Ġ 1 Ġ)} ĊĊĠĠĠĠĠĠĠ Ġval Ġline Structures Ġ= ĠArrayList < Line Structure >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Program LineNumber Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Ġ= ĠLine Structure ( current Program LineNumber , Ġ 0 , ĠArrayList < String >()) ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġput Ġthings Ġto Ġline Structure , Ġkill Ġany Ġwhitespace ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġchar Ctr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġstructure Depth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġsplit And Move Al ong () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sb . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error In compatible s Ġ&& Ġunsupported Keywords . contains ( sb . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ current Program LineNumber Ġwith Ġtoken Ġ'$ sb '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġsplit : Ġdepth Ġ$ structure Depth , Ġword Ġ'$ sb '") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line . depth Ġ= Ġstructure Depth Ġ// Ġ! important ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line . tokens . add ( sb . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġgoto New line () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Line . tokens . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Structures . add ( current Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Ġ= ĠLine Structure ( current Program LineNumber , Ġ- 1 3 3 7 , ĠArrayList < String >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġfor Statement Eng aged Ġ= Ġfalse Ġ// Ġto Ġfilter ĠFOR Ġrange Ġsem icolon Ġfrom Ġstatement - end Ġsem icolon ĊĠĠĠĠĠĠĠ Ġvar Ġis Literal Mode Ġ= Ġfalse Ġ// Ġ"" Ġ Ġ'' ĊĠĠĠĠĠĠĠ Ġvar Ġis Char Literal Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Line Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Block Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ( char Ctr Ġ< Ġprogram . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchar Ġ= Ġprogram [ char Ctr ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlook ahead 4 Ġ= Ġprogram . substring ( char Ctr , Ġmin Of ( char Ctr Ġ+ Ġ 4 , Ġprogram . length )) Ġ// Ġchar Of Index Ġ{ 0 , Ġ 1 , Ġ 2 , Ġ 3 } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlook ahead 3 Ġ= Ġprogram . substring ( char Ctr , Ġmin Of ( char Ctr Ġ+ Ġ 3 , Ġprogram . length )) Ġ// Ġchar Of Index Ġ{ 0 , Ġ 1 , Ġ 2 } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlook ahead 2 Ġ= Ġprogram . substring ( char Ctr , Ġmin Of ( char Ctr Ġ+ Ġ 2 , Ġprogram . length )) Ġ// Ġchar Of Index Ġ{ 0 , Ġ 1 } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlook behind 2 Ġ= Ġprogram . substring ( max Of ( char Ctr Ġ- Ġ 1 , Ġ 0 ), Ġchar Ctr Ġ+ Ġ 1 ) Ġ// Ġchar Of Index Ġ{- 1 , Ġ 0 } ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcount Ġup Ġline Ġnum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'\ n ' Ġ&& Ġ! is Char Literal Ġ&& Ġ! is Literal Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Program LineNumber Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line . lineNum Ġ= Ġcurrent Program LineNumber ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Line Comment ) Ġis Line Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( char Ġ== Ġ'\ n ' Ġ&& Ġis Literal Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// throw ĠSyntax Error (" at Ġline Ġ$ current Program LineNumber Ġ-- Ġline Ġbreak Ġused Ġinside Ġof Ġstring Ġliteral ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġ\ n Ġby Ġdoing Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( look ahead 2 Ġ== Ġ"// " Ġ&& Ġ! is Line Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Line Comment Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! is Block Comment Ġ&& Ġlook ahead 2 Ġ== Ġ" /* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Block Comment Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! is Block Comment Ġ&& Ġlook ahead 2 Ġ== Ġ" */ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Block Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! is Literal Mode Ġ&& Ġ! is Char Literal Ġ&& Ġ! is Block Comment Ġ&& Ġ! is Line Comment Ġ&& Ġchar . toString (). matches ( regex Whitespace No SP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! is Literal Mode Ġ&& Ġ! is Char Literal Ġ&& Ġ! is Block Comment Ġ&& Ġ! is Line Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreplace Ġdig raph s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Dig raph Ġ&& Ġdig raph s . containsKey ( look ahead 2 )) Ġ{ Ġ// Ġreplace Ġdig raph s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ= Ġdig raph s [ look ahead 2 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook ahead 4 Ġ= Ġchar Ġ+ Ġlook ahead 4 . substring ( 0 .. look ahead 4 . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook ahead 3 Ġ= Ġchar Ġ+ Ġlook ahead 3 . substring ( 0 .. look ahead 3 . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook ahead 2 Ġ= Ġchar Ġ+ Ġlook ahead 2 . substring ( 0 .. look ahead 2 . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook behind 2 Ġ= Ġlook behind 2 . substring ( 0 .. look ahead 2 . last Index Ġ- Ġ 1 ) Ġ+ Ġchar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter Ġsh its ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( look ahead 2 Ġ== Ġ"// " Ġ|| Ġlook ahead 2 Ġ== Ġ" /* " Ġ|| Ġlook ahead 2 Ġ== Ġ" */ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" at Ġline Ġ$ current Program LineNumber Ġ-- Ġillegal Ġtoken Ġ'$ look ahead 2 '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġthe Ġreal Ġjobs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġstruct Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġmet Ġstruct Open Ġat Ġline Ġ$ current Program LineNumber ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto New line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstructure Depth Ġ+= Ġ 1 Ġ// Ġmust Ġgo Ġlast , Ġbecause Ġof Ġqu ir ks Ġwith Ġ' code block {' Ġand Ġ' code block Ġ Ġ{' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( char Ġ== Ġstruct Close ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġmet Ġstruct Close Ġat Ġline Ġ$ current Program LineNumber ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstructure Depth Ġ-= Ġ 1 Ġ// Ġmust Ġgo Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto New line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdouble Ġquotes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( char Ġ== Ġ'"' Ġ&& Ġlook behind 2 [ 0 ] Ġ!= Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Literal Mode Ġ= Ġ! is Literal Mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchar Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! is Char Literal Ġ&& Ġchar Ġ== Ġ'\'' Ġ&& Ġlook behind 2 [ 0 ] Ġ!= Ġ'\' ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( look ahead 4 [ 1 ] Ġ== Ġ'\\ ' Ġ&& Ġlook ahead 4 [ 3 ] Ġ!= Ġ'\' ') Ġ|| Ġ( look ahead 4 [ 1 ] Ġ!= Ġ'\\ ' Ġ&& Ġlook ahead 4 [ 2 ] Ġ!= Ġ'\'' )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" Illegal Ġusage Ġof Ġchar Ġliteral ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Char Literal Ġ= Ġ! is Char Literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ-- ĠTODO Ġ-- ĠFOR Ġstatement Ġis Ġnow Ġa Ġspecial Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! for Statement Eng aged Ġ&& Ġchar Ġ== Ġ'; ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto New line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split table Tokens . contains ( look ahead 3 )) Ġ{ Ġ// Ġthree - char Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () Ġ// Ġsplit Ġpreviously Ġaccumulated Ġword ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( look ahead 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( split table Tokens . contains ( look ahead 2 )) Ġ{ Ġ// Ġtwo - char Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () Ġ// Ġsplit Ġpreviously Ġaccumulated Ġword ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( evil Operators . contains ( look ahead 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ current Program LineNumber Ġ-- Ġev il Ġoperator Ġ'$ look ahead 2 '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( look ahead 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( split table Tokens . contains ( char . toString ())) Ġ{ Ġ// Ġoperator Ġand Ġ' Ġ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'.') Ġ{ Ġ// Ġstruct Ġreference Ġor Ġdecimal Ġpoint , Ġdepending Ġon Ġthe Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 's Ġdecimal Ġif : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. [ number ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ\ . e [ +- ]? [ 0 - 9 ]+ ĠĠ Ġ( exponent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ[ number ].[ Ġf F ]? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġspaces Ġaround Ġdecimal Ġpoints Ġare ĠNOT ĠALLOW ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( look ahead 2 . matches ( Regex (""" \. [ 0 - 9 ] "" ")) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlook ahead 4 . matches ( Regex (""" \. e [ +- ]? [ 0 - 9 ]+ "" ")) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( look behind 2 . matches ( Regex (""" [ 0 - 9 ]+ \. "" ")) Ġand Ġlook ahead 2 . matches ( Regex (""" \. [ ĠF f , )] "" "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġmatch Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchar Holder : ĠChar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġneed Ġtravel Ġback Ġbecause Ġ' else ' Ġclause Ġon Ġthe Ġfar Ġbottom Ġhave Ġbeen Ġalready Ġputting Ġnumbers Ġinto Ġthe ĠstringBuilder ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtravel For th Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtravel For th Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Holder Ġ= Ġprogram [ char Ctr Ġ+ Ġtravel For th ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( char Holder Ġin Ġ' 0 ' .. ' 9 ' Ġ|| Ġchar Holder . toString (). matches ( Regex (""" [- + e Ef F ] "" "))) ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Word Ġ= Ġprogram . substring ( char Ctr .. char Ctr Ġ+ Ġtravel For th Ġ- Ġ 1 ) ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 ("[ C - flat . token ise ] Ġdecimal Ġnumber Ġtoken : Ġ$ sb $ number Word , Ġon Ġline Ġ$ current Program LineNumber ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( number Word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġtravel For th Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġ// Ġreference Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () Ġ// Ġsplit Ġpreviously Ġaccumulated Ġword ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 ("[ C - flat . token ise ] Ġsplit table Ġtoken : Ġ$ char , Ġon Ġline Ġ$ current Program LineNumber ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( char Ġ!= Ġ' Ġ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () Ġ// Ġsplit Ġpreviously Ġaccumulated Ġword ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 ("[ C - flat . token ise ] Ġsplit table Ġtoken : Ġ$ char , Ġon Ġline Ġ$ current Program LineNumber ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġ// Ġspace Ġdetected , Ġsplit Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Move Al ong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Char Literal Ġ&& Ġ! is Literal Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'\\ ') Ġ{ Ġ// Ġescape Ġsequence Ġof Ġchar Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( escape Sequences [ look ahead 2 ] !!. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( is Literal Mode Ġ&& Ġ! is Char Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'"' Ġ&& Ġlook behind 2 [ 0 ] Ġ!= Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Literal Mode Ġ= Ġ! is Literal Mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ctr Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġline Structures ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġroot NodeName Ġ= Ġ" c flat _ node _ root " ĊĊĠĠĠ Ġfun Ġbuild Tree ( line Structures : ĠList < Line Structure >): ĠSyntax TreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdebug 1 ( any : ĠAny ) Ġ{ Ġif Ġ( true ) Ġprintln ( any ) Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// //////////////////////// / ĊĠĠĠĠĠĠĠ Ġ// ĠSTEP Ġ 1 . ĠCreate Ġa Ġtree Ġ// ĊĠĠĠĠĠĠĠ Ġ// //////////////////////// / ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġstep , Ġwe Ġbuild Ġtree Ġfrom Ġthe Ġline Ġstructures Ġparsed Ġby Ġthe Ġparser . Ġ// ĊĊĠĠĠĠĠĠĠ Ġval ĠAST root Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ DEF , ĠReturn Type . NOTH ING , Ġname Ġ= Ġroot NodeName , Ġis Root Ġ= Ġtrue , ĠlineNumber Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġworking Nodes Ġ= ĠStack < Syntax TreeNode >() ĊĠĠĠĠĠĠĠ Ġworking Nodes . push ( AST root ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Working Node () Ġ= Ġworking Nodes . peek () ĊĊĊĊĠĠĠĠĠĠĠ Ġfun Ġprint Stack Debug (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Node Ġstack : Ġ[ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworking Nodes . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġ{ Ġsb . append (", Ġ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" l "); Ġsb . append ( it . line Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ]") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġline Structures . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> Ġval Ġ( lineNum , Ġdepth , Ġtokens ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Line Depth Ġ= Ġif Ġ( index Ġ!= Ġline Structures . last Index ) Ġline Structures [ index Ġ+ Ġ 1 ]. depth Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" build tree !! Ġ Ġtokens : Ġ$ tokens ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" call Ġ#$ index Ġfrom Ġbuild Tree () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Built Ġ= Ġas TreeNode ( lineNum , Ġtokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Working Node (). add Statement ( node Built ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" end Ġcall Ġ#$ index Ġfrom Ġbuild Tree () ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nextLine Depth Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġcode Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nextLine Depth Ġ> Ġdepth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Nodes . push ( node Built ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcode Ġblock Ġescape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( nextLine Depth Ġ< Ġdepth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( depth Ġ- Ġnext Line Depth ) Ġ{ Ġworking Nodes . pop () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// //////////////////////// /////// ĊĠĠĠĠĠĠĠ Ġ// ĠSTEP Ġ 1 - 1 . ĠSimpl ify Ġthe Ġtree Ġ// ĊĠĠĠĠĠĠĠ Ġ// //////////////////////// /////// ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġstep , Ġwe Ġmodify Ġthe Ġtree Ġso Ġtrans lating Ġto ĠIR 2 Ġbe Ġeasier . ĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠMore Ġspecifically , Ġwe Ġdo : ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠ 1 . Ġ" If " Ġ( cond ) Ġ{ stmt 1 } Ġ" Else " Ġ{ stmt 2 } Ġ-> Ġ" If Else " Ġ( cond ) Ġ{ stmt 1 , Ġstmt 2 } Ġ// ĊĊĠĠĠĠĠĠĠ ĠAST root . traverse Pre order Statements Ġ{ Ġnode , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJOB Ġ# 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Node Index Ġ= Ġnode . statements . findAll To Indices Ġ{ Ġit . name Ġ== Ġ" if " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeletion Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Node Index . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġas Ġwe Ġdo Ġonline - delete , Ġpre calculated Ġnumbers Ġwill Ġgo Ġoff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdeletion Count Ġwill Ġcomp ens ate Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġit Ġ- Ġdeletion Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Node ĠĠ Ġ= Ġnode . statements [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Node Ġ= Ġnode . statements . get OrNull ( it Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġfiltered ĠIF Ġnode Ġhas ĠELSE Ġnode Ġappended ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Node Ġ!= Ġnull Ġ&& Ġelse Node . name Ġ== Ġ" else ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewNode Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Node . expression Type , Ġif Node . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" if else ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Node . line Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Node . is Root , Ġif Node . is Part Of Arguments Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if Node . statements . size Ġ> Ġ 1 ) Ġthrow ĠInternal Error (" If Ġnode Ġcontains Ġ 2 Ġor Ġmore Ġstatements !\ n [ NODE ĠSTART ]\ n $ node \ n [ NODE ĠEND ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else Node . statements . size Ġ> Ġ 1 ) Ġthrow ĠInternal Error (" Else Ġnode Ġcontains Ġ 2 Ġor Ġmore Ġstatements !\ n [ NODE ĠSTART ]\ n $ node \ n [ NODE ĠEND ]") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Node . arguments . forEach Ġ{ ĠnewNode . add Argument ( it ) Ġ} Ġ// Ġshould Ġcontain Ġonly Ġ 1 Ġarg Ġbut Ġoh Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewNode . add Statement ( if Node . statements [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewNode . add Statement ( else Node . statements [ 0 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . statements [ it ] Ġ= ĠnewNode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . statements . remove At ( it Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeletion Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn ĠAST root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġtype Ġ" variable ", Ġ" literal _ i ", Ġ" literal _ f " ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġstring Ġfor Ġvariable Ġname , Ġint Ġfor Ġinteger Ġand Ġfloat Ġliterals ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠVirtual Stack Item ( val Ġtype : ĠString , Ġval Ġvalue : ĠString ) ĊĊĠĠĠ Ġfun ĠString . is Variable () Ġ= Ġthis . startsWith ('$ ') ĊĠĠĠ Ġfun ĠString . is Register () Ġ= Ġthis . matches ( regex Register Literal ) ĊĊĠĠĠ Ġfun ĠArrayList < String >. append ( str : ĠString ) Ġ= Ġif Ġ( str . endsWith (' ; ')) ĊĠĠĠĠĠĠĠ Ġthis . add ( str ) ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" You Ġmissed Ġa Ġsem icolon Ġfor : Ġ$ str ") ĊĊĊĠĠĠ Ġ////////////////////////////////// //////////////// / ĊĠĠĠ Ġ// Ġpublic ising Ġthings Ġso Ġthat Ġthey Ġcan Ġbe Ġtested Ġ// ĊĠĠĠ Ġ////////////////////////////////// //////////////// / ĊĊĠĠĠ Ġfun Ġresolve TypeString ( type : ĠString , Ġis Pointer : ĠBoolean Ġ= Ġfalse ): ĠReturn Type Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* val Ġis Pointer Ġ= Ġtype . endsWith ('* ') Ġor Ġtype . endsWith ("_ ptr ") Ġor Ġis Pointer ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" void " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . NOTH ING _ PTR Ġelse ĠReturn Type . NOTH ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" char " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . CHAR _ PTR Ġelse ĠReturn Type . CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" short " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . SHORT _ PTR Ġelse ĠReturn Type . SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . INT _ PTR Ġelse ĠReturn Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" long " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . LONG _ PTR Ġelse ĠReturn Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . FLOAT _ PTR Ġelse ĠReturn Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . DOUBLE _ PTR Ġelse ĠReturn Type . DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" bool " Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . BOOL _ PTR Ġelse ĠReturn Type . BOOL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( is Pointer ) ĠReturn Type . STRUCT _ PTR Ġelse ĠReturn Type . STRUCT ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" void " Ġ-> ĠReturn Type . NOTH ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> ĠReturn Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> ĠReturn Type . FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠSyntax Error (" Unknown Ġtype : Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġfun Ġas TreeNode ( line Number : ĠInt , Ġtokens : ĠList < String >): ĠSyntax TreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsplit Contains Valid Variable Pre word ( split : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġret Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stage Ġin Ġ 0 .. min Of ( 3 , Ġsplit . last Index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Variable Pre word . contains ( split [ stage ])) Ġret Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġdebug 1 ( any : ĠAny ?) Ġ{ Ġif Ġ( true ) Ġprintln ( any ) Ġ} ĊĊĊĊ ĊĠĠĠĠĠĠĠ Ġ// Ġcontr ad iction : Ġauto ĠAND Ġextern ĊĊĠĠĠĠĠĠĠ Ġdebug 1 ("[ as TreeNode ] Ġtokens : Ġ$ tokens ") ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Assign Index Ġ= Ġtokens . indexOf (" =") ĊĠĠĠĠĠĠĠ Ġval Ġfirst Left Paren Index Ġ= Ġtokens . indexOf (" (" ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Right Paren Index Ġ= Ġtokens . lastIndexOf (" )") ĊĊĠĠĠĠĠĠĠ Ġ// Ġspecial Ġcase Ġfor ĠFOR Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġint Ġi Ġ= Ġ 0 Ġ// Ġi Ġmust Ġbe Ġdeclared Ġbefore hand Ġ!! ; Ġthink Ġof ĠC Ġ< Ġ 9 9 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġfor Ġ( i Ġ= Ġ 2 Ġ+ Ġ( 3 Ġ* Ġ 4 ), Ġi Ġ<= Ġ 1 0 , Ġi Ġ= Ġi Ġ+ Ġ 2 ) Ġ{ Ġ// Ġseparated Ġby Ġcomma , Ġpare ns Ġare Ġmandatory ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġdos ome ting (); ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( tokens [ 0 ] Ġ== Ġ" for ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġtokens Ġinside Ġof Ġfirst Left Paren .. last Right Paren , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsplit Ġtokens Ġby Ġ',' Ġ( will Ġresult Ġin Ġ 3 Ġtokens , Ġmay Ġor Ġmay Ġnot Ġempty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrecurse Ġcall Ġthose Ġthree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġe . g . Ġfor Node . arguments [ 0 ] Ġ= Ġas TreeNode ( Ġ... Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġfor Node . arguments [ 1 ] Ġ= Ġas TreeNode ( Ġ... Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġfor Node . arguments [ 2 ] Ġ= Ġas TreeNode ( Ġ... Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfor Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ CALL , Ġnull , Ġ" for ", ĠlineNumber ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Tokens Ġ= Ġtokens . sub List ( first Left Paren Index , Ġlast Right Paren Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommas Ġ= ĠlistOf ( 0 , Ġsub Tokens . indexOf ("," ), Ġsub Tokens . lastIndexOf ("," ), Ġsub Tokens . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfor Args Ġ= Ġ( 0 .. 2 ). map Ġ{ Ġsub Tokens . sub List ( 1 Ġ+ Ġcommas [ it ], Ġcommas [ it Ġ+ Ġ 1 ]) Ġ}. map Ġ{ Ġas TreeNode ( line Number , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Node . add Argument ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 ("[ as TreeNode ] Ġfor Ġtree : Ġ\ n $ for Node ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfor Node ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Call Tokens : ĠList < String >? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Left Paren Index Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( first Assign Index Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . sub List ( 0 , Ġfirst Left Paren Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . sub List ( first Assign Index Ġ+ Ġ 1 , Ġfirst Left Paren Index ) ĊĠĠĠĠĠĠĠ Ġval Ġfunction Call Tokens Contains Tokens Ġ= Ġif Ġ( function Call Tokens Ġ== Ġnull ) Ġfalse Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( function Call Tokens . map Ġ{ Ġif Ġ( split table Tokens . contains ( it )) Ġ 1 Ġelse Ġ 0 Ġ}. sum () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġif ĠTRUE , Ġit 's Ġnot Ġa Ġfunction Ġcall / def Ġ( e . g . Ġfoo bar Ġ= Ġfunc call Ġ( Ġarg Ġarg Ġarg Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġdebug 1 (" !! ## [ as TreeNode ] Ġline Ġ$ line Number ; Ġfunction Call Tokens : Ġ$ function Call Tokens ; Ġcontains Ġtokens ?: Ġ$ function Call Tokens Contains Tokens ") ĊĊĠĠĠĠĠĠĠ Ġ// //////////////////////// /// ĊĠĠĠĠĠĠĠ Ġ// Ġunwrap Ġ((( (( pare ns ))))) Ġ// ĊĠĠĠĠĠĠĠ Ġ// //////////////////////// /// ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġ( Ġas r tra Ġ) Ġ+ Ġ( Ġfe in ov Ġ) Ġforms Ġare Ġer re no us ly Ġstripped Ġits Ġp aren Ġaway ĊĠĠĠĠĠĠĠ Ġ/* if Ġ( tokens . first () Ġ== Ġ"(" Ġ&& Ġtokens . last () Ġ== Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwrap Size Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( tokens [ wrap Size ] Ġ== Ġ"(" Ġ&& Ġtokens [ tokens . last Index Ġ- Ġwrap Size ] Ġ== Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Size ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġas TreeNode ( line Number , Ġtokens . sub List ( wrap Size , Ġtokens . last Index Ġ- Ġwrap Size Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĊĠĠĠĠĠĠĠ Ġdebug 1 (" !! ## [ as TreeNode ] Ġinput Ġtoken : Ġ$ tokens ") ĊĊĊĠĠĠĠĠĠĠ Ġ// //////////////////////// // ĊĠĠĠĠĠĠĠ Ġ// Ġas ĠFunction ĠDefinition Ġ// ĊĠĠĠĠĠĠĠ Ġ// //////////////////////// // ĊĠĠĠĠĠĠĠ Ġif Ġ(! function Call Tokens Contains Tokens Ġ&& Ġfunction Call Tokens Ġ!= Ġnull Ġ&& Ġfunction Call Tokens . size Ġ>= Ġ 2 Ġ&& Ġfunction Call Tokens . size Ġ<= Ġ 4 ) Ġ{ Ġ// Ġe . g . Ġint Ġmain Ġ, ĠStruct Name Ġfoo o Ġ, Ġextern Ġvoid Ġdo Something Ġ, Ġextern Ġunsigned ĠStruct Name Ġu ww se ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Func Type Ġ= Ġfunction Call Tokens [ function Call Tokens . last Index Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġresolve TypeString ( actual Func Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Name Ġ= Ġfunction Call Tokens . last () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġint Ġ Ġ* Ġ Ġindex Ġ Ġ, Ġ Ġbool Ġ Ġ* Ġ Ġ* Ġ Ġis Something Ġ Ġ, Ġ Ġdouble Ġ Ġsome Number Ġ Ġ, Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Def Ġ= Ġtokens . sub List ( first Left Paren Index Ġ+ Ġ 1 , Ġlast Right Paren Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg TypeName Pair Ġ= ĠArrayList < Pair < ReturnType , ĠString ? >>() ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġfunc Ġdef Ġargs ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġ<- Ġ$ arguments Def ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġche w Ġit Ġdown Ġto Ġmore Ġunderstand able Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Holder : ĠReturn Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Holder : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Def . forEach Indexed Ġ{ Ġindex , Ġtoken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument Def Bad Tokens . contains ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ line Number Ġ-- Ġillegal Ġtoken Ġ'$ token ' Ġused Ġon Ġfunction Ġargument Ġdefinition ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġ", ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Holder Ġ== Ġnull ) Ġthrow ĠSyntax Error (" at Ġline Ġ$ line Number Ġ-- Ġtype Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg TypeName Pair . add ( type Holder !! Ġto Ġname Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Holder Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Holder Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Holder Ġ== Ġnull ) Ġthrow ĠSyntax Error (" at Ġline Ġ$ line Number Ġ-- Ġtype Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Holder Ġ= Ġresolve TypeString ( type Holder . toString (). toLowerCase (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( type Holder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Holder Ġ= Ġresolve TypeString ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( type Holder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Holder Ġ= Ġtoken ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġarguments Def . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg TypeName Pair . add ( type Holder !! Ġto Ġname Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" unc a ught Ġsh it Ġright Ġthere ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġ-> Ġ$ arg TypeName Pair ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" ================ =============== =") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Def Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ DEF , ĠreturnType , Ġfunc Name , ĠlineNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( returnType Ġ== ĠReturn Type . STRUCT Ġ|| ĠreturnType Ġ== ĠReturn Type . STRUCT _ PTR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġfunc Def Node . struct Name Ġ= Ġactual Func Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg TypeName Pair . forEach Ġ{ Ġval Ġ( type , Ġname ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġstruct Ġand Ġstruct Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Def Arg Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNC _ ARGUMENT _ DEF , Ġtype , Ġname , ĠlineNumber , Ġis Part Of Arguments Node Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc Def Node . add Argument ( func Def Arg Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunc Def Node ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// //////////////// //// ĊĠĠĠĠĠĠĠ Ġ// Ġas ĠFunction ĠCall Ġ// Ġ( also Ġworks Ġas Ġkey wor ded Ġcode Ġblock Ġ( e . g . Ġif , Ġfor , Ġwhile )) ĊĠĠĠĠĠĠĠ Ġ// //////////////// //// ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tokens . size Ġ>= Ġ 3 Ġ/* Ġfoo , Ġ( , Ġ); Ġguaranteed Ġto Ġbe Ġat Ġleast Ġthree Ġ*/ Ġ&& Ġtokens [ 1 ] Ġ== Ġ"(" Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! function Call Tokens Contains Tokens Ġ&& Ġfunction Call Tokens Ġ!= Ġnull Ġ&& Ġfunction Call Tokens . size Ġ== Ġ 1 ) Ġ{ Ġ// Ġe . g . Ġif Ġ( Ġ, Ġwhile Ġ( Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Name Ġ= Ġfunction Call Tokens . last () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomplex _ statements Ġ, Ġ( Ġvalue Ġ= Ġfunc call Ġ( Ġarg Ġ) Ġ) Ġ, Ġ" string , arg " Ġ, Ġ 4 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Def Ġ= Ġtokens . sub List ( first Left Paren Index Ġ+ Ġ 1 , Ġlast Right Paren Index ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġfunc Ġcall Ġargs :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġ<- Ġ$ arguments Def ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsplit Ġinto Ġtokens Ġlist , Ġsplit ted Ġby Ġ',' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Call Arguments Ġ= ĠArrayList < ArrayList < String >>() Ġ// Ġdouble Ġarray Ġis Ġintended Ġ( e . g . Ġ[ [" ts ras rat "], Ġ[" 4 2 "], Ġ[ call ff , Ġ( , Ġ" w ut ", Ġ) ]] Ġfor Ġinput Ġ(" ts ras rat ", Ġ" 4 2 ", Ġcall ff (" w ut ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtokens Holder Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Def . forEach Indexed Ġ{ Ġindex , Ġtoken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġarguments Def . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Holder . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call Arguments . add ( tokens Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Holder Ġ= ĠArrayList < String >() Ġ// Ġcan 't Ġreuse ; Ġmust Ġmake Ġnew Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token Ġ== Ġ", ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tokens Holder . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" at Ġline Ġ$ line Number Ġ-- Ġmis placed Ġcomma ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call Arguments . add ( tokens Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Holder Ġ= ĠArrayList < String >() Ġ// Ġcan 't Ġreuse ; Ġmust Ġmake Ġnew Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Holder . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġ-> Ġ$ function Call Arguments ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunc Call Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ CALL , Ġnull , Ġfunc Name , ĠlineNumber ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call Arguments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! ĠforEach Ġ$ it ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" call Ġfrom Ġas TreeNode (). as Function Call ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Node Leaf Ġ= Ġas TreeNode ( line Number , Ġit ); Ġarg Node Leaf . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc Call Node . add Argument ( arg Node Leaf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" ================ =============== =") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunc Call Node ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// //////////////// ////// ĊĠĠĠĠĠĠĠ Ġ// Ġas ĠVar ĠCall Ġ/ Ġetc . Ġ// ĊĠĠĠĠĠĠĠ Ġ// //////////////// ////// ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter Ġillegal Ġlines Ġ( abs ur d Ġkeyword Ġusage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( code Block Keywords . contains ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcode Ġblock Ġwithout Ġarg umen ets ; Ġgive Ġit Ġproper Ġpare ns Ġand Ġredirect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Tokens Ġ= Ġtokens . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Tokens . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" Number Ġof Ġtokens Ġis Ġnot Ġ 1 Ġ( got Ġsize Ġof Ġ${ new Tokens . size }): Ġ${ new Tokens }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Tokens . add (" (" ); Ġnew Tokens . add (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" call Ġfrom Ġas TreeNode (). filter Illegal Lines ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġas TreeNode ( line Number , Ġnew Tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// //////////////// ///// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠB unch Ġof Ġliterals Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// //////////////// ///// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tokens . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġword Ġ= Ġtokens [ 0 ] ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġliteral , Ġtoken : Ġ'$ word '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// debug 1 (" ================ =============== =") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfiltered ĠString Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word . startsWith ('" ') Ġ&& Ġword . endsWith ('" ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( Expression Type . LITERAL _ LEAF , ĠReturn Type . DATABASE , Ġnull , ĠlineNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= Ġtokens [ 0 ]. substring ( 1 , Ġtokens [ 0 ]. last Index ) Ġ+ Ġnull char ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbool Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Boolean Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( Expression Type . LITERAL _ LEAF , ĠReturn Type . INT , Ġnull , ĠlineNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= Ġword Ġ== Ġ" true " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhexadecimal Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Hex Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . LITERAL _ LEAF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturn Type . INT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . replace ( Regex (""" [^ 0 - 9 A - Fa - f ] "" "), Ġ""). to Long ( 1 6 ). and ( 0 xFFFFFFFF L ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ line Number Ġ-- Ġ$ word Ġis Ġtoo Ġlarge Ġto Ġbe Ġrepresented Ġas Ġ${ leaf Node . returnType ?. toString ()?. toLowerCase () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoct al Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Oct Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . LITERAL _ LEAF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturn Type . INT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . replace ( Regex (""" [^ 0 - 7 ] "" "), Ġ""). to Long ( 8 ). and ( 0 xFFFFFFFF L ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ line Number Ġ-- Ġ$ word Ġis Ġtoo Ġlarge Ġto Ġbe Ġrepresented Ġas Ġ${ leaf Node . returnType ?. toString ()?. toLowerCase () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbinary Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Bin Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . LITERAL _ LEAF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturn Type . INT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . replace ( Regex (""" [^ 0 1 ] "" "), Ġ""). to Long ( 2 ). and ( 0 xFFFFFFFF L ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ line Number Ġ-- Ġ$ word Ġis Ġtoo Ġlarge Ġto Ġbe Ġrepresented Ġas Ġ${ leaf Node . returnType ?. toString ()?. toLowerCase () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġint Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Int Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . LITERAL _ LEAF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturn Type . INT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . replace ( Regex (""" [^ 0 - 9 ] "" "), Ġ""). to Long (). and ( 0 xFFFFFFFF L ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Token Exception (" at Ġline Ġ$ line Number Ġ-- Ġ$ word Ġis Ġtoo Ġlarge Ġto Ġbe Ġrepresented Ġas Ġ${ leaf Node . returnType ?. toString ()?. toLowerCase () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfloating Ġpoint Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex FP Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . LITERAL _ LEAF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturn Type . FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . literal Value Ġ= Ġif Ġ( word . endsWith (' F ', Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . slice ( 0 .. word . last Index Ġ- Ġ 1 ). toDouble () Ġ// ĠDOUBLE Ġwhen ĠC - flat ; Ġreplace Ġit Ġwith Ġ' toFloat ()' Ġif Ġyou 're Ġstandard ĠC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" at Ġline Ġ$ line Number , Ġwhile Ġparsing Ġ'$ word ' Ġas ĠDouble ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ////////////////////////////////// //// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvariable Ġliteral Ġ( VARIABLE _ LEAF ) Ġ// Ġusually Ġfunction Ġcall Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ////////////////////////////////// //// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( word . matches ( regex Var Name Whole )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( Expression Type . VARIABLE _ READ , Ġnull , Ġword , ĠlineNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ////////////////////////////////// //////// /////// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġsomething ; Ġgoto Ġsomewhere Ġ( keywords ) Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ////////////////////////////////// //////// /////// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tokens [ 0 ] Ġ== Ġ" goto " Ġ|| Ġtokens [ 0 ] Ġ== Ġ" come from ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . FUNCTION _ CALL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw TreeNode Ġ= Ġtokens [ 1 ]. to Raw TreeNode ( line Number ); Ġraw TreeNode . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn node . add Argument ( raw TreeNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġn node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tokens [ 0 ] Ġ== Ġ" return ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Node Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . FUNCTION _ CALL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġturn In fix Tokens Into Tree ( line Number , Ġtokens . sub List ( 1 , Ġtokens . last Index Ġ+ Ġ 1 )); Ġnode . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Node . add Argument ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreturn Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// //////////////////////// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvariable Ġdeclaration Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// //////////////////////// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġextern Ġauto Ġstruct ĠSTR UCT ID Ġfoo bar baz ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġextern Ġauto Ġint Ġfoo bar l ul z ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( split Contains Valid Variable Pre word ( tokens ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre word Index Ġ= Ġsplit Contains Valid Variable Pre word ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Type Ġ= Ġtokens [ pre word Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Assignment : ĠBoolean ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Type Ġ== Ġ" struct ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Assignment Ġ= Ġtokens . last Index Ġ> Ġpre word Index Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Assignment Ġ= Ġtokens . last Index Ġ> Ġpre word Index Ġ+ Ġ 1 ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdeal Ġwith Ġassignment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Assignment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġsupport Ġtype _ ptr _ ptr _ ptr ... ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġturn In fix Tokens Into Tree Ġand Ġinject Ġit Ġto Ġassignment Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Ptr Type Ġ= Ġtokens [ 1 ] Ġ== Ġ"*" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Str Ġ= Ġtokens [ 0 ] Ġ+ Ġif Ġ( is Ptr Type ) Ġ"_ ptr " Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens Without Type Ġ= Ġif Ġ( is Ptr Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . sub List ( 2 , Ġtokens . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . sub List ( 1 , Ġtokens . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin fix Node Ġ= Ġturn In fix Tokens Into Tree ( line Number , Ġtokens Without Type ) ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// #_ assign var ( Syntax TreeNode < Raw String > Ġvar name , ĠSyntax TreeNode < Raw String > Ġv art ype , ĠSyntax TreeNode Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ CALL , ĠReturn Type . NOTH ING , Ġ"# _ assign var ", ĠlineNumber ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Node Ġ= Ġtokens Without Type . first (). to Raw TreeNode ( line Number ); Ġname Node . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Node . add Argument ( name Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Node Ġ= Ġtype Str . to Raw TreeNode ( line Number ); Ġtype Node . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Node . add Argument ( type Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fix Node . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Node . add Argument ( infix Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreturn Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ# _ declare var ( Syntax TreeNode < Raw String > Ġvar name , ĠSyntax TreeNode < Raw String > Ġv art ype ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Node Ġ= ĠSyntax TreeNode ( Expression Type . INTERNAL _ FUNCTION _ CALL , ĠReturn Type . NOTH ING , Ġ"# _ declare var ", ĠlineNumber ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Node Ġ= Ġtokens [ 1 ]. to Raw TreeNode ( line Number ); Ġvalue Node . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . add Argument ( value Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Node Ġ= Ġtokens [ 0 ]. to Raw TreeNode ( line Number ); Ġtype Node . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Node . add Argument ( type Node ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( syntax F uck : ĠArray Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error (" at Ġline Ġ$ line Number Ġ-- Ġmissing Ġstatement ( s )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug 1 (" !! Ġin fix Ġin : Ġ$ tokens ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin fix Ġnotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġturn In fix Tokens Into Tree ( line Number , Ġtokens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġend Ġif Ġ( tokens . size Ġ== Ġ 1 ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġturn In fix Tokens Into Tree ( line Number : ĠInt , Ġtokens : ĠList < String >): ĠSyntax TreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbased Ġon Ġhttps :// stackoverflow . com / questions / 1 9 4 6 8 9 6 / conversion - from - infix - to - prefix ĊĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : Ġdifferent iate Ġpare ns Ġfor Ġfunction Ġcall Ġfrom Ġgrouping ĊĊĠĠĠĠĠĠĠ Ġfun Ġdebug ( any : ĠAny ) Ġ{ Ġif Ġ( true ) Ġprintln ( any ) Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġprecedence Of ( token : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġ"(" Ġ|| Ġtoken Ġ== Ġ") ") Ġreturn Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperators Hierarchy Internal . forEach Indexed Ġ{ Ġindex , Ġhash Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hash Set . contains ( token )) Ġreturn Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSyntax Error ("[ infix - to - tree ] Ġat Ġ$ line Number Ġ-- Ġunknown Ġoperator Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġtokens . reversed () ĊĊĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < String >() ĊĠĠĠĠĠĠĠ Ġval Ġtree Args Stack Ġ= ĠStack < Any >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠaddTo Tree ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug ("[ infix - to - tree ] Ġadding Ġ'$ token '") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġargs Count Of ( operator : ĠString ) Ġ= Ġif Ġ( unary Ops . contains ( operator )) Ġ 1 Ġelse Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġpop As Tree (): ĠSyntax TreeNode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Elem Ġ= Ġtree Args Stack . pop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Elem Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug ("[ infix - to - tree ] Ġcall Ġfrom Ġturn In fix Tokens Into Tree (). addTo Tree (). pop As Tree () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġas TreeNode ( line Number , ĠlistOf ( raw Elem )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Elem Ġis ĠSyntax TreeNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġraw Elem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" I Ġsaid Ġyou Ġto Ġput ĠString Ġor ĠSyntax TreeNode Ġonly ; Ġwhat 's Ġthis ? Ġ${ raw Elem . java Class . simple Name }? ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! operators No Order . contains ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" -> Ġnot Ġa Ġoperator ; Ġpushing Ġto Ġargs Ġstack ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Args Stack . push ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" -> Ġtaking Ġ${ args Count Of ( token )} Ġvalue ( s ) Ġfrom Ġstack ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Node Ġ= ĠSyntax TreeNode ( Expression Type . FUNCTION _ CALL , Ġnull , Ġtoken , ĠlineNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( args Count Of ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop ped Tree Ġ= Ġpop As Tree (); Ġpop ped Tree . is Part Of Arguments Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Node . add Argument ( pop ped Tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Args Stack . push ( tree Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġdebug ("[ infix - to - tree ] Ġreversed Ġtokens : Ġ$ tokens ") ĊĊĊĠĠĠĠĠĠĠ Ġtokens . forEach Indexed Ġ{ Ġindex , Ġraw Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontext ually Ġdecide Ġwhat Ġis Ġreal Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġprev Ġtoken Ġis Ġoperator Ġ( used Ġ'+' Ġas Ġtoken Ġlist Ġis Ġreversed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġtokens . last Index Ġ|| Ġoperators No Order . contains ( tokens [ index Ġ+ Ġ 1 ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Token Ġ== Ġ"+ ") Ġ"# _ unary plus " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Token Ġ== Ġ"- ") Ġ"# _ unary minus " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Token Ġ== Ġ"& ") Ġ"# _ address of " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Token Ġ== Ġ"* ") Ġ"# _ ptr deref " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Token Ġ== Ġ" ++ ") Ġ"# _ pre inc " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( raw Token Ġ== Ġ"-- ") Ġ"# _ pre dec " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġraw Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġraw Token ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token Ġ== Ġ"(" ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġ") ") Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Tree ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! operators No Order . contains ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Tree ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠXXX : Ġassoci ativity Ġshould Ġbe Ġconsidered Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// en . wikipedia . org / wiki / Operator _ associ ativity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stack . isNotEmpty () Ġ&& Ġprecedence Of ( stack . peek ()) Ġ> Ġprecedence Of ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Tree ( stack . pop ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Tree ( stack . pop ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( tree Args Stack . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" Stack Ġsize Ġis Ġwrong Ġ-- Ġsupposed Ġto Ġbe Ġ 1 , Ġbut Ġit 's Ġ${ tree Args Stack . size }\ n stack : Ġ$ tree Args Stack ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdebug ("[ infix - to - tree ] Ġfinal ised Ġtree :\ n ${ tree Args Stack . peek () }") ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( tree Args Stack . peek () Ġis ĠSyntax TreeNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Args Stack . peek () Ġas ĠSyntax TreeNode ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug ("[ infix - to - tree ] Ġcall Ġfrom Ġturn In fix Tokens Into Tree (). if Ġ( tree Args Stack . peek () Ġis ĠSyntax TreeNode ). else ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas TreeNode ( line Number , ĠlistOf ( tree Args Stack . peek () Ġas ĠString )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġdata Ġclass ĠLine Structure ( var Ġline Num : ĠInt , Ġvar Ġdepth : ĠInt , Ġval Ġtokens : ĠMutable List < String >) ĊĊĠĠĠ Ġclass ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Type : ĠExpression Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType : ĠReturn Type ?, Ġ// ĠSTATE MENT , ĠL ITERAL _ LEAF : Ġvalid ĠReturn Type ; ĠV ARE ABLE _ LEAF : Ġalways Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineNumber : ĠInt , Ġ// Ġused Ġto Ġgenerate Ġerror Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Root : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġderef Depth : ĠInt Ġ= Ġ 0 Ġ// Ġhow Ġmany Ġ*** s Ġare Ġthere Ġfor Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Part Of Arguments Node : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġliteral Value : ĠAny ? Ġ= Ġnull Ġ// Ġfor ĠL ITERAL s Ġonly ĊĠĠĠĠĠĠĠ Ġvar Ġstruct Name : ĠString ? Ġ= Ġnull Ġ// Ġfor ĠSTR UCT Ġreturn Ġtype ĊĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠArrayList < Syntax TreeNode >() Ġ// Ġfor ĠFUNCTION , ĠCODE _ BLOCK ĊĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= ĠArrayList < Syntax TreeNode >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġdepth : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Argument ( node : ĠSyntax TreeNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġadd Statement ( node : ĠSyntax TreeNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Depth () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Root ) Ġthrow ĠError (" Updating Ġdepth Ġonly Ġmake Ġsense Ġwhen Ġused Ġas Ġroot ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . depth Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . forEach Ġ{ Ġit ._ update Depth ( 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġit ._ update Depth ( 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ_ update Depth ( recursive Depth : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . depth Ġ= Ġrecursive Depth ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . forEach Ġ{ Ġit ._ update Depth ( recursive Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġit ._ update Depth ( recursive Depth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġexpand Implicit End s () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Root ) Ġthrow ĠError (" Expand ing Ġimplicit Ġ' end 's Ġonly Ġmake Ġsense Ġwhen Ġused Ġas Ġroot ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfix me Ġno Ġnested Ġif s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġit . statements . forEach Ġ{ Ġit ._ expand Implicit End s () Ġ} Ġ} Ġ// Ġroot Ġlevel Ġif ĠOF ĠFUNC DEF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġit ._ expand Implicit End s () Ġ} Ġ// Ġroot Ġlevel Ġif ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ_ expand Implicit End s () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . name Ġin Ġfunctions Implicit End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . statements . add ( Syntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . INTERNAL _ FUNCTION _ CALL , Ġnull , Ġ" end ${ this . name }", Ġthis . line Number , Ġthis . is Root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( this . expression Type Ġ== ĠExpression Type . FUNCTION _ DEF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend func def Ġ= ĠSyntax TreeNode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpression Type . INTERNAL _ FUNCTION _ CALL , Ġnull , Ġ" end func def ", Ġthis . line Number , Ġthis . is Root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend func def . add Argument ( Syntax TreeNode ( Expression Type . FUNC _ ARGUMENT _ DEF , Ġnull , Ġthis . name !! , Ġthis . line Number , Ġis Part Of Arguments Node Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . statements . add ( end func def ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Leaf : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġexpression Type . toString (). endsWith ("_ LEAF ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( arguments . isEmpty () Ġ&& Ġstatements . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠtoString Representation ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠtoString Representation ( depth : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġ" âĶĤ Ġ". repeat ( depth ) Ġ+ Ġif Ġ( is Root ) Ġ" â § « AST Ġ( name : Ġ$ name )" Ġelse Ġif Ġ( is Leaf ) Ġ" âĹ Ĭ AST $ depth Ġ( name : Ġ$ name )" Ġelse Ġ" â ĺĲ AST $ depth Ġ( name : Ġ$ name )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ" Expr Type Ġ: Ġ$ expression Type ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ" Ret n Type Ġ: Ġ$ returnType ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ" Literal V Ġ: Ġ'$ literal Value '", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ" is Arg N od Ġ: Ġ$ is Part Of Arguments Node " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Leaf ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add (" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ"# Ġof Ġarguments : Ġ${ arguments . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . forEach Ġ{ Ġlines . add ( it . toString Representation ( depth Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add (" âĶĤ Ġ". repeat ( depth + 1 ) Ġ+ Ġ"# Ġof Ġstatements : Ġ${ statements . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . forEach Ġ{ Ġlines . add ( it . toString Representation ( depth Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add (" âĶĤ Ġ". repeat ( depth ) Ġ+ Ġ" âķ ĺ " Ġ+ Ġ" âķĲ ". repeat ( header . length Ġ- Ġ 1 Ġ- Ġ 2 * depth )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . forEach Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġlines . last Index ) Ġ{ Ġsb . append ("\ n ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtraverse Stmt Only ( node : ĠSyntax TreeNode , Ġaction : Ġ( Syntax TreeNode , ĠInt ) Ġ-> ĠUnit , Ġdepth : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( node Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( node , Ġdepth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . statements . forEach Ġ{ Ġtraverse Stmt Only ( it , Ġaction , Ġdepth Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtraverse Pre order Statements ( action : Ġ( Syntax TreeNode , ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . traverse Stmt Only ( this , Ġaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . to Raw TreeNode ( line Number : ĠInt ): ĠSyntax TreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠSyntax TreeNode ( Expression Type . LITERAL _ LEAF , ĠReturn Type . DATABASE , Ġnull , ĠlineNumber ) ĊĠĠĠĠĠĠĠ Ġnode . literal Value Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< T > ĠIterable < T >. findAll To Indices ( predicate : Ġ( T ) Ġ-> ĠBoolean ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindices Ġ= ĠArrayList < Int >() ĊĊĠĠĠĠĠĠĠ Ġthis . forEach Indexed Ġ{ Ġindex , Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate ( t )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices . add ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġindices . to IntArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠExpression Type Ġ{ ĊĠĠĠĠĠĠĠ ĠFUNCTION _ DEF , ĠFUNC _ ARGUMENT _ DEF , Ġ// Ġexpect ĠArguments Ġand ĠState ments ĊĊĠĠĠĠĠĠĠ ĠINTERNAL _ FUNCTION _ CALL , ĊĠĠĠĠĠĠĠ ĠFUNCTION _ CALL , Ġ// Ġexpect ĠArguments Ġand ĠState ments ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġcase Ġof ĠOPER ATOR ĠCALL Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠreturnType : Ġvariable Ġtype ; Ġname : Ġ"=" ; ĠTODO Ġadd Ġdescription Ġfor ĠSTR UCT ĊĠĠĠĠĠĠĠ Ġ// Ġarg 0 : Ġname Ġof Ġthe Ġvariable Ġ( String ) ĊĠĠĠĠĠĠĠ Ġ// Ġarg 1 : Ġ( optional ) Ġassigned Ġvalue , Ġeither ĠL ITERAL Ġor ĠFUNCTION _ CALL Ġor Ġanother ĠOPER ATOR ĠCALL ĊĠĠĠĠĠĠĠ Ġ// Ġarg 2 : Ġ( if ĠSTR UCT ) Ġstruct Ġidentifier Ġ( String ) ĊĊĠĠĠĠĠĠĠ ĠL ITERAL _ LEAF , Ġ// Ġliterals , Ġalso Ġact Ġas Ġa Ġleaf Ġof Ġthe Ġtree ; Ġhas ĠreturnType Ġof Ġnull ĊĠĠĠĠĠĠĠ ĠVARIABLE _ WRITE , Ġ// ĠCode L ; Ġloads Ġmemory Ġaddress Ġto Ġbe Ġwritten Ġonto ĊĠĠĠĠĠĠĠ ĠVARIABLE _ READ ĠĠ Ġ// ĠCode R ; Ġthe Ġactual Ġvalue Ġstored Ġin Ġits Ġmemory Ġaddress ĊĠĠĠ Ġ} ĊĠĠĠ Ġenum Ġclass ĠReturn Type Ġ{ ĊĠĠĠĠĠĠĠ ĠINT , ĠFLOAT , ĊĠĠĠĠĠĠĠ ĠNOT H ING , Ġ// Ġnull ĊĠĠĠĠĠĠĠ ĠDATABASE Ġ// Ġarray Ġof Ġbytes , Ġalso Ġcould Ġbe ĠString ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠPre processor Rules Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġk wd Ret Pair Ġ= ĠHashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Definition ( keyword : ĠString , Ġret : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk wd Ret Pair [ keyword ] Ġ= Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġremove Definition ( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk wd Ret Pair . remove ( keyword ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun ĠforEach Keyword For Tokens ( action : Ġ( String , ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk wd Ret Pair . forEach Ġ{ Ġkey , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction (""" [ Ġ\ t \ n ]+ """ Ġ+ Ġkey Ġ+ Ġ""" (? =[ Ġ\ t \ n ; ]+) """, Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNot ation Ġrules : ĊĠĠĠĠ Ġ* Ġ- ĠVariable : Ġprepend Ġwith Ġ'$ ' Ġ( e . g . Ġ$ d uplic ants Count ) Ġ// Ġtotally Ġnot Ġa ĠO xygen ĠNot ĠInclude d Ġreference ĊĠĠĠĠ Ġ* Ġ- ĠRegister : Ġprepend Ġwith Ġ' r ' Ġ( e . g . Ġr 3 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠInter mediate Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Num : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinstruction : ĠString Ġ= Ġ" D UMMY ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarg 1 : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarg 2 : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarg 3 : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarg 4 : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarg 5 : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( other : ĠInter mediate Representation ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . lineNum , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . instruction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . arg 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . arg 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . arg 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . arg 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . arg 5 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( instruction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 1 ?. let Ġ{ Ġsb . append (" Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 2 ?. let Ġ{ Ġsb . append (", Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 3 ?. let Ġ{ Ġsb . append (", Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 4 ?. let Ġ{ Ġsb . append (", Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 5 ?. let Ġ{ Ġsb . append (", Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("; Ġ( at Ġline Ġ$ lineNum )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ open Ġclass ĠSyntax Error ( msg : ĠString ? Ġ= Ġnull ) Ġ: ĠException ( msg ) Ċ class ĠIllegal Token Exception ( msg : ĠString ? Ġ= Ġnull ) Ġ: ĠSyntax Error ( msg ) Ċ class ĠUn resolved Reference ( msg : ĠString ? Ġ= Ġnull ) Ġ: ĠSyntax Error ( msg ) Ċ class ĠUndefined Statement ( msg : ĠString ? Ġ= Ġnull ) Ġ: ĠSyntax Error ( msg ) Ċ class ĠDuplicate Definition ( msg : ĠString ? Ġ= Ġnull ) Ġ: ĠSyntax Error ( msg ) Ċ class ĠPre processor ErrorMessage ( msg : ĠString ) Ġ: ĠSyntax Error ( msg ) Ċ