package Ġcom . github . h 0 tk 3 y . better Parse . combin ators Ċ Ċ import Ġcom . github . h 0 tk 3 y . better Parse . lexer . Token Match Ċ import Ġcom . github . h 0 tk 3 y . better Parse . parser . Error Result Ċ import Ġcom . github . h 0 tk 3 y . better Parse . parser . Parse Result Ċ import Ġcom . github . h 0 tk 3 y . better Parse . parser . Parsed Ċ import Ġcom . github . h 0 tk 3 y . better Parse . parser . Parser Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠSepar ated Combin ator < T , ĠS >( ĊĠĠĠ Ġval Ġterm Parser : ĠParser < T >, ĊĠĠĠ Ġval Ġseparator Parser : ĠParser < S >, ĊĠĠĠ Ġval Ġaccept Zero : ĠBoolean Ċ ) Ġ: ĠParser < Separ ated < T , ĠS >> Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtry Parse ( tokens : ĠSequence < Token Match >): ĠParse Result < Separ ated < T , ĠS >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġterm Matches Ġ= Ġmutable ListOf < T >() ĊĠĠĠĠĠĠĠ Ġval Ġseparator Matches Ġ= Ġmutable ListOf < S >() ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġterm Parser . try Parse ( tokens ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Result Ġ-> Ġif Ġ( accept Zero ) ĠParsed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSepar ated ( emptyList (), Ġempty List ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParsed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Matches Ġ+= Ġfirst . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Remain der Ġ= Ġfirst . remainder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġseparator Parser . try Parse ( current Remain der ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( separator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Result Ġ-> Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParsed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Term Ġ= Ġterm Parser . try Parse ( separator . remainder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( next Term ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Result Ġ-> Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParsed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Matches Ġ+= Ġseparator . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Matches Ġ+= Ġnext Term . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Remain der Ġ= Ġnext Term . remainder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParsed ( Separ ated ( term Matches , Ġseparator Matches ), Ġcurrent Remain der ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠA Ġlist Ġof Ġ[ terms ] Ġseparated Ġby Ġ[ separ ators ], Ġwhich Ġis Ġeither Ġempty Ġ( both Ġ` terms ` Ġand Ġ` separ ators `) Ġor Ġcontains Ġone Ċ Ġ* Ġmore Ġterm Ġthan Ġthere Ġare Ġsepar ators . Ġ*/ Ċ class ĠSepar ated < T , ĠS >( ĊĠĠĠ Ġval Ġterms : ĠList < T >, ĊĠĠĠ Ġval Ġsepar ators : ĠList < S > Ċ ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( terms . size Ġ== Ġsepar ators . size Ġ+ Ġ 1 Ġ|| Ġterms . isEmpty () Ġ&& Ġsepar ators . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġresult Ġof Ġreducing Ġ[ terms ] Ġand Ġ[ separ ators ] Ġwith Ġ[ function ], Ġstarting Ġfrom Ġthe Ġleft Ġand Ġprocessing ĊĠĠĠĠ Ġ* Ġcurrent Ġresult Ġ( init ially , Ġ` terms [ 0 ] `), Ġ` separ ators [ i ]` Ġand Ġ` terms [ i Ġ+ Ġ 1 ]` Ġat Ġeach Ġstep Ġfor Ġ` i ` Ġin Ġ` 0 Ġuntil Ġterms . size `. ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ NoSuch ElementException ] Ġif Ġ[ terms ] Ġare Ġempty Ġ*/ ĊĠĠĠ Ġfun Ġreduce ( function : Ġ( T , ĠS , ĠT ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( terms . isEmpty ()) Ġthrow ĠNoSuch ElementException () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġterms . first () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsepar ators . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġfunction ( result , Ġsepar ators [ i ], Ġterms [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġresult Ġof Ġreducing Ġ[ terms ] Ġand Ġ[ separ ators ] Ġwith Ġ[ function ], Ġstarting Ġfrom Ġthe Ġright Ġand Ġprocessing ĊĠĠĠĠ Ġ* Ġ` terms [ i ] `, Ġ` separ ators [ i ]` Ġand Ġcurrent Ġresult Ġ( init ially , Ġ` terms . last () `) Ġat Ġeach Ġstep Ġfor Ġ` i ` Ġin Ġ` terms . size Ġ- Ġ 1 Ġdown To Ġ 0 `. ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ NoSuch ElementException ] Ġif Ġ[ terms ] Ġare Ġempty Ġ*/ ĊĠĠĠ Ġfun Ġreduce Right ( function : Ġ( T , ĠS , ĠT ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( terms . isEmpty ()) Ġthrow ĠNoSuch ElementException () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġterms . last () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsepar ators . indices . reversed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġfunction ( terms [ i ], Ġsepar ators [ i ], Ġresult ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠParses Ġa Ġchain Ġof Ġ[ term ] s Ġseparated Ġby Ġ[ separator ], Ġalso Ġaccepting Ġno Ġmatches Ġat Ġall Ġif Ġ[ accept Zero ] Ġis Ġtrue . Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠS > Ġseparated ( ĊĠĠĠ Ġterm : ĠParser < T >, ĊĠĠĠ Ġseparator : ĠParser < S >, ĊĠĠĠ Ġaccept Zero : ĠBoolean Ġ= Ġfalse Ċ ): ĠParser < Separ ated < T , ĠS >> Ġ= ĠSepar ated Combin ator ( term , Ġseparator , Ġaccept Zero ) Ċ Ċ /** ĠParses Ġa Ġchain Ġof Ġ[ term ] s Ġseparated Ġby Ġ[ separator ], Ġalso Ġaccepting Ġno Ġmatches Ġat Ġall Ġif Ġ[ accept Zero ] Ġis Ġtrue , Ġand Ġreturning Ċ Ġ* Ġonly Ġmatches Ġof Ġ[ term ]. Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠS > Ġseparated Terms ( ĊĠĠĠ Ġterm : ĠParser < T >, ĊĠĠĠ Ġseparator : ĠParser < S >, ĊĠĠĠ Ġaccept Zero : ĠBoolean Ġ= Ġfalse Ċ ): ĠParser < List < T >> Ġ= Ġseparated ( term , Ġseparator , Ġaccept Zero ) Ġmap Ġ{ Ġit . terms Ġ} Ċ Ċ /** ĠParses Ġa Ġchain Ġof Ġ[ term ] s Ġseparated Ġby Ġ[ operator ] Ġand Ġreduces Ġthe Ġresult Ġwith Ġ[ Separ ated . reduce ]. Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠS > Ġleft Associ ative ( ĊĠĠĠ Ġterm : ĠParser < T >, ĊĠĠĠ Ġoperator : ĠParser < S >, ĊĠĠĠ Ġno inline Ġtransform : Ġ( T , ĠS , ĠT ) Ġ-> ĠT Ċ ): ĠParser < T > Ġ= Ġseparated ( term , Ġoperator ) Ġmap Ġ{ Ġit . reduce ( transform ) Ġ} Ċ Ċ /** ĠParses Ġa Ġchain Ġof Ġ[ term ] s Ġseparated Ġby Ġ[ operator ] Ġand Ġreduces Ġthe Ġresult Ġwith Ġ[ Separ ated . reduce Right ]. Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠS > Ġright Associ ative ( ĊĠĠĠ Ġterm : ĠParser < T >, ĊĠĠĠ Ġoperator : ĠParser < S >, ĊĠĠĠ Ġno inline Ġtransform : Ġ( T , ĠS , ĠT ) Ġ-> ĠT Ċ ): ĠParser < T > Ġ= ĊĠĠĠ Ġseparated ( term , Ġoperator ) Ġmap Ġ{ Ġit . reduce Right ( transform ) Ġ} Ċ