/* Ċ The ĠMIT ĠLicense Ġ( MIT ) Ċ Ċ Copyright Ġ( c ) Ġ 2 0 1 6 ĠTom ĠNeed ham Ċ Ċ Permission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ of Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ in Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ to Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ copies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ furnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ċ The Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ copies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ċ THE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ IMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ FITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ AUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ LIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ OUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ SOFTWARE . Ċ Ġ*/ Ċ package Ġcom . th omas . need ham . ne uro ph idea . designer . psi . sn net . compiler . lexer Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . th omas . need ham . ne uro ph idea . actions . Compile Sn net File Action Ċ import Ġcom . th omas . need ham . ne uro ph idea . actions . Initial isation Action Ċ import Ġjava . io .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġth oma Ġon Ġ 2 7 / 0 6 / 2 0 1 6 . Ċ Ġ*/ Ċ class ĠSn net Lexer Ġ{ Ċ ĉ val Ġtoken List : ĠMutable List < Sn net Token > Ċ ĉ val Ġtoken String List : ĠLinkedList < String > Ċ ĉ var Ġinput String : ĠString Ġ= Ġ"" ĊĉĊ ĉ comp anion Ġobject ĠData Ġ{ Ċĉ ĉ var Ġproject : ĠProject ? Ġ= ĠInitial isation Action . project Ċĉ ĉ var Ġproject Directory : ĠString ? Ġ= Ġproject ?. basePath Ċĉ ĉ var ĠisOpen : ĠBoolean ? Ġ= Ġproject ?. isOpen Ċĉ ĉ var Ġinput File : ĠVirtual File ? Ġ= Ġnull Ċ ĉ } ĊĉĊ ĉ private Ġconstructor ( token List : ĠLinkedList < Sn net Token >, Ġtoken String List : ĠLinkedList < String >) Ġ{ Ċĉ ĉ this . token List Ġ= Ġtoken List Ċĉ ĉ this . token String List Ġ= Ġtoken String List Ċĉ ĉ inputFile Ġ= Ġnull Ċ ĉ } ĊĉĊ ĉ constructor ( file : ĠVirtual File ?) Ġ{ Ċĉ ĉ token List Ġ= ĠLinkedList < Sn net Token >() Ċĉ ĉ token String List Ġ= ĠLinkedList < String >() Ċĉ ĉ inputFile Ġ= Ġfile Ċ ĉ } ĊĉĊ ĉ fun ĠStart (): ĠBoolean Ġ{ Ċĉ ĉ if Ġ(! Read Input ()) Ċĉĉ ĉ return Ġfalse Ċĉ ĉ if Ġ(! Token size Input ()) Ċĉĉ ĉ return Ġfalse Ċĉ ĉ if Ġ(! Generate Tokens ()) Ċĉĉ ĉ return Ġfalse Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĉĊ ĉ private Ġfun ĠRead Input (): ĠBoolean Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ val Ġfile Ġ= ĠFile ( inputFile ?. path ) Ċĉĉ ĉ val Ġfis Ġ= ĠFileReader ( file ) Ċĉĉ ĉ val Ġbr Ġ= ĠBufferedReader ( fis ) Ċĉĉ ĉ input String Ġ= Ġbr . read Text () Ċĉĉ ĉ br . close () Ċĉĉ ĉ return Ġinput String Ġ!= Ġ"" Ċĉ ĉ } Ġcatch Ġ( io e : ĠIOException ) Ġ{ Ċĉĉ ĉ io e . printStackTrace ( System . err ) Ċĉĉ ĉ Messages . show Error Dialog ( Compile Sn net File Action . project , Ġ" Error ĠLoading ĠSource ĠFrom ĠFile : Ġ${ inputFile ?. path }", Ġ" Error ") Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ġcatch Ġ( fn fe : ĠFileNotFoundException ) Ġ{ Ċĉĉ ĉ fn fe . printStackTrace ( System . err ) Ċĉĉ ĉ Messages . show Error Dialog ( Compile Sn net File Action . project , Ġ" No ĠSource ĠCode ĠFound Ġin ĠFile : Ġ${ inputFile ?. path }", Ġ" Error ") Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun ĠToken size Input (): ĠBoolean Ġ{ Ċĉ ĉ val Ġsplit Ġ= Ġinput String . split (' Ġ', Ġ'\ r ', Ġ'\ n ') Ċĉ ĉ for Ġ( str : ĠString Ġin Ġsplit ) Ġ{ Ċĉĉ ĉ token String List . add ( str ) Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĉĊ ĉ private Ġfun ĠGenerate Tokens (): ĠBoolean Ġ{ Ċĉ ĉ var Ġtemp : ĠString Ġ= Ġ"" Ċĉ ĉ var Ġi Ġ= Ġ 0 Ċĉ ĉ while Ġ( i Ġ< Ġtoken String List . size ) Ġ{ Ċĉĉ ĉ if Ġ( token String List [ i ]. startsWith ("\" ") Ġ&& Ġ! token String List [ i ]. endsWith ("\ "" )) Ġ{ Ċĉĉĉ ĉ try Ġ{ Ċĉĉĉĉ ĉ while Ġ(! temp . endsWith ("\ "" )) Ġ{ Ċĉĉĉĉĉ ĉ temp Ġ+= Ġtoken String List [ i ] Ċĉĉĉĉĉ ĉ if Ġ(! temp . endsWith ("\ "" )) Ċĉĉĉĉĉĉ ĉ temp Ġ+= Ġ" Ġ" Ċĉĉĉĉĉ ĉ i ++ Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ token List . add ( Sn net Token ( temp )) Ċĉĉĉĉ ĉ temp Ġ= Ġ"" Ċĉĉĉ ĉ } Ġcatch Ġ( io be : ĠIndex OutOfBoundsException ) Ġ{ Ċĉĉĉĉ ĉ io be . printStackTrace () Ċĉĉĉĉ ĉ Messages . show Error Dialog ( Compile Sn net File Action . project , Ġ" COMPILE ĠERROR ĠUn terminated ĠString ĠLiteral ", Ġ" ERROR ") Ċĉĉĉĉ ĉ return Ġfalse Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ token List . add ( Sn net Token ( token String List [ i ])) Ċĉĉĉ ĉ i ++ Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ token List . removeAll Ġ{ Ġe Ġ-> Ċĉĉ ĉ e . value . equals ("") Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } Ċ Ċ }