import ĠParse Lib .* Ċ Ċ class ĠLiteral Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt ): ĠNode ( start , Ġlen ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= Ġindent ( depth ) Ġ+ Ġ" Literal (" Ġ+ Ġmatched ( str ) Ġ+ Ġ")" Ċ } Ċ Ċ class ĠAdd Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt , Ġchildren Ġ: ĠArray < Node >) Ġ: ĠSequence ( start , Ġlen , Ġchildren ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= Ġindent ( depth ) Ġ+ Ġ" Add (\ n " Ġ+ Ġprint Children ( str , Ġdepth ) Ġ+ Ġindent ( depth ) Ġ+ Ġ")" Ċ } Ċ Ċ class ĠMul Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt , Ġchildren Ġ: ĠArray < Node >) Ġ: ĠSequence ( start , Ġlen , Ġchildren ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= Ġindent ( depth ) Ġ+ Ġ" Mul (\ n " Ġ+ Ġprint Children ( str , Ġdepth ) Ġ+ Ġindent ( depth ) Ġ+ Ġ")" Ċ } Ċ Ċ class ĠParent heses Ġ( start Ġ: ĠInt , Ġlen Ġ: ĠInt , Ġchild Ġ: ĠNode ) Ġ: ĠSequence ( start , Ġlen , ĠarrayOf ( child )) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint ( str Ġ: ĠString , Ġdepth Ġ: ĠInt ) Ġ= Ġindent ( depth ) Ġ+ Ġ" Parent heses (\ n " Ġ+ Ġprint Children ( str , Ġdepth ) Ġ+ Ġindent ( depth ) Ġ+ Ġ")" Ċ } Ċ Ċ val Ġdigit Ġ= ĊĠĠĠ Ġor Ġ( term (" 0 "), Ġterm (" 1 "), Ġterm (" 2 "), Ġterm Ġ(" 3 "), Ġterm Ġ(" 4 "), Ġterm Ġ(" 5 "), Ġterm Ġ(" 6 "), Ġterm Ġ(" 7 "), Ġterm Ġ(" 8 "), Ġterm Ġ(" 9 ")) Ċ Ċ fun Ġdigits Ġ() Ġ: ĠParser < Node > Ġ= ĊĠĠĠ Ġor ( and ( digit , Ġ:: digits ), Ġdigit )() Ċ Ċ val Ġliteral Ġ= ĊĠĠĠ Ġor ( ĊĠĠĠĠĠĠĠ Ġand (:: digits , term (". "), :: digits ), ĊĠĠĠĠĠĠĠ Ġand ( term (". "), :: digits ), ĊĠĠĠĠĠĠĠ Ġand (:: digits , term (". ")), ĊĠĠĠĠĠĠĠ Ġ:: digits , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġ{ Ġs , l ,_ Ġ-> ĠLiteral Ġ( s , l ) Ġ} ĊĠĠĠ Ġ) Ċ Ċ val Ġadd Ġ= ĊĠĠĠ Ġand (:: primary Expr , Ġterm ("+ "), Ġ:: primary Expr , Ġtype Ġ= Ġ{ s , l , c Ġ-> ĠAdd ( s , l , array Of ( c [ 0 ], Ġc [ 2 ])) }) Ċ Ċ val Ġmul Ġ= ĊĠĠĠ Ġand (:: primary Expr , Ġterm ("* "), Ġ:: primary Expr , Ġtype Ġ= Ġ{ s , l , c Ġ-> ĠMul ( s , l , array Of ( c [ 0 ], Ġc [ 2 ])) }) Ċ Ċ fun Ġexpr Ġ() Ġ: ĠParser < Node > Ġ= ĊĠĠĠ Ġor ( mul , Ġadd , Ġ:: primary Expr )() Ċ Ċ fun Ġprimary Expr Ġ() Ġ= ĊĠĠĠ Ġor ( ĊĠĠĠĠĠĠĠ Ġand ( term (" (" ), :: expr , term (" )"), Ġtype Ġ= Ġ{ s , l , c Ġ-> ĠParent heses ( s , l , c [ 1 ]) Ġ}), ĊĠĠĠĠĠĠĠ Ġliteral ĊĠĠĠ Ġ) () Ċ Ċ fun Ġmain Ġ( args Ġ: ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġstr Ġ= Ġif ( args . isEmpty ()) Ġ"( 2 . 1 2 3 *( 4 + 5 )) +( 2 *( 7 +( 4 * 3 ))) " Ġelse Ġargs [ 0 ] ĊĊĠĠĠ Ġval Ġparser Ġ= Ġexpr () ĊĊĠĠĠ Ġval Ġast Ġ= Ġparser . parse ( str ) ĊĠĠĠ Ġif ( ast Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġprintln (" Parse Ġerror ") ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġprint ( ast . print ( str )) Ċ }