/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠF ab ian ĠM ast en bro ek Ċ Ġ* Ċ Ġ* Ġ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 Ġnodes Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . github . tr uffle php . parser Ċ Ċ import Ġde . thm . m ni . ii . php parser . ast . Basic Ċ import Ġde . thm . m ni . ii . php parser . ast . Expressions Ċ import Ġde . thm . m ni . ii . php parser . ast . Statements Ċ import Ġio . github . tr uffle php . nodes . as Literal Ċ import Ġio . github . tr uffle php . nodes . as Statement Ċ import Ġio . github . tr uffle php . nodes . compound Ċ import Ġio . github . tr uffle php . nodes . expression . Expression Node Ċ import Ġio . github . tr uffle php . nodes . intrinsic . Echo Intr insic Node Ċ import Ġio . github . tr uffle php . nodes . intrinsic . Exit Intr insic Node Ċ import Ġio . github . tr uffle php . nodes . intrinsic . Print Intr insic Node Ċ import Ġio . github . tr uffle php . nodes . literal . Literal Node Ċ import Ġio . github . tr uffle php . nodes . statement . Statement Node Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġto Ġtranslate Ġthe Ġabstract Ġsyntax Ġtree Ġ( AST ) Ġof Ġa ĠPHP Ġprogram Ġinto Ġa ĠTr uffle Ġexecution Ġtree . Ċ Ġ*/ Ċ class ĠTrans lator Ġ{ ĊĠĠĠ Ġfun Ġtranslate ( script : ĠBasic . Script ): ĠStatement Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody : ĠMutable List < Statement Node > Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEcho Intr insic Node ( array Of ( script . leading Text (). text (). as Literal ())). as Statement () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( statement Ġin Ġscript . s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġtranslate ( statement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcompound (* body . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate ( statement : ĠState ments . Statement ): ĠStatement Node Ġ= Ġwhen Ġ( statement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠState ments . Compound St mnt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġmutable ListOf < Statement Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( inner Ġin Ġstatement . stm nt s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġtranslate ( inner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompound (* body . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠState ments . Expression St mnt Ġ-> Ġtranslate ( statement . exp ()). as Statement () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( statement . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate ( expression : ĠExpress ions . Expression ): ĠExpression Node Ġ= Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠExpress ions . Echo Intr insic Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġmutable ListOf < Expression Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( inner Ġin Ġexpression . ex ps ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġtranslate ( inner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEcho Intr insic Node ( body . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠExpress ions . Print Intr insic Ġ-> ĠPrint Intr insic Node ( translate ( expression . exp ())) ĊĠĠĠĠĠĠĠ Ġis ĠExpress ions . Exit Intr insic Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody : ĠExpress ions . Expression ? Ġ= Ġexpression . exp (). getOrElse Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExit Intr insic Node ( body ?. let Ġ{ Ġtranslate ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠExpress ions . Simple Assignment Exp Ġ-> Ġtranslate ( expression ) ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Literal Ġ-> Ġtranslate ( expression ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( expression . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate ( literal : ĠBasic . Literal ): ĠLiteral Node Ġ= Ġwhen Ġ( literal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠBasic . SQ StringLiteral Ġ-> Ġliteral . sequence (). as Literal () ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Decimal Literal Ġ-> Ġliteral . value (). to Long (). as Literal () ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Oct al Literal Ġ-> Ġliteral . value (). to Long ( 8 ). as Literal () ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Binary Literal Ġ-> Ġliteral . value (). to Long ( 2 ). as Literal () ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Hex adecimal Literal Ġ-> Ġliteral . value (). to Long ( 1 6 ). as Literal () ĊĠĠĠĠĠĠĠ Ġis ĠBasic . Floating Literal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( literal . digits ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('.') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( literal . frac Digits ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexponent Ġ= Ġliteral . exponent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exponent . isDefined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (' e ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exponent . get (). _ 1 Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ('- ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( literal . exponent (). get (). _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . toString (). toDouble (). as Literal () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( literal . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate ( assignment : ĠExpress ions . Simple Assignment Exp ): ĠExpression Node Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} Ċ } Ċ