// ĠHelpers Ġfor Ġparsing Ċ Ċ package ĠParse Lib Ċ Ċ fun Ġindent ( depth Ġ: ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġ"\ t ". repeat ( depth ) Ċ Ċ abstract Ġclass ĠNode Ġ( val Ġstart Ġ: ĠInt , Ġval Ġlen Ġ: ĠInt ) Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġprint Ġ( str Ġ: ĠString , Ġdepth Ġ: ĠInt Ġ= Ġ 0 ) Ġ: ĠString ĊĠĠĠ Ġfun Ġmatched Ġ( str Ġ: ĠString ) Ġ= Ġstr . substring Ġ( start , Ġstart + len ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġis ĠNode Ġ&& Ġother . start Ġ== Ġstart Ġ&& Ġother . len Ġ== Ġlen ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 3 1 Ġ* Ġstart Ġ+ Ġlen Ċ } Ċ Ċ open Ġclass ĠTerminal Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt ) Ġ: ĠNode Ġ( start , Ġlen ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= Ġindent ( depth ) Ġ+ Ġ" Terminal (" Ġ+ Ġmatched ( str ) Ġ+ Ġ")" ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġis ĠTerminal Ġ&& Ġsuper . equals ( other ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 3 1 Ġ* Ġstart Ġ+ Ġlen Ċ } Ċ Ċ open Ġclass ĠSequence Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt , Ġval Ġchildren Ġ: ĠArray < Node >) Ġ: ĠNode Ġ( start , Ġlen ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str : ĠString , Ġdepth Ġ: ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindent ( depth ) Ġ+ Ġ" Sequence (\ n " Ġ+ Ġprint Children ( str , Ġdepth ) Ġ+ Ġindent ( depth ) Ġ+ Ġ")" ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġprint Children ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . join ToString (", \ n ") Ġ{ Ġc Ġ-> Ġc . print ( str , Ġdepth Ġ+ Ġ 1 ) Ġ} Ġ+ Ġ"\ n " ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġis ĠSequence Ġ&& Ġsuper . equals ( other ) Ġ&& Ġchildren . content Equals ( other . children ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 3 1 Ġ* Ġsuper . hashCode () Ġ+ Ġchildren . content HashCode () Ċ } Ċ Ċ internal Ġdata Ġclass ĠChain Ġ< T > Ġ( val Ġobj Ġ: ĠT , Ġval Ġcount Ġ: ĠInt , Ġval Ġnext Ġ: ĠChain < T > ?) Ċ Ċ internal Ġfun Ġ< T > Ġto Reverse Array Ġ( c Ġ: ĠChain < T > ?, Ġklass Ġ: ĠClass < T >) Ġ: ĠArray < T > Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġres Ġ= Ġjava . lang . reflect . Array . newInstance ( klass , Ġc ?. count Ġ?: Ġ 0 ) Ġas ĠArray < T > ĊĠĠĠ Ġvar Ġscan Ġ= Ġc ĊĊĠĠĠ Ġwhile Ġ( scan Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġres [ scan . count Ġ- Ġ 1 ] Ġ= Ġscan . obj ĊĠĠĠĠĠĠĠ Ġscan Ġ= Ġscan . next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠT > Ġto Reverse Array Ġ( c Ġ: ĠChain < T > ?) Ġ: ĠArray < T > Ġ{ ĊĠĠĠ Ġreturn Ġto Reverse Array ( c , ĠT :: class . java ) Ċ } Ċ Ċ internal Ġfun Ġ< T > Ġadd Chain Ġ( c Ġ: ĠChain < T > ?, Ġobj Ġ: ĠT ) Ġ: ĠChain < T > Ġ{ ĊĠĠĠ Ġreturn ĠChain ( obj , Ġ( c ?. count Ġ?: Ġ 0 )+ 1 , Ġc ) Ċ } Ċ Ċ internal Ġenum Ġclass ĠParse Cont State Ġ{ ĠOK , ĠFAIL , ĠS US PEND Ġ}