/** Ċ Ġ* ĠThe Ġmain Ġcommand - line ĠCLI Ġfor ĠSh ake Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Sh ake Cli ") Ċ Ċ package Ġcom . github . sh ak el ang . shake . cli Ċ Ċ import Ġcom . github . sh ak el ang . shake . interpreter . Interpreter Ċ import Ġcom . github . sh ak el ang . shake . lexer . Lexer Ċ import Ġcom . github . sh ak el ang . shake . parser . Parser Ċ import Ġcom . github . sh ak el ang . shake . parser . node . Tree Ċ import Ġcom . github . sh ak el ang . shake . util . File Ċ import Ġcom . github . sh ak el ang . shake . util . character input . character input stream . Character InputStream Ċ import Ġcom . github . sh ak el ang . shake . util . character input . character input stream . Source Character InputStream Ċ import Ġcom . github . sh ak el ang . shake . util . character input . position . Position Map Ċ import Ġcom . github . sh ak el ang . shake . util . json . json Ċ import Ġcom . github . sh ak el ang . shake . util . recursive While Ċ import Ġkotlin . jvm . Jvm Name Ċ Ċ /** Ċ Ġ* ĠThe Ġinterpreter Ġfor Ġinterpre ting Ġthe Ġcode Ċ Ġ*/ Ċ val Ġinterpreter Ġ= ĠInterpreter () Ċ Ċ // Ġ---------------------------------------------------------------- Ċ // Ġ ĠJava ĠGenerator Ġis Ġnot Ġimplemented Ġyet Ċ // Ċ // Ġ/** Ċ // Ġ Ġ* ĠThe Ġjava - generator Ġfor Ġgenerating Ġjava Ġform Ġthe Ġinput Ġcode Ċ // Ġ Ġ*/ Ċ // Ġval Ġjava Ġ= ĠJava Generator () Ċ Ċ /** Ċ Ġ* ĠIs Ġthe Ġprogram Ġin Ġdebug Ġmode ? Ċ Ġ*/ Ċ var ĠDEBUG Ġ= Ġfalse Ċ Ċ /** Ċ Ġ* ĠThe Ġversion Ġof Ġthe Ġprogram Ċ Ġ*/ Ċ const Ġval ĠVERSION Ġ= Ġ" 0 . 1 . 0 " Ċ Ċ /** Ċ Ġ* ĠThe ĠMain - Method Ġfor Ġthe ĠSh ake Cli Ċ Ġ* Ċ Ġ* Ġ@ param Ġargs ĠThe Ġarguments Ġfor Ġthe Ġmain Ġcli Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ N icol as ĠSch mid t Ġ& lt ; @ n sc - de & gt ;]( https :// github . com / n sc - de ) Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠ Ġ// ĠCreate Ġa Ġparser Ġfor Ġthe Ġarguments ĊĠĠĠ Ġval Ġargument Parser Ġ= Ġcom . github . sh ak el ang . shake . cli . Cli ArgumentParser () ĊĊĠĠĠ Ġ// ĠDefine Ġthe Ġoptions Ġfor Ġthe Ġargument Parser ĊĠĠĠ Ġargument Parser ĊĠĠĠĠĠĠĠ Ġ. option (" generator ", Ġ" g ", Ġ 1 , ĠarrayOf < String ?> (" interpreter ")) ĊĠĠĠĠĠĠĠ Ġ. option (" debug ", Ġ" d ") ĊĠĠĠĠĠĠĠ Ġ. option (" target ", Ġ" t ", Ġ 1 , ĠarrayOf ( null )) ĊĊĊĠĠĠ Ġ// ĠParse Ġthe Ġarguments Ġgiven Ġto Ġthe Ġmain - method ĊĠĠĠ Ġval Ġarguments Ġ= Ġargument Parser . parse ( args ) ĊĊĠĠĠ Ġ// ĠDetect Ġdebug Ġmode Ġ( check Ġif Ġdebug Ġoption Ġis Ġset Ġ(" -- debug ")) ĊĠĠĠ ĠDEBUG Ġ= Ġarguments . getOption (" debug ") !!. is Given ĊĊĠĠĠ Ġ// ĠGet Ġthe Ġgenerator Ġ(" -- generator ") ĊĠĠĠ Ġval Ġgenerator Ġ= Ġarguments . getOption (" generator ") !!. values ! ![ 0 ] ĊĊĠĠĠ Ġ// ĠIf Ġno Ġnormal Ġargument Ġis Ġgiven , Ġthen Ġwe Ġwill Ġopen Ġa Ġprompt Ġfor Ġentering Ġcode ĊĠĠĠ Ġwhen ( arguments . arguments . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInfo Ġmessage Ġfor ĠSh ake Ġconsole ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# ĠSh ake Ġversion Ġ$ VERSION Ġ${ if Ġ( DEBUG ) Ġ" in Ġdebug Ġmode Ġ" Ġelse Ġ"" }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# ĠEnter ĠSh ake Ġcode Ġbelow Ġto Ġexecute !\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# ĠUsing Ġ$ generator Ġto Ġexecute Ġcode " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġcreate Ġa Ġinfinite Ġloop Ġfor Ġreading Ġfrom Ġthe Ġconsole ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Loop Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġthe Ġinput Ġfrom Ġthe Ġconsole Ġand Ġcreate Ġa ĠString Character InputStream Ġfrom Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchars : ĠCharacter InputStream Ġ= ĠSource Character InputStream ("< Console >", Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparse Ġthe ĠCharacter InputStream Ġinto Ġa ĠTree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpr Ġ= Ġparse ( chars ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexecute Ġthe Ġtree Ġusing Ġthe Ġspecified Ġgenerator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( pr , Ġgenerator , Ġnull , Ġarguments . getOption (" target ") !!. values ! ![ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġarguments . arguments [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġthe Ġcontents Ġof Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( src ). contents ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew ĠString Character InputStream Ġfrom Ġthe Ġfile 's Ġcontents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchars : ĠCharacter InputStream Ġ= ĠSource Character InputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< File : Ġ" Ġ+ Ġarguments . arguments [ 0 ] Ġ+ Ġ"> ", Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠParse Ġthe ĠCharacter InputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpr Ġ= Ġparse ( chars ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe ĠTree Ġusing Ġthe Ġspecified Ġgenerator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( pr , Ġgenerator , Ġsrc , Ġarguments . getOption (" target ") !!. values ! ![ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠError (" There Ġare Ġonly Ġ 0 - 1 Ġarguments Ġallowed ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġfunction Ġparses Ġa Ġ[ Character InputStream ] Ġinto Ġa ĠTree Ċ Ġ* Ċ Ġ* Ġ@ param Ġinput Ġthe Ġ[ Character InputStream ] Ġto Ġparse Ċ Ġ* Ġ@ return Ġthe Ġparsed Ġ[ Tree ] Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ N icol as ĠSch mid t Ġ& lt ; @ n sc - de & gt ;]( https :// github . com / n sc - de ) Ċ Ġ*/ Ċ private Ġfun Ġparse ( input : ĠCharacter InputStream ): ĠParse Result Ġ{ ĊĊĠĠĠ Ġ// ĠCreate Ġa Ġnew ĠLex er Ġfrom Ġthe ĠCharacter InputStream ĊĠĠĠ Ġval Ġlexer Ġ= ĠLex er ( input ) ĊĊĠĠĠ Ġ// ĠGenerate Ġthe Ġtokens Ġusing Ġthe Ġlexer ĊĠĠĠ Ġval Ġtokens Ġ= Ġlexer . make Tokens () ĊĊĠĠĠ Ġ// Ġif Ġdebug Ġis Ġenabled Ġwe Ġprint Ġout Ġthe Ġlexer - tokens ĊĠĠĠ Ġif Ġ( DEBUG ) Ġprintln ("[ DEBUG ] ĠLex er - Tokens : Ġ$ tokens ") ĊĊĠĠĠ Ġ// ĠCreate Ġa Ġnew ĠParser Ġfrom Ġthe Ġtokens ĊĠĠĠ Ġval Ġparser Ġ= ĠParser ( tokens ) ĊĊĠĠĠ Ġ// ĠLet Ġthe Ġparser Ġparse Ġthe Ġtokens Ġinto Ġa ĠTree ĊĠĠĠ Ġval Ġtree Ġ= Ġparser . parse () ĊĊĠĠĠ Ġ// ĠIf Ġdebug Ġis Ġenabled Ġwe Ġprint Ġout Ġthe Ġtree ĊĠĠĠ Ġif Ġ( DEBUG ) Ġprintln ("[ DEBUG ] ĠParsed ĠTree : Ġ$ tree ", Ġ) ĊĊĠĠĠ Ġ// Ġreturn Ġthe ĠTree ĊĠĠĠ Ġreturn ĠParse Result ( tree , Ġtokens . map ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġfunction Ġexecutes Ġa Ġ[ Tree ] Ġusing Ġa Ġspecified Ġgenerator Ċ Ġ* Ċ Ġ* Ġ@ param Ġpr Ġthe Ġ[ Parse Result ] Ġto Ġexecute Ċ Ġ* Ġ@ param Ġgenerator Ġthe Ġgenerator Ġto Ġuse Ġ( just Ġgive Ġthe Ġname Ġof Ġit ) Ċ Ġ* Ġ@ param Ġsrc Ġthe Ġsource Ġfile Ġof Ġthe Ġprogram Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ N icol as ĠSch mid t Ġ& lt ; @ n sc - de & gt ;]( https :// github . com / n sc - de ) Ċ Ġ*/ Ċ private Ġfun Ġexecute ( pr : ĠParse Result , Ġgenerator : ĠString ?, Ġsrc : ĠString ?, Ġtarget : ĠString ?) Ġ{ ĊĠĠĠ Ġif Ġ( src Ġ!= Ġnull Ġ&& Ġ! src . endsWith (". shake ")) Ġthrow ĠError (" Sh ake Ġfile Ġnames Ġhave Ġto Ġend Ġwith Ġextension Ġ\ ". shake \" ") ĊĠĠĠ Ġval Ġtarget File Ġ= Ġsrc ?. substring ( 0 , Ġsrc . length Ġ- Ġ 6 ) ĊĠĠĠ Ġ// Ġval Ġbase Name Ġ= Ġif Ġ( src Ġ!= Ġnull ) Ġtarget File !!. split ("[ \\\\ /]( ? =[ ^ \\\\ / ]+ $) "). to Typed Array ()[ 1 ] Ġelse Ġnull ĊĠĠĠ Ġwhen Ġ( generator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" interpreter " Ġ-> Ġprintln ("> > Ġ${ interpreter . visit ( pr . tree )} ") ĊĠĠĠĠĠĠĠ Ġ" json " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Ġ== Ġnull ) Ġprintln ("> > Ġ${ pr . tree }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġwrite File ( File ( target Ġ?: Ġ"$ target File . json "), Ġpr . tree . toString ()) ĊĠĠĠĠĠĠĠ Ġ" be auty - json ", Ġ" b json " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Ġ== Ġnull ) Ġprintln ("> > Ġ${ json . stringify ( pr . tree , Ġindent Ġ= Ġ 2 )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġwrite File ( File ( target Ġ?: Ġ"$ target File . json "), Ġjson . stringify ( pr . tree , Ġindent Ġ= Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ" java " Ġ-> Ġthrow ĠError (" Java Ġis Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġif Ġ( src Ġ== Ġnull ) Ġprintln ("> > Ġ${ java . visit Program ( pr . tree , Ġ" Cli Input "). toString ("", Ġ" Ġ Ġ" )} % n ") ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġelse Ġwrite File ( File ( target Ġ?: Ġtarget File Ġ+ Ġjava . extension ), Ġjava . visit Program ( pr . tree , Ġbase Name ). toString ("", Ġ" Ġ Ġ")) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠError (" Unknown Ġgenerator !") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġwrite File ( f : ĠFile , Ġcontent : ĠString ) Ġ{ ĊĠĠĠ Ġprintln (" Generating Ġfile Ġ\" ${ f . absolute Path }\" ...") ĊĠĠĠ Ġf . parent . mkdir s () ĊĠĠĠ Ġf . write ( content ) Ċ } Ċ Ċ private Ġclass ĠParse Result ( val Ġtree : ĠTree , Ġval Ġmap : ĠPosition Map )