/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠMath L ing ua ĠAuthors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġmath ling ua . frontend . chalk talk . phase 1 . ast Ċ Ċ enum Ġclass ĠCh alk Talk TokenType Ġ{ ĊĠĠĠ ĠDot Space , ĊĠĠĠ ĠName , ĊĠĠĠ ĠCol on , ĊĠĠĠ ĠString , ĊĠĠĠ ĠStatement , ĊĠĠĠ ĠId , ĊĠĠĠ ĠCom ma , ĊĠĠĠ ĠBegin , ĊĠĠĠ ĠEnd , ĊĠĠĠ ĠLine break , ĊĠĠĠ ĠInvalid , ĊĠĠĠ ĠEquals , ĊĠĠĠ ĠCol on Equals , ĊĠĠĠ ĠLP aren , ĊĠĠĠ ĠRP aren , ĊĠĠĠ ĠL Cur ly , ĊĠĠĠ ĠR Cur ly , ĊĠĠĠ ĠUnd erscore , ĊĠĠĠ ĠDot Dot Dot , ĊĠĠĠ ĠBlock Comment Ċ } Ċ Ċ sealed Ġclass ĠPhase 1 Target Ġ: ĠPhase 1 Node Ċ Ċ interface ĠGroup Or Block Comment Ġ: ĠPhase 1 Node Ċ Ċ data Ġclass ĠBlock Comment ( val Ġtext : ĠString ) Ġ: ĠGroup Or Block Comment Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġto Code () Ġ= Ġtext ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= Ġtransformer ( this ) ĊĊĠĠĠ Ġfun Ġprint ( buffer : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer . append ( to Code ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠGroup ( val Ġsections : ĠList < Section >, Ġval Ġid : ĠPhase 1 Token ?) Ġ: ĊĠĠĠ ĠPhase 1 Target (), ĠGroup Or Block Comment Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsections . forEach ( fn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint ( buffer : ĠStringBuilder , Ġlevel : ĠInt , Ġfrom Arg : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . append ( id . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( sect Ġin Ġsections ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsect . print ( buffer , Ġlevel , Ġfrom Arg Ġ&& Ġid Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsect . print ( buffer , Ġlevel , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġprint ( buffer , Ġ 0 , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections Ġ= Ġsections . map Ġ{ Ġit . transform ( transformer ) Ġas ĠSection Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid ?. transform ( transformer ) Ġas ĠPhase 1 Token )) Ċ } Ċ Ċ // Ġ---------------------------------------------------------------- ------------------------------------------------ -- Ġ// Ċ Ċ sealed Ġclass ĠTuple Item Ġ: ĠPhase 1 Target () Ċ Ċ data Ġclass ĠAssignment ( val Ġlhs : ĠPhase 1 Token , Ġval Ġrhs : ĠAssignment R hs ) Ġ: ĠTuple Item () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfn ( lhs ) ĊĠĠĠĠĠĠĠ Ġfn ( rhs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Code () Ġ= Ġlhs . to Code () Ġ+ Ġ" Ġ:= Ġ" Ġ+ Ġrhs . to Code () ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssignment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlhs Ġ= Ġlhs . transform ( transformer ) Ġas ĠPhase 1 Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrhs Ġ= Ġrhs . transform ( transformer ) Ġas ĠPhase 1 Token )) Ċ } Ċ Ċ // Ġ---------------------------------------------------------------- ------------------------------------------------ -- Ġ// Ċ Ċ sealed Ġclass ĠAssignment R hs Ġ: ĠTuple Item () Ċ Ċ data Ġclass ĠPhase 1 Token ( ĊĠĠĠ Ġval Ġtext : ĠString , Ġval Ġtype : ĠCh alk Talk TokenType , Ġval Ġrow : ĠInt , Ġval Ġcolumn : ĠInt Ċ ) Ġ: ĠAssignment R hs () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġto Code () Ġ= Ġtext ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= Ġtransformer ( this ) Ċ } Ċ Ċ data Ġclass ĠTuple ( val Ġitems : ĠList < Tuple Item >) Ġ: ĠAssignment R hs () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ= Ġitems . forEach ( fn ) ĊĊĠĠĠ Ġoverride Ġfun Ġto Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuilder . append (' (' ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġitems . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( items [ i ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġitems . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append (' )') ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransformer ( Tuple ( items Ġ= Ġitems . map Ġ{ Ġit . transform ( transformer ) Ġas ĠTuple Item Ġ})) Ċ } Ċ Ċ data Ġclass ĠAb straction ( ĊĠĠĠ Ġval Ġis En closed : ĠBoolean , ĊĠĠĠ Ġval Ġis Var Args : ĠBoolean , ĊĠĠĠ Ġval Ġparts : ĠList < Ab straction Part >, ĊĠĠĠ Ġval Ġsub Params : ĠList < Phase 1 Token >? Ċ ) Ġ: ĠAssignment R hs () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ= Ġparts . forEach ( fn ) ĊĊĠĠĠ Ġoverride Ġfun Ġto Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġif Ġ( is En closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('{ ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġparts . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( parts [ i ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġparts . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is En closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' }') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Params . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( sub Params [ 0 ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('{ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsub Params . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( sub Params [ i ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġsub Params . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' }') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Var Args ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" ...") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAb straction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis En closed Ġ= Ġis En closed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Var Args Ġ= Ġis Var Args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts Ġ= Ġparts . map Ġ{ Ġit . transform ( transformer ) Ġas ĠAb straction Part Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Params Ġ= Ġsub Params ?. map Ġ{ Ġit . transform ( transformer ) Ġas ĠPhase 1 Token Ġ})) Ċ } Ċ Ċ data Ġclass ĠAb straction Part ( ĊĠĠĠ Ġval Ġname : ĠPhase 1 Token , ĊĠĠĠ Ġval Ġsub Params : ĠList < Phase 1 Token > ?, ĊĠĠĠ Ġval Ġparams : ĠList < Phase 1 Token > ?, ĊĠĠĠ Ġval Ġtail : ĠAb straction Part ? Ċ ) Ġ: ĠAssignment R hs () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠforEach ( fn : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfn ( name ) ĊĠĠĠĠĠĠĠ Ġsub Params ?. forEach ( fn ) ĊĠĠĠĠĠĠĠ Ġparams ?. forEach ( fn ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( tail ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuilder . append ( name . to Code ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( sub Params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Params . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( sub Params [ 0 ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('{ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsub Params . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( sub Params [ i ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġsub Params . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' }') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' (' ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġparams . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( params [ i ]. to Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġparams . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' )') ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ... Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( tail . to Code ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( transformer : Ġ( node : ĠPhase 1 Node ) Ġ-> ĠPhase 1 Node ): ĠPhase 1 Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAb straction Part ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . transform ( transformer ) Ġas ĠPhase 1 Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Params Ġ= Ġsub Params ?. map Ġ{ Ġit . transform ( transformer ) Ġas ĠPhase 1 Token Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams ?. map Ġ{ Ġit . transform ( transformer ) Ġas ĠPhase 1 Token Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġ= Ġtail ?. transform ( transformer ) Ġas ĠAb straction Part ? )) ĊĠĠĠ Ġ} Ċ } Ċ