/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠDavid ĠEd wards Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġcom . loop for . r pn Ċ Ċ import Ġjava . lang . System . currentTimeMillis Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . random . nextInt Ċ Ċ object ĠExpression Ġ{ ĊĠĠĠ Ġprivate Ġval Ġr Ġ= ĠRandom ( currentTimeMillis ()) ĊĊĠĠĠ Ġfun Ġgenerate ( ws : Ġ() Ġ-> ĠString Ġ= Ġ{ ĠSpace . space Ġ}): ĠPair < String , ĠList < Token >> Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġexpression ( operand : Ġ() Ġ-> ĠList < Token >): ĠList < Token > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġr . nextInt ( 0 Ġuntil Ġ 4 )). fold ( operand ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe , Ġ_ Ġ-> Ġe Ġ+ ĠOperator . generate () Ġ+ Ġoperand () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġoperand (): ĠList < Token > Ġ= Ġwhen Ġ( r . nextInt ( 0 Ġuntil Ġ 3 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠlistOf ( Num . generate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠlistOf ( Sym . generate ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( Left Paren Token ()) Ġ+ Ġexpression (:: operand ) Ġ+ ĠRight Paren Token () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġexpression (:: operand ) ĊĠĠĠĠĠĠĠ Ġval Ġexpr Ġ= Ġtokens . map Ġ{ Ġit . lex eme Ġ+ Ġws () Ġ}. join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( expr , Ġtokens ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠSym Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchars Ġ= Ġ(' A ' .. ' Z ') Ġ+ Ġ(' a ' .. ' z ') ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrange Ġ= Ġ 0 Ġuntil Ġchars . size ĊĊĠĠĠĠĠĠĠ Ġfun Ġgenerate () Ġ= ĠSymbol Token ("${ chars . get ( r . nextInt ( range )) }${ chars . get ( r . nextInt ( range )) }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠNum Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate () Ġ= ĠNumber Token ( String . format ("% 2 . 2 f ", Ġr . next Double ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠSpace Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchars Ġ= ĠlistOf (" Ġ", Ġ"\ n ", Ġ"\ r ", Ġ"\ t ", Ġ"\ u 0 0 0 c ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrange Ġ= Ġ 0 Ġuntil Ġchars . size ĊĊĠĠĠĠĠĠĠ Ġval Ġspace Ġ= Ġ" Ġ" ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate () Ġ= Ġchars . get ( r . nextInt ( range )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠOperator Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoperators Ġ= ĠlistOf < Token >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlus Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMin us Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStar Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSl ash Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPercent Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCare t Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMin Token (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMax Token () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrange Ġ= Ġ 0 Ġuntil Ġoperators . size ĊĊĠĠĠĠĠĠĠ Ġfun Ġgenerate () Ġ= Ġoperators . get ( r . nextInt ( range )) ĊĠĠĠ Ġ} Ċ } Ċ