/************************************************************************ ***** Ċ Ġ* ĠCopyright Ġ( C ) Ġj parse c . org ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ------------------------------------------------------------------------- Ġ* Ċ Ġ* Ġ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 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ* Ċ Ġ* Ġhttp :// 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 Ġorg . j parse c Ċ Ċ import Ġorg . j parse c . error . ParseError Details Ċ import Ġorg . j parse c . internal . annotations . Private Ċ import Ġorg . j parse c . internal . util . Checks . check State Ċ import Ġorg . j parse c . internal . util . Lists . array List Ċ Ċ /** Ċ Ġ* ĠRepresents Ġthe Ġcontext Ġstate Ġduring Ġparsing . Ċ Ġ* Ċ Ġ* Ġ@ author ĠBen ĠY u Ċ Ġ*/ Ċ abstract Ġclass ĠParse Context ( ĊĠĠĠ Ġ@ Jvm Field Ġval Ġsource : ĠCharSequence , ĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġparse Ġresult . Ġ Ġ*/ ĊĠĠĠ Ġ@ Jvm Field Ġvar Ġresult : ĠAny ?, ĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġposition Ġof Ġthe Ġinput . ĠPoints Ġto Ġthe Ġtoken Ġarray Ġfor Ġtoken Ġlevel . Ġ Ġ*/ ĊĠĠĠ Ġ@ Jvm Field Ġvar Ġat : ĠInt , ĊĠĠĠ Ġval Ġmodule : ĠString ?, ĊĠĠĠ Ġval Ġlocator : ĠSource Locator Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġlogical Ġstep . Ġ Ġ*/ ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġstep Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġtrace : ĠParser Trace Ġ= Ġobject : ĠParser Trace Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpush ( name : ĠString ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpop () Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠcurrentNode : ĠTreeNode ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetCurrent Result ( result : ĠAny ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġlatest Child : ĠTreeNode ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( node ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Fresh ( context : ĠParse Context ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetState As ( that : ĠParser Trace ) Ġ{} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġenum Ġclass ĠError Type ( val Ġmerge able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠDefault Ġvalue , Ġno Ġerror . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠNONE ( false ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġthe Ġerror Ġis Ġmostly Ġlen ient Ġ( as Ġa Ġdelimiter Ġof Ġrepet itions Ġfor Ġexample ). Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠDE LIMIT ING ( false ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġ[ Parser . not ] Ġis Ġcalled . ĠSign als Ġthat Ġsomething Ġisn 't Ġexpected . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠUN EXPECTED ( false ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġany Ġexpected Ġinput Ġisn 't Ġfound . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠMIS SING ( true ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġ[ Parser . label ] Ġis Ġcalled . ĠSign als Ġthat Ġa Ġlogical Ġstuff Ġisn 't Ġfound . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠEXPECT ING ( true ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġ[ Parsers . fail ] Ġis Ġcalled . ĠSign als Ġa Ġserious Ġproblem . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠFAILURE ( false ); ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent ErrorType Ġ= ĠError Type . NONE ĊĠĠĠ Ġprivate Ġvar Ġcurrent Error At : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġcurrent Error Index Ġ= Ġ 0 Ġ// ĠTODO : Ġis Ġit Ġnecessary Ġto Ġset Ġthis Ġto Ġthe Ġstarting Ġindex ? ĊĠĠĠ Ġprivate Ġval Ġerrors Ġ= Ġarray List < Any >( 3 2 ) ĊĠĠĠ Ġprivate Ġvar Ġencountered : ĠString ? Ġ= Ġnull Ġ// Ġfor Ġexplicitly Ġsetting Ġencountered Ġtoken Ġinto ĠScanner State . ĊĠĠĠ Ġprivate Ġvar Ġcurrent Error Node : ĠTreeNode ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġexplicit Ġsupp resses Ġerror Ġrecording Ġif Ġtrue . ĊĠĠĠ Ġprivate Ġvar Ġerror Sup pressed Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġoverride ErrorType Ġ= ĠError Type . NONE ĊĊĠĠĠ Ġ// caller Ġshould Ġnot Ġchange Ġinput Ġafter Ġit Ġis Ġpassed Ġin . ĊĠĠĠ Ġconstructor ( source : ĠCharSequence , Ġat : ĠInt , Ġmodule : ĠString ?, Ġlocator : ĠSource Locator ): Ġthis ( source , Ġnull , Ġat , Ġmodule , Ġlocator ) Ġ{} ĊĊĠĠĠ Ġ/** ĠRuns Ġ` parser ` Ġwith Ġerror Ġrecording Ġsupp ressed . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġwith Error Sup pressed ( parser : ĠParser < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġerror Sup pressed ĊĠĠĠĠĠĠĠ Ġerror Sup pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġparser . apply ( this ) ĊĠĠĠĠĠĠĠ Ġerror Sup pressed Ġ= ĠoldValue ĊĠĠĠĠĠĠĠ Ġreturn Ġok ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRuns Ġ` parser ` Ġwith Ġerror Ġrecording Ġsupp ressed . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġapply As Delimiter ( parser : ĠParser < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġoverride ErrorType ĊĠĠĠĠĠĠĠ Ġoverride ErrorType Ġ= ĠError Type . DE LIMIT ING ĊĠĠĠĠĠĠĠ Ġval Ġold Step Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġval Ġok Ġ= Ġparser . apply ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ok ) Ġstep Ġ= Ġold Step ĊĠĠĠĠĠĠĠ Ġoverride ErrorType Ġ= ĠoldValue ĊĠĠĠĠĠĠĠ Ġreturn Ġok ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġ` parser ` Ġas Ġa Ġnew Ġtree Ġnode Ġwith Ġ` name `, Ġand Ġif Ġfails , Ġreports ĊĠĠĠĠ Ġ* Ġ" expect ing Ġ$ name ". ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġapply New Node ( parser : ĠParser <* >, Ġname : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphysical Ġ= Ġat ĊĠĠĠĠĠĠĠ Ġval Ġlogical Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġval Ġlatest Child Ġ= Ġtrace . latest Child ĊĠĠĠĠĠĠĠ Ġtrace . push ( name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parser . apply ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . setCurrent Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( still There ( physical , Ġlogical )) Ġexpected ( name ) ĊĠĠĠĠĠĠĠ Ġtrace . pop () ĊĠĠĠĠĠĠĠ Ġ// ĠOn Ġfailure , Ġthe Ġerr one ous Ġpath Ġshouldn 't Ġbe Ġcounted Ġin Ġthe Ġparse Ġtree . ĊĠĠĠĠĠĠĠ Ġtrace . latest Child Ġ= Ġlatest Child ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Nested ( parser : ĠParser <* >, Ġnested State : ĠParse Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnested Ġis Ġeither Ġthe Ġtoken - level Ġparser , Ġor Ġthe Ġinner Ġscanner Ġof Ġa Ġsub pattern . ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parser . apply ( nested State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( nested State . step , Ġat , Ġnested State . result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġindex Ġon Ġtoken Ġlevel Ġis Ġthe Ġ" at " Ġon Ġcharacter Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( step , Ġnested State . index , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalways Ġcopy Ġerror Ġbecause Ġthere Ġcould Ġbe Ġfalse Ġal arms Ġin Ġthe Ġcharacter Ġlevel . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġa Ġ" or " Ġparser Ġnested Ġin Ġa Ġ" many " Ġfailed Ġin Ġone Ġof Ġits Ġbranches . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Error From ( nested State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . setState As ( nested State . trace ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrepeat ( parser : ĠParser <* >, Ġn : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parser . apply ( this )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġrepeat ( ĊĠĠĠĠĠĠĠ Ġparser : ĠParser < out ĠT >, Ġn : ĠInt , Ġcollection : ĠMutable Collection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parser . apply ( this )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . add ( parser . get Return ( this )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġphysical Ġindex Ġof Ġthe Ġcurrent Ġmost Ġrelevant Ġerror , Ġ` 0 ` Ġif Ġnone . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġerror Index (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Error Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ParseTree (): ĠParse Tree ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentNode Ġ= Ġtrace . currentNode Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠcurrentNode . freeze ( index ) !!. to ParseTree () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Error ParseTree (): ĠParse Tree ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcurrent Ġnode Ġis Ġpartially Ġdone Ġbecause Ġthere Ġwas Ġan Ġerror . ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġorphan ize Ġit . ĠBut Ġat Ġthe Ġsame Ġtime , Ġall Ġancestor Ġnodes Ġshould Ġhave Ġtheir Ġend Index Ġset Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġwhere Ġwe Ġare Ġnow . ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( current Error Node Ġ== Ġnull ) Ġnull Ġelse Ġcurrent Error Node !!. orphan ize (). freeze ( index ) !!. to ParseTree () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOnly Ġcalled Ġwhen Ġrendering Ġthe Ġerror Ġin Ġ[ Parser Exception ]. Ġ Ġ*/ ĊĠĠĠ Ġfun Ġrender Error (): ĠParse Error Details Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Index Ġ= Ġto Index ( current Error At ) ĊĠĠĠĠĠĠĠ Ġval Ġencountered Name Ġ= Ġget Encounter ed () ĊĠĠĠĠĠĠĠ Ġval Ġerror Strings Ġ= Ġarray List < String >( errors . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( error Ġin Ġerrors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Strings . add ( error . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( current ErrorType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Type . UN EXPECTED Ġ-> Ġobject : ĠEmpty ParseError ( error Index , Ġencountered Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġunexpected : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġerror Strings [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Type . FAILURE Ġ-> Ġobject : ĠEmpty ParseError ( error Index , Ġencountered Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġfailure Message : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġerror Strings [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Type . EXPECT ING , ĠError Type . MISSING , ĠError Type . DE LIMIT ING Ġ-> Ġobject : ĠEmpty ParseError ( error Index , Ġencountered Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġexpected : ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġerror Strings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠEmpty ParseError ( error Index , Ġencountered Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Encounter ed (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( en counter ed Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencountered !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġget Input Name ( current Error At ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġstring Ġrepresentation Ġof Ġthe Ġcurrent Ġinput Ġ( character Ġor Ġtoken ). Ġ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Input Name ( pos : ĠInt ): ĠString ĊĠĠĠ Ġabstract Ġval Ġis E of : ĠBoolean ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġcurrent Ġindex Ġin Ġthe Ġoriginal Ġsource . Ġ Ġ*/ ĊĠĠĠ Ġval Ġindex : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġto Index ( at ) ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġcurrent Ġtoken . ĠOnly Ġapplicable Ġto Ġtoken Ġlevel Ġparser . Ġ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġtoken : ĠToken ĊĊĠĠĠ Ġ/** ĠP eek s Ġthe Ġcurrent Ġcharacter . ĠOnly Ġapplicable Ġto Ġcharacter Ġlevel Ġparser . Ġ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġpeek Char (): ĠChar ĊĊĠĠĠ Ġ/** ĠTrans lates Ġthe Ġlogical Ġposition Ġto Ġphysical Ġindex Ġin Ġthe Ġoriginal Ġsource . Ġ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġto Index ( pos : ĠInt ): ĠInt ĊĠĠĠ Ġ@ Private Ġfun Ġraise ( type : ĠError Type , Ġsubject : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġif Ġ( error Sup pressed ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( at Ġ< Ġcurrent Error At ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( override ErrorType Ġ!= ĠError Type . NONE ) Ġtype Ġ= Ġoverride ErrorType ĊĠĠĠĠĠĠĠ Ġif Ġ( at Ġ> Ġcurrent Error At ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetError State ( at , Ġindex , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( subject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġerror Ġlocation Ġis Ġsame ĊĠĠĠĠĠĠĠ Ġif Ġ( type . ordinal Ġ< Ġcurrent ErrorType . ordinal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( type . ordinal Ġ> Ġcurrent ErrorType . ordinal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetError State ( at , Ġindex , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( subject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġeven Ġerror Ġtype Ġis Ġsame ĊĠĠĠĠĠĠĠ Ġif Ġ( type . merge able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmerge Ġexpected Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( subject ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfail ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġraise ( ErrorType . FAILURE , Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmissing ( what : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġraise ( ErrorType . MISSING , Ġwhat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpected ( what : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġraise ( ErrorType . EXPECT ING , Ġwhat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunexpected ( what : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġraise ( ErrorType . UN EXPECTED , Ġwhat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstill There ( was At : ĠInt , Ġoriginal Step : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( step Ġ== Ġoriginal Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlogical Ġstep Ġdidn 't Ġchange , Ġso Ġlog ically Ġwe Ġare Ġstill Ġthere , Ġundo Ġany Ġphysical Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset At ( original Step , Ġwas At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( step : ĠInt , Ġat : ĠInt , Ġret : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . step Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġthis . at Ġ= Ġat ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset At ( step : ĠInt , Ġat : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . step Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġthis . at Ġ= Ġat ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġnext () Ġ{ ĊĠĠĠĠĠĠĠ Ġat ++ ĊĠĠĠĠĠĠĠ Ġstep ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġat Ġ+= Ġn ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ> Ġ 0 ) Ġstep ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠEnables Ġparse Ġtree Ġtracing Ġwith Ġ` root Name ` Ġas Ġthe Ġname Ġof Ġthe Ġroot Ġnode . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġenable Trace ( root Name : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrace Ġ= Ġobject : ĠParser Trace Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar ĠcurrentNode : ĠTreeNode ? Ġ= ĠTreeNode ( root Name !! , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpush ( name : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠcurrentNode !!. addChild ( name !! , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode !!. set End Index ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠcurrentNode !!. parent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetCurrent Result ( result : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode !!. set Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġlatest Child : ĠTreeNode ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠcurrentNode !!. latest Child ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( latest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State ( latest Ġ== Ġnull Ġ|| Ġlatest . parent () Ġ== ĠcurrentNode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Trying Ġto Ġset Ġa Ġchild Ġnode Ġnot Ġowned Ġby Ġthe Ġparent Ġnode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode !!. latest Child Ġ= Ġlatest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Fresh ( context : ĠParse Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . enable Trace ( root Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetState As ( that : ĠParser Trace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= Ġthat . currentNode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAllows Ġtracing Ġof Ġparsing Ġprogress Ġduring Ġerror Ġcondition , Ġto Ġease Ġdebugging . Ġ Ġ*/ ĊĠĠĠ Ġinterface ĠParser Trace Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUp on Ġapplying Ġa Ġparser Ġwith Ġ[ Parser . label ], Ġthe Ġlabel Ġname Ġis Ġused Ġto Ġcreate Ġa Ġnew ĊĠĠĠĠĠĠĠĠ Ġ* Ġchild Ġnode Ġunder Ġthe Ġcurrent Ġnode . ĠThe Ġnew Ġchild Ġnode Ġis Ġset Ġto Ġbe Ġthe Ġcurrent Ġnode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( name : ĠString ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhen Ġa Ġparser Ġfinishes , Ġthe Ġcurrent Ġnode Ġis Ġpop ped Ġso Ġwe Ġare Ġback Ġto Ġthe Ġparent Ġparser . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpop () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġthe Ġcurrent Ġnode , Ġthat Ġis Ġbeing Ġparsed Ġ( not Ġnecessarily Ġfinished ). Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentNode : ĠTreeNode ? ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWh enever Ġa Ġlabeled Ġparser Ġsucceeds , Ġit Ġcalls Ġthis Ġmethod Ġto Ġset Ġits Ġresult Ġin Ġthe Ġtrace . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsetCurrent Result ( result : ĠAny ?) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġby Ġbranch ing Ġparsers , Ġto Ġsave Ġthe Ġcurrent Ġstate Ġof Ġtree , Ġbefore Ġtrying Ġparsers Ġthat ĊĠĠĠĠĠĠĠĠ Ġ* Ġcould Ġmodify Ġthe Ġtree Ġstate . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġby Ġlabeled Ġparser Ġto Ġreset Ġthe Ġcurrent Ġchild Ġnode Ġwhen Ġthe Ġcurrent Ġnode Ġfailed . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAlso Ġcalled Ġby Ġ[ Best Parser ] Ġto Ġset Ġthe Ġopt imum Ġparse Ġtree . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġlatest Child : ĠTreeNode ? ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCalled Ġwhen Ġtokenizer Ġpasses Ġon Ġto Ġtoken - level Ġparser . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġstart Fresh ( context : ĠParse Context ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġen closing Ġparser 's Ġtree Ġstate Ġinto Ġthe Ġnested Ġparser 's Ġstate . ĠCalled Ġfor Ġboth Ġnested ĊĠĠĠĠĠĠĠĠ Ġ* Ġtoken - level Ġparser Ġand Ġnested Ġscanner . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsetState As ( that : ĠParser Trace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetError State ( ĊĠĠĠĠĠĠĠ Ġerror At : ĠInt , Ġerror Index : ĠInt , Ġerror Type : ĠError Type , Ġerrors : ĠList < Any >) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetError State ( error At , Ġerror Index , Ġerror Type ) ĊĠĠĠĠĠĠĠ Ġthis . errors . addAll ( errors ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetError State ( error At : ĠInt , Ġerror Index : ĠInt , Ġerror Type : ĠError Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Error Index Ġ= Ġerror Index ĊĠĠĠĠĠĠĠ Ġcurrent Error At Ġ= Ġerror At ĊĠĠĠĠĠĠĠ Ġcurrent ErrorType Ġ= Ġerror Type ĊĠĠĠĠĠĠĠ Ġcurrent Error Node Ġ= Ġtrace . currentNode ĊĠĠĠĠĠĠĠ Ġencountered Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġerrors . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Error From ( that : ĠParse Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Index Ġ= Ġthat . error Index () ĊĠĠĠĠĠĠĠ ĠsetError State ( error Index , Ġerror Index , Ġthat . current ErrorType , Ġthat . errors ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! that . is E of ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencountered Ġ= Ġthat . get Encounter ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Error Node Ġ= Ġthat . current Error Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReads Ġthe Ġcharacters Ġas Ġinput . ĠOnly Ġapplicable Ġto Ġcharacter Ġlevel Ġparsers . Ġ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġcharacters (): ĠCharSequence ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsource . sub Sequence ( index , Ġsource . length ). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEOF Ġ= Ġ" EOF " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Error At Ġ= Ġat ĊĠĠĠ Ġ} Ċ }