package Ġorg . mm 0 . kt Ċ Ċ class ĠString Consum able ( private Ġval Ġstring : ĠString , Ġprivate Ġvar Ġpos : ĠInt Ġ= Ġ 0 , Ġprivate Ġval Ġlim : ĠInt Ġ= Ġstring . length , Ġprivate Ġval Ġrecord Comments : Boolean = false ) Ġ: ĠCon sum able Ġ{ ĊĠĠĠ Ġ@ Experimental Unsigned Types ĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠComments Builder () ĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠString Consum able Ġ= ĠString Consum able ( string , Ġpos , Ġlim ) ĊĠĠĠ Ġoverride Ġfun Ġis Cons umed (): ĠBoolean Ġ= Ġpos Ġ>= Ġlim ĊĠĠĠ Ġoverride Ġfun Ġlook (): ĠChar Ġ= Ġstring [ pos ] ĊĠĠĠ Ġ@ Experimental Unsigned Types ĊĠĠĠ Ġoverride Ġfun Ġconsume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( record Comments ) Ġbuilder . skip () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( pos Ġ< Ġlim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġlook () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ'-' Ġ-> Ġif Ġ(! string . startsWith ("-- ", Ġpos )) Ġreturn Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( pos Ġ< Ġlim Ġ&& Ġlook () Ġ!= Ġ'\ n ') Ġpos ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record Comments ) Ġbuilder . add ( string . substring ( start , Ġpos )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ'\ n ' Ġ-> Ġif Ġ( record Comments ) Ġbuilder . add ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ' Ġ' Ġ-> Ġif Ġ( record Comments ) Ġbuilder . add ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Line (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġwhile Ġ( pos Ġ< Ġlim Ġ&& Ġlook () Ġ!= Ġ'\ n ') Ġpos ++ ĊĠĠĠĠĠĠĠ Ġreturn Ġstring . substring ( p , Ġpos ++) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Int (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġint Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġwhile Ġ( p Ġ< Ġlim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġstring [ p ] Ġ- Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ! in Ġ 0 .. 9 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġguard Ġagainst Ġint Ġoverflow ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( int Ġ> Ġ( Int . MAX _ VALUE Ġ- Ġc ) Ġ/ Ġ 1 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġ= Ġint Ġ* Ġ 1 0 Ġ+ Ġc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġint Ġnumber Ġ::= Ġ 0 Ġ| Ġ[ 1 - 9 ][ 0 - 9 ]* ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ== Ġpos Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġ== Ġ 0 Ġ&& Ġp Ġ!= Ġpos Ġ+ Ġ 1 Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġ> Ġ 0 Ġ&& Ġstring [ pos ] Ġ== Ġ' 0 ' Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpos Ġ= Ġp ĊĠĠĠĠĠĠĠ Ġreturn Ġint ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġconsume If ( text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! string . startsWith ( text , Ġpos )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġpos Ġ+= Ġtext . length ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume If ( char : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ>= Ġlim Ġ|| Ġstring [ pos ] Ġ!= Ġchar ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġpos ++ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Id ( allow Dummy : ĠBoolean ): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġposition Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġvar Ġis First Char Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( position Ġ< Ġlim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġstring [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Digit Ġ= Ġc Ġin Ġ' 0 ' .. ' 9 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ! in Ġ' a ' .. ' z ' Ġ&& Ġc Ġ! in Ġ' A ' .. ' Z ' Ġ&& Ġ! is Digit Ġ&& Ġc Ġ!= Ġ'_' Ġ&& Ġ( c Ġ!= Ġ'.' Ġ|| Ġ! allow Dummy )) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġid Ġcannot Ġstart Ġwith Ġa Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is First Char Ġ&& Ġis Digit ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis First Char Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġempty Ġid Ġaren 't Ġallowed ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġpos ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġsingle Ġ_ Ġcannot Ġbe Ġan Ġid ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġpos Ġ+ Ġ 1 Ġ&& Ġstring [ pos ] Ġ== Ġ'_ ') Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġstring . substring ( pos , Ġposition ) ĊĠĠĠĠĠĠĠ Ġpos Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Bal anced Parent hesis (): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġif Ġ( string [ start ] Ġ!= Ġ'(' ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġouter Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġstart Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( a Ġ< Ġlim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( string [ a ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'(' Ġ-> Ġouter ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ')' Ġ-> Ġif Ġ(-- outer Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġ++ a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstring . substring ( start , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume Formula (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( look () Ġ!= Ġ'$ ') Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġnew Pos Ġ= Ġstring . indexOf ('$ ', Ġpos Ġ+ Ġ 1 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( new Pos Ġ<= Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġpos Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġpos Ġ= Ġnew Pos ĊĠĠĠĠĠĠĠ Ġreturn Ġstring . substring ( start , Ġnew Pos Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Unsigned Types ĊĠĠĠ Ġoverride Ġfun Ġcomments (): ĠComments Ġ= Ġbuilder . get () ĊĊĠĠĠ Ġoverride Ġfun Ġposition (): ĠInt Ġ= Ġpos ĊĠĠĠ Ġoverride Ġfun Ġchar Sequences ( bounds : ĠList < Pair < Int , ĠInt >> ): ĠList < CharSequence > Ġ= Ġbounds . map Ġ{ Ġstring . substring ( it . first , Ġit . second . coerce At Most ( lim )) Ġ} Ċ }