package Ġcombin ator Ċ Ċ import Ġparser .* Ċ import Ġtools . Either Ċ Ċ val Ġchar A Ġ= Ġtoken (' A ') Ċ val Ġchar B Ġ= Ġtoken (' B ') Ċ val Ġchar C Ġ= Ġtoken (' C ') Ċ val Ġchar D Ġ= Ġtoken (' D ') Ċ val Ġchar E Ġ= Ġtoken (' E ') Ċ val Ġchar F Ġ= Ġtoken (' F ') Ċ val Ġchar G Ġ= Ġtoken (' G ') Ċ val Ġchar H Ġ= Ġtoken (' H ') Ċ val Ġchar I Ġ= Ġtoken (' I ') Ċ val Ġchar J Ġ= Ġtoken (' J ') Ċ Ċ fun Ġnum 0 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 0 ') Ġright Ġgive ( 0 )) Ċ } Ċ fun Ġnum 1 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 1 ') Ġright Ġgive ( 1 )) Ċ } Ċ fun Ġnum 2 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 2 ') Ġright Ġgive ( 2 )) Ċ } Ċ fun Ġnum 3 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 3 ') Ġright Ġgive ( 3 )) Ċ } Ċ fun Ġnum 4 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 4 ') Ġright Ġgive ( 4 )) Ċ } Ċ fun Ġnum 5 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 5 ') Ġright Ġgive ( 5 )) Ċ } Ċ fun Ġnum 6 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 6 ') Ġright Ġgive ( 6 )) Ċ } Ċ fun Ġnum 7 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 7 ') Ġright Ġgive ( 7 )) Ċ } Ċ fun Ġnum 8 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 8 ') Ġright Ġgive ( 8 )) Ċ } Ċ fun Ġnum 9 (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token (' 9 ') Ġright Ġgive ( 9 )) Ċ } Ċ Ċ fun Ġp Num (): ĠParser < Char , ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġnum 0 () Ġor Ġnum 1 () Ġor Ġnum 2 () Ġor Ġnum 3 () Ġor Ġnum 4 () Ġor Ġnum 5 () Ġor Ġnum 6 () Ġor Ġnum 7 () Ġor Ġnum 8 () Ġor Ġnum 9 () Ċ } Ċ Ċ fun Ġop Plus (): ĠParser < Char , Ġ( Int , ĠInt ) Ġ-> ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token ('+ ') Ġright Ġgive ({ Ġx : ĠInt , Ġy : ĠInt Ġ-> Ġx Ġ+ Ġy Ġ})) Ċ } Ċ Ċ fun Ġop Minus (): ĠParser < Char , Ġ( Int , ĠInt ) Ġ-> ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġ( token ('- ') Ġright Ġgive ({ Ġx : ĠInt , Ġy : ĠInt Ġ-> Ġx Ġ- Ġy Ġ})) Ċ } Ċ Ċ fun Ġp Op (): ĠParser < Char , Ġ( Int , ĠInt ) Ġ-> ĠInt > Ġ{ ĊĠĠĠ Ġreturn Ġop Plus () Ġor Ġop Minus () Ċ } Ċ Ċ fun Ġ< T , ĠR > Ġsuccess ( tokens : ĠSequence < T >, Ġparser : ĠParser < T , ĠR >) Ġ= Ġparser ( tokens ). let Ġ{ ĊĠĠĠ Ġ( it . first Ġas ĠEither . Right ). value Ġto Ġit . second . toList () Ċ } Ċ Ċ fun Ġ< T , ĠR > Ġfailure ( tokens : ĠSequence < T >, Ġparser : ĠParser < T , ĠR >) Ġ= Ġparser ( tokens ). let Ġ{ ĊĠĠĠ Ġval Ġfound Ġ= Ġit . second . first OrNull () ĊĠĠĠ Ġval Ġexception Ġ= Ġit . first . left () !! ĊĠĠĠ Ġwhen ( exception ){ ĊĠĠĠĠĠĠĠ Ġis ĠUnexpected Token Failure < *> Ġ-> Ġif Ġ( exception . tokens . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expecting Ġ'${ exception . tokens [ 0 ]} ' Ġbut Ġ'${ found Ġ?: Ġ" end Ġof Ġinput "} ' Ġwas Ġfound ." ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expecting Ġone Ġof Ġ${ exception . tokens . join ToString (",") Ġ{ Ġ"' $ it '" Ġ}} Ġbut Ġ'${ found Ġ?: Ġ" end Ġof Ġinput "} ' Ġwas Ġfound ." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠUnexpected EndOf Input Failure < *> Ġ-> Ġwhen ( exception . tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ" Unexpected Ġ' end Ġof Ġinput ' Ġwas Ġfound ." ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ" Expecting Ġ'${ exception . tokens [ 0 ]} ' Ġbut Ġ' end Ġof Ġinput ' Ġwas Ġfound ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" Expecting Ġone Ġof Ġ${ exception . tokens . join ToString (",") Ġ{ Ġ"' $ it '" Ġ}} Ġbut Ġ' end Ġof Ġinput ' Ġwas Ġfound ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠUnexpected Failure Ġ-> Ġ" Unexpected Ġ${ exception . message }" ĊĠĠĠ Ġ} Ċ }