@ file : Suppress (" UN CHECK ED _ CAST ") Ċ package Ġex amp ly Ċ import Ġnor swap . aut umn .* Ċ import Ġnor swap . aut umn . parsers .* Ċ import Ġnor swap . aut umn . syntax .* Ċ import Ġnor swap . aut umn . result . Success Ċ import Ġnor swap . aut umn . utils .* Ċ import Ġjava . util . HashMap Ċ Ċ class ĠEx amp ly : ĠGram mar () Ċ { ĊĠĠĠ Ġoverride Ġfun Ġrequired States () Ġ= ĠlistOf < State < *, Ġ* >>( Indent Stack (), ĠType Stack ()) ĊĊĠĠĠ Ġlateinit Ġvar Ġindent Map : ĠMap < Int , ĠInd ent Entry > ĊĊĠĠĠ Ġ/// Ġ" LEX ICAL " Ġ// //////////////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġval Ġany ĠĠĠĠĠĠĠĠ Ġ= ĠAny Char () ĊĠĠĠ Ġval Ġalpha ĠĠĠĠĠĠ Ġ= ĠAlpha () ĊĠĠĠ Ġval Ġalpha Num ĠĠĠ Ġ= ĠAlpha Num () ĊĠĠĠ Ġval Ġdigit ĠĠĠĠĠĠ Ġ= ĠDig it () ĊĠĠĠ Ġval Ġ` "` ĠĠĠĠĠĠĠĠ Ġ= Ġ"\"" ĊĊĠĠĠ Ġval Ġid en Ġ= ĠSeq ( alpha , Ġalpha Num . repeat ) ĊĠĠĠĠĠĠĠ Ġ. atom Ġ{ Ġit Ġ} ĊĊĠĠĠ Ġval Ġint Ġ= Ġdigit . repeat 1 ĊĠĠĠĠĠĠĠ Ġ. atom Ġ{ Ġit . toInt () Ġ} ĊĊĠĠĠ Ġval Ġstring Ġ= ĠSeq (+ `" `, Ġany Ġuntil Ġ+ ` "` ) ĊĠĠĠĠĠĠĠ Ġ. atom Ġ{ Ġit . remove Sur rounding (` "`, Ġ` "` ) Ġ} ĊĊĠĠĠ Ġ/// ĠIND ENT ATION Ġ// //////////////////////////////////////////////////////////////////////////// // ĊĊĠĠĠ Ġdata Ġclass ĠInd ent Entry Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġcount : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġend : ĠInt ) ĊĊĠĠĠ Ġclass ĠInd ent Stack : ĠStack State < Int >() ĊĊĠĠĠ Ġval ĠContext . indent : ĠInd ent Entry Ġ/** / Ġget () Ġ= Ġindent Map [ line Map . line From Offset ( pos )] !! ĊĠĠĠ Ġval ĠContext . ist ack : ĠInd ent Stack Ġ/** / Ġget () Ġ= Ġstate ( Indent Stack :: class ) ĊĊĠĠĠ Ġval Ġbuild Indent Map Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < Int , ĠInd ent Entry >() ĊĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġctx . text . split ('\ n '). forEach Indexed Ġ{ Ġi , Ġstr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw space Ġ= Ġstr . take While Ġ{ Ġit Ġ== Ġ' Ġ' Ġ|| Ġit Ġ== Ġ'\ t ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġw space . expand Tabs ( 4 ). length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( i , ĠInd ent Entry ( count , Ġpos Ġ+ Ġw space . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġstr . length Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġindent Map Ġ= Ġmap ĊĠĠĠĠĠĠĠ ĠSuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġindent Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġctx . indent . count ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġctx . ist ack . peek () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ> Ġold ) ĠSuccess Ġafter Ġ{ Ġctx . ist ack . push ( new ) Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfailure ( ctx ) Ġ{ Ġ" Expecting Ġindentation Ġ> Ġ$ old Ġpositions Ġ( found : Ġ$ new Ġpositions )" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġde dent Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġctx . indent . count ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġctx . ist ack . peek () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ< Ġold Ġ|| Ġctx . pos Ġ== Ġctx . text . length Ġ- Ġ 1 ) ĠSuccess Ġafter Ġ{ Ġctx . ist ack . pop () Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfailure ( ctx ) Ġ{ Ġ" Expecting Ġindentation Ġ< Ġ$ old Ġpositions Ġ( found : Ġ$ new Ġpositions )" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnewline Ġ= ĠPredicate Ġ{ Ġctx Ġ-> Ġctx . pos Ġ== Ġctx . indent . end Ġ|| Ġctx . pos Ġ== Ġctx . text . length Ġ- Ġ 1 Ġ} ĊĊĠĠĠ Ġ/// ĠTY PES Ġ// //////////////////////////////////////////////////////////////////////////////// //// ĊĊĠĠĠ Ġdata Ġclass ĠType Ġ( val Ġname : ĠString , Ġval Ġpriv : ĠLink List < Type >) ĊĠĠĠ Ġclass ĠType Stack : ĠMon otonic Stack < Type >() ĊĠĠĠ Ġval ĠContext . types : ĠType Stack Ġ/** / Ġget () Ġ= Ġstate ( Type Stack :: class ) ĊĊĠĠĠ Ġfun Ġis Type ( ctx : ĠContext , Ġid en : ĠString ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġ= Ġctx . types . any Ġ{ Ġit . name Ġ== Ġid en Ġ} ĊĊĠĠĠ Ġfun Ġpriv ( ctx : ĠContext , Ġid en : ĠString ): ĠLink List < Type > ĊĠĠĠĠĠĠĠ Ġ= Ġctx . types . first OrNull Ġ{ Ġit . name Ġ== Ġid en Ġ} Ġ? . Ġpriv Ġ?: ĠLink List () ĊĊĠĠĠ Ġfun ĠNew Type Ġ( child : ĠParser , Ġalias : ĠBoolean Ġ= Ġfalse ) Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġchild . parse ( ctx ) Ġand Do Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġctx . stack . peek () Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . types . push ( Type ( name , Ġif Ġ( alias ) Ġpriv ( ctx , Ġname ) Ġelse ĠLink List ())) ĊĠĠĠ Ġ} ĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠScoped ( body : ĠParser ) Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġctx . types . size ĊĠĠĠĠĠĠĠ Ġbody . parse ( ctx ) Ġand Do Ġ{ Ġctx . types . truncate ( size ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinherit ( ctx : ĠContext , Ġname : ĠString ) ĊĠĠĠĠĠĠĠ Ġ= Ġpriv ( ctx , Ġname ). forEach Ġ{ Ġctx . types . push ( it ) Ġ} ĊĊĠĠĠ Ġfun ĠClass Def Ġ( body : ĠParser ) Ġ= ĠParser Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġctx . stack . at ( 0 ) Ġas ĠMaybe < Simple Type > ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġctx . stack . at ( 1 ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= Ġctx . types . snapshot () ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠSome < Simple Type >) Ġinherit ( ctx , Ġparent . value . name ) ĊĠĠĠĠĠĠĠ Ġbody . parse ( ctx ) Ġand Do Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġctx . types . diff ( snapshot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . types . restore ( snapshot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . types . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . types . push ( Type ( name , Ġdiff )) ĊĠĠĠ Ġ} ĠĠ Ġ} ĊĊĠĠĠ Ġval Ġan on Class Inherit Ġ= ĠPerform Ġ{ Ġctx Ġ-> Ġinherit ( ctx , Ġctx . stack . at ( 1 ) Ġas ĠString ) Ġ} ĊĊĠĠĠ Ġval Ġclass Guard Ġ= ĠSeq ( iden , ĠPredicate Ġ{ Ġctx Ġ-> Ġis Type ( ctx , Ġctx . stack . peek () Ġas ĠString ) Ġ}). ahead ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĊĠĠĠ Ġ/// Ġ--- ĠTypes ĊĊĠĠĠ Ġval Ġidentifier Ġ= Ġid en ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠIdentifier ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġsimple Type Ġ= Ġid en ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠSimple Type ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġfun Type Params Ġ= ĠSeq ( +" (", Ġ! " type " Ġaround Ġ+ ", ", Ġ+ ") ") ĊĠĠĠĠĠĠĠ Ġ. collect < Type >() ĊĊĠĠĠ Ġval Ġfun Type Ġ= ĠSeq ( fun Type Params , Ġ+" -> ", Ġ! " type ") ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠFun Type ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġtype Ġ= Ġ! Choice ( simple Type , Ġfun Type ) ĊĊĠĠĠ Ġval Ġtyped Id en Ġ= ĠSeq ( iden , ĠSeq (+ ": ", Ġtype ). maybe ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠTyped Identifier ( get (), Ġmaybe ()) Ġ} ĊĊĠĠĠ Ġval Ġparam Decl s Ġ= Ġ( typed Id en Ġaround Ġ+ ", ") ĊĠĠĠĠĠĠĠ Ġ. collect < Typed Identifier >() ĊĊĠĠĠ Ġval Ġparam Arrow Ġ= ĠSeq ( param Decl s , Ġ+" -> "). maybe ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ Ġmaybe () Ġ?: Ġempty List < Typed Identifier >() Ġ} ĊĊĠĠĠ Ġ/// Ġ--- ĠExpress ions ĊĊĠĠĠ Ġval Ġp aren Expr Ġ= ĠSeq ( +" (", Ġ! " expr ", Ġ+ ") ") ĊĊĠĠĠ Ġval Ġstring Lit Ġ= Ġstring ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠString Lit ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġint Lit Ġ= Ġint ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠInteger Lit ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġparam List Ġ= ĠSeq ( +" (", Ġ! " expr " Ġaround Ġ+ ", ", Ġ+ ") ") ĊĠĠĠĠĠĠĠ Ġ. collect < Expr >() ĊĊĠĠĠ Ġval Ġthis Call Ġ= ĠSeq ( +" this ", Ġparam List ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠThis Call ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġ` this ` Ġ= Ġ( +" this ") ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠThis Ġ} ĊĊĠĠĠ Ġval Ġsuper Call Ġ= ĠSeq ( +" super ", Ġparam List ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠSuper Call ( get ()) Ġ} ĊĊĠĠĠ Ġval Ġfun Call Ġ= ĠSeq ( iden , Ġparam List ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠFun Call ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġctor Call Ġ= ĠSeq ( class Guard , Ġid en , Ġparam List ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠC tor Call ( get (), Ġget (), Ġnull ) Ġ} ĊĊĠĠĠ Ġval Ġlambda Ġ= ĠSeq ( +" {", Ġparam Arrow , Ġ! " expr ", Ġ+ "} ") ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠLambda ( get (), ĠlistOf ( Return ( get ()))) Ġ} ĊĊĠĠĠ Ġval Ġsimple Ġ= ĠChoice ( ĊĠĠĠĠĠĠĠ Ġp aren Expr , ĊĠĠĠĠĠĠĠ Ġstring Lit , ĊĠĠĠĠĠĠĠ Ġint Lit , ĊĠĠĠĠĠĠĠ Ġthis Call , ĊĠĠĠĠĠĠĠ Ġ` this `, ĊĠĠĠĠĠĠĠ Ġsuper Call , ĊĠĠĠĠĠĠĠ Ġctor Call , ĊĠĠĠĠĠĠĠ Ġfun Call , ĊĠĠĠĠĠĠĠ Ġidentifier , ĊĠĠĠĠĠĠĠ Ġlambda ) ĊĊĠĠĠ Ġval Ġmethod Call Ġ= ĠSeq (! " postfix ", Ġ+ ". ", Ġfun Call ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠMethod Call ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġfield Access Ġ= ĠSeq (! " postfix ", Ġ+ ". ", Ġid en ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠField Access ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġpostfix Ġ= Ġ! Choice ( method Call , Ġfield Access , Ġsimple ) ĊĊĠĠĠ Ġval Ġsum Ġ= ĠSeq (! " add itive ", Ġ+ "+ ", Ġpostfix ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠSum ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġdiff Ġ= ĠSeq (! " add itive ", Ġ+" -", Ġpostfix ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠDiff ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġadd itive Ġ= Ġ! Choice ( sum , Ġdiff , Ġpostfix ) ĊĊĠĠĠ Ġval Ġassign Suffix ĊĠĠĠĠĠĠĠ Ġ= ĠSeq ( +" =", Ġ! " assign ") ĊĠĠĠĠĠĠĠ Ġ. build ( 1 ) Ġ{ ĠAssign ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġassign ĊĠĠĠĠĠĠĠ Ġ= Ġ! Seq ( add itive , Ġassign Suffix . opt ) ĊĊĠĠĠ Ġ// Ġval Ġassign Ġ= ĠSeq ( add itive , ĠZero More ( Seq ( +" =", Ġadd itive )). collect ) ĊĠĠĠ Ġ// ĠĠĠ Ġ. right Assoc < Expr > Ġ{ Ġacc , Ġitem Ġ-> ĠAssign ( item , Ġacc ) Ġ} ĊĊĠĠĠ Ġval Ġexpr Ġ= Ġ! assign ĊĊĠĠĠ Ġ// Ġ--- ĠState ments ĊĊĠĠĠ Ġval Ġstatements Ġ= ĠSeq ( indent , ĠScoped (! " statement " Ġuntil Ġde dent )) ĊĠĠĠĠĠĠĠ Ġ. collect < Stmt >() ĊĊĠĠĠ Ġval Ġdecl s Ġ= ĠSeq ( indent , Ġ(( !" decl ") Ġuntil Ġde dent )) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ Ġrest < Decl >() Ġ} ĊĊĠĠĠ Ġval Ġ` if ` Ġ= ĠSeq ( +" if ", Ġexpr , Ġstatements ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠIf ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġ` while ` = ĠSeq ( +" while ", Ġexpr , Ġstatements ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠWhile ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġ` return ` Ġ= ĠSeq ( +" return ", Ġexpr . maybe , Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠReturn ( maybe ()) Ġ} ĊĊĠĠĠ Ġval Ġ` break ` Ġ= ĠSeq ( +" break ", Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠBreak Ġ} ĊĊĠĠĠ Ġval Ġ` continue ` Ġ= ĠSeq ( +" continue ", Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠContinue Ġ} ĊĊĠĠĠ Ġval Ġskip Ġ= ĠSeq ( +" skip ", Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠSkip Ġ} ĊĊĠĠĠ Ġval Ġblock Call Suffix Ġ= ĠSeq ( param Arrow , Ġstatements ) ĊĊĠĠĠ Ġval Ġblock Fun Call Ġ= ĠSeq ( fun Call , Ġblock Call Suffix ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġget < Fun Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . copy ( params Ġ= Ġcall . params Ġ+ ĠLambda ( get (), Ġget ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġa MethodCall Ġ= ĠPredicate Ġ{ Ġctx Ġ-> Ġctx . stack . peek () Ġis ĠMethod Call Ġ} ĊĊĠĠĠ Ġval Ġblock MethodCall Ġ= ĠSeq ( a MethodCall , Ġblock Call Suffix ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġget < MethodCall >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . copy ( right Ġ= Ġcall . right . copy ( params Ġ= Ġcall . right . params Ġ+ ĠLambda ( get (), Ġget ()))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġblock Ctor Body Ġ= ĠScoped ( Seq ( anon Class Inherit , Ġdecl s )) ĊĊĠĠĠ Ġval Ġblock Ctor Ġ= ĠSeq ( class Guard , Ġid en , Ġparam List , Ġblock Ctor Body ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠC tor Call ( get (), Ġget (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġblock Call Ġ= ĠChoice ( block Ctor , Ġblock MethodCall , Ġblock Fun Call ) ĊĊĠĠĠ Ġval Ġvar Right Ġ= ĠSeq ( +" =", ĠChoice ( block Call , Ġexpr )). maybe ĊĊĠĠĠ Ġval Ġ` val ` Ġ= ĠSeq ( +" val ", Ġtyped Id en , Ġvar Right , Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠVal ( get (), Ġmaybe ()) Ġ} ĊĊĠĠĠ Ġval Ġ` var ` Ġ= ĠSeq ( +" var ", Ġtyped Id en , Ġvar Right , Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠVar ( get (), Ġmaybe ()) Ġ} ĊĊĠĠĠ Ġ// Ġ--- ĠClasses ĊĊĠĠĠ Ġval Ġclass Body Ġ= ĠClass Def ( decl s . maybe ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ Ġmaybe () Ġ?: Ġempty List < Decl >() Ġ} ĊĊĠĠĠ Ġval Ġ` class ` Ġ= ĠSeq ( +" class ", ĠNew Type ( iden ), ĠSeq (+ ": ", Ġsimple Type ). maybe , Ġclass Body ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠClass ( get (), Ġmaybe (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġalias Ġ= ĠSeq ( +" alias ", ĠNew Type ( iden , Ġalias Ġ= Ġtrue ), Ġ+" =", Ġtype ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠAlias ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġp aren Param Decl s Ġ= ĠSeq ( +" (", Ġparam Decl s , Ġ+ ") ") ĊĊĠĠĠ Ġval ĠreturnType Ġ= ĠSeq (+ ": ", Ġtype ). maybe ĊĊĠĠĠ Ġval Ġ` fun ` Ġ= ĠSeq ( +" fun ", Ġid en , Ġp aren Param Decl s , ĠreturnType , Ġstatements ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠFun ( get (), Ġget (), Ġmaybe (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġconstructor Ġ= ĠSeq ( +" constructor ", Ġp aren Param Decl s , Ġstatements ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠConstructor ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġblock Assign Ġ= ĠSeq ( identifier , Ġ+" =", Ġblock Call ) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠAssign ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġdecl Ġ= Ġ! Choice (` val `, Ġ` var `, Ġ` fun `, Ġalias , Ġ` class `, Ġconstructor ) ĊĊĠĠĠ Ġval Ġstatement Ġ= Ġ! Choice ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` if `, Ġ` while `, Ġ` break `, Ġ` continue `, Ġ` return `, Ġskip , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Assign , Ġdecl , Ġblock Call , ĠSeq ( expr , Ġnewline )) ĊĊĠĠĠ Ġval Ġpkg String Ġ= Ġ( iden Ġaround Ġ+ ". ") ĊĠĠĠĠĠĠĠ Ġ. collect < String >() ĊĊĠĠĠ Ġval Ġimport Ġ= ĠSeq ( +" import ", Ġpkg String , Ġ+ ": ", ĠNew Type ( iden )) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠImport ( get (), Ġget ()) Ġ} ĊĊĠĠĠ Ġval Ġimports Ġ= Ġ( import Ġaround Ġnewline ) ĊĠĠĠĠĠĠĠ Ġ. collect < Import >() ĊĊĠĠĠ Ġval Ġclasses Ġ= Ġ` class `. repeat ĊĠĠĠĠĠĠĠ Ġ. collect < Class >() ĊĊĠĠĠ Ġoverride Ġval Ġroot Ġ= ĠScoped ( Seq ( whitespace , Ġbuild Indent Map , Ġimports , Ġclasses )) ĊĠĠĠĠĠĠĠ Ġ. build Ġ{ ĠFile ( get (), Ġget ()) Ġ} Ċ } Ċ