/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 2 1 ĠSte ven ĠSmith Ġk ana - t utor . com Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġ Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ċ Ġ* Ġ Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ċ Ġ* Ġ Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ class ĠR pn Parser Exception ( message : ĠString ) Ġ: ĠException ( message ) Ċ Ċ @ Throws ( R pn Parser Exception :: class ) Ċ fun Ġr pn Calculate ( r pn In : ĠMutable List < String >, Ġprevious : ĠList < Double >? Ġ= Ġnull ): ĠMutable List < Double > Ġ{ ĊĠĠĠ Ġval Ġrv Ġ= Ġmutable ListOf < Double >() ĊĠĠĠ Ġvar Ġtrace Ġ= Ġfalse ĊĠĠĠ Ġvar Ġin Comment Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( previous Ġ!= Ġnull ) Ġrv . addAll ( previous ) ĊĠĠĠ Ġnext Token @ while Ġ( r pn In . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġr pn In . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġ" trace ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Trace Ġstart Ġ${ r pn In }: $ rv ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ nextToken ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcomment Ġstarts Ġwith Ġ# _ Ġtoken Ġand Ġends Ġwith Ġ_ # ĊĠĠĠĠĠĠĠ Ġif Ġ( token . startsWith ("# _ ") Ġ|| Ġin Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Comment Ġ= Ġtoken . startsWith ("# _ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Comment Ġ&& Ġtrace ) Ġprintln ("< $ token >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Comment Ġ= Ġ! token . endsWith ("_ # ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ nextToken ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( trace ) Ġprintln (" Trace Ġ> Ġ${ r pn In }, Ġtoken =\" $ token \", Ġ$ rv ") ĊĠĠĠĠĠĠĠ Ġval Ġnum In Ġ= Ġtoken . toDouble OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( num In Ġ!= Ġnull ) Ġrv . add ( num In ) ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(" ^ [+ \\ - */ ]$ ". to Regex (). matches ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rv . size Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Val Ġ= Ġrv . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Val Ġ= Ġrv . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" +" Ġ-> Ġr Val Ġ+ Ġl Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-" Ġ-> Ġr Val Ġ- Ġl Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"*" Ġ-> Ġr Val Ġ* Ġl Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/" Ġ-> Ġr Val Ġ/ Ġl Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠR pn Parser Exception (" Unrecognized Ġoperation : Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow ĠR pn Parser Exception (" Stack Ġunder flow Ġat Ġ$ token ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġthrow ĠR pn Parser Exception (" unrecognized Ġtoken :\" $ token \" ") ĊĠĠĠĠĠĠĠ Ġif Ġ( trace ) Ġprintln (" Trace Ġ< Ġ${ r pn In }, Ġ$ rv ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġrv Ċ } Ċ Ċ @ Throws ( R pn Parser Exception :: class ) Ċ fun Ġr pn Calculate ( r pn In : ĠString , Ġprevious : ĠList < Double >? Ġ= Ġnull ): ĠMutable List < Double > Ġ= ĊĠĠĠ Ġr pn Calculate ( r pn In . split ("\\ s +". to Regex ()). to Mutable List (), Ġprevious ) Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġvar Ġline In : String ? ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠ Ġprint ("> Ġ") ĊĠĠĠĠĠĠĠ Ġline In Ġ= Ġread Line () ĊĠĠĠĠĠĠĠ Ġif Ġ( line In Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line In Ġ== Ġ" q ") ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ r pn Calculate ( line In )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : R pn Parser Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġwhile Ġ( line In Ġ!= Ġnull ) Ċ } Ċ