package Ġeu . jan v db . a oc 2 0 2 0 . day 1 8 Ċ Ċ import Ġjava . math . BigInteger Ċ Ċ object ĠToken izer Ġ{ Ċ ĉ fun Ġtokenize ( input : ĠString ): ĠList < Token > Ġ{ Ċĉ ĉ val Ġexpression Without Spaces Ġ= Ġinput . replace (" Ġ", Ġ"") Ċĉ ĉ return Ġtokenize Internal ( expression Without Spaces ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġtokenize Internal ( input : ĠString ): ĠList < Token > Ġ{ Ċĉ ĉ var Ġindex Ġ= Ġ 0 Ċĉ ĉ val Ġtokens Ġ= Ġmutable ListOf < Token >() ĊĊĉ ĉ fun Ġfind Closing Parent hesis (): ĠInt Ġ{ Ċĉĉ ĉ var Ġdepth Ġ= Ġ 0 Ċĉĉ ĉ for Ġ( i Ġin Ġindex Ġuntil Ġinput . length ) Ġ{ Ċĉĉĉ ĉ when Ġ( input [ i ]) Ġ{ Ċĉĉĉĉ ĉ ' (' Ġ-> Ġdepth ++ Ċĉĉĉĉ ĉ ') ' Ġ-> Ġdepth -- Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( depth Ġ== Ġ 0 ) Ġreturn Ġi Ċĉĉ ĉ } Ċĉĉ ĉ throw ĠIllegalArgumentException ( input ) Ċĉ ĉ } ĊĊĉ ĉ while Ġ( index Ġ< Ġinput . length ) Ġ{ Ċĉĉ ĉ when Ġ( input [ index ]) Ġ{ Ċĉĉĉ ĉ ' +' Ġ-> Ġ{ Ċĉĉĉĉ ĉ tokens Ġ+= ĠPlus Token () Ċĉĉĉĉ ĉ index ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ ' *' Ġ-> Ġ{ Ċĉĉĉĉ ĉ tokens Ġ+= ĠMultiply Token () Ċĉĉĉĉ ĉ index ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ in Ġ' 0 ' .. ' 9 ' Ġ-> Ġ{ Ċĉĉĉĉ ĉ tokens Ġ+= ĠNumber Token ( BigInteger . valueOf ( input . substring ( index , Ġindex Ġ+ Ġ 1 ). to Long ())) Ċĉĉĉĉ ĉ index ++ Ċĉĉĉ ĉ } Ċĉĉĉ ĉ ' (' Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġend Ġ= Ġfind Closing Parent hesis () Ċĉĉĉĉ ĉ val Ġsubstring Ġ= Ġinput . substring ( index Ġ+ Ġ 1 , Ġend ) Ċĉĉĉĉ ĉ tokens Ġ+= ĠComplex Token ( tokenize ( substring )) Ċĉĉĉĉ ĉ index Ġ= Ġend Ġ+ Ġ 1 Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ-> Ġthrow ĠIllegalArgumentException ( input ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ return Ġtokens Ċ ĉ } Ċ } Ċ Ċ interface ĠToken Ċ class ĠPlus Token Ġ: ĠToken Ċ class ĠMultiply Token Ġ: ĠToken Ċ data Ġclass ĠNumber Token ( val Ġvalue : ĠBigInteger ) Ġ: ĠToken Ċ data Ġclass ĠComplex Token ( val Ġnested Tokens : ĠList < Token >) Ġ: ĠToken Ċ