/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 2 - 2 0 1 7 ĠThe ĠAN TLR ĠProject . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠUse Ġof Ġthis Ġfile Ġis Ġgoverned Ġby Ġthe ĠBSD Ġ 3 - clause Ġlicense Ġthat Ċ Ġ* Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile Ġin Ġthe Ġproject Ġroot . Ċ Ġ*/ Ċ package Ġorg . antlr . v 4 . kotlin runtime Ċ Ċ import Ġcom . strument a . kotlin multi platform . as CharArray Ċ import Ġcom . strument a . kotlin multi platform . out Message Ċ import Ġorg . antlr . v 4 . kotlin runtime . at n . Lexer AT NS im ulator Ċ import Ġorg . antlr . v 4 . kotlin runtime . misc . Integer Stack Ċ import Ġorg . antlr . v 4 . kotlin runtime . misc . Interval Ċ Ċ /** ĠA Ġlexer Ġis Ġre cognizer Ġthat Ġdraw s Ġinput Ġsymbols Ġfrom Ġa Ġcharacter Ġstream . Ċ Ġ* Ġlexer Ġgrammar s Ġresult Ġin Ġa Ġsubclass Ġof Ġthis Ġobject . ĠA ĠLex er Ġobject Ċ Ġ* Ġuses Ġsimplified Ġmatch () Ġand Ġerror Ġrecovery Ġmechanisms Ġin Ġthe Ġinterest Ċ Ġ* Ġof Ġspeed . Ċ Ġ*/ Ċ abstract Ġclass ĠLex er Ġ: ĠRe cognizer < Int , ĠLex er AT NS im ulator >, ĠToken Source Ġ{ ĊĊ Ċ // ĠĠĠ Ġ/** ĠSet Ġthe Ġchar Ġstream Ġand Ġreset Ġthe Ġlexer Ġ Ġ*/ Ċ // ĠĠĠ Ġfun Ġset InputStream ( input : ĠInt Stream ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġthis . inputStream Ġ= Ġnull Ċ // ĠĠĠĠĠĠĠ Ġthis ._ token Factory Source Pair Ġ= ĠPair < Token Source , ĠChar Stream >( this , ĠinputStream ) Ċ // ĠĠĠĠĠĠĠ Ġreset () Ċ // ĠĠĠĠĠĠĠ Ġthis . inputStream Ġ= Ġinput Ġas ĠChar Stream Ċ // ĠĠĠĠĠĠĠ Ġthis ._ token Factory Source Pair Ġ= ĠPair < Token Source , ĠChar Stream >( this , Ġread InputStream ()) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġassign InputStream ( newValue : ĠInt Stream ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġassign InputStream ( newValue Ġas ĠChar Stream ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassign InputStream ( input : ĠChar Stream ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . inputStream Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis ._ token Factory Source Pair Ġ= ĠPair < Token Source , ĠChar Stream ? >( this , Ġnull ) ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠ Ġthis . inputStream Ġ= Ġinput Ġas ĠChar Stream ĊĠĠĠĠĠĠĠ Ġthis ._ token Factory Source Pair Ġ= ĠPair < Token Source , ĠChar Stream ? >( this , Ġread InputStream ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread InputStream (): ĠChar Stream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . inputStream Ġas ĠChar Stream ? ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġvar Ġ_ token Factory Source Pair : ĠPair < Token Source , ĠChar Stream ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠHow Ġto Ġcreate Ġtoken Ġobjects Ġ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġtoken Factory : ĠToken Factory < out ĠToken > Ġ= ĠCommon Token Factory . DEFAULT ĊĊĠĠĠ Ġ/** ĠThe Ġgoal Ġof Ġall Ġlexer Ġrules / methods Ġis Ġto Ġcreate Ġa Ġtoken Ġobject . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġan Ġinstance Ġvariable Ġas Ġmultiple Ġrules Ġmay Ġcollabor ate Ġto ĊĠĠĠĠ Ġ* Ġcreate Ġa Ġsingle Ġtoken . Ġ Ġnext Token Ġwill Ġreturn Ġthis Ġobject Ġafter ĊĠĠĠĠ Ġ* Ġmatching Ġlexer Ġrule ( s ). Ġ ĠIf Ġyou Ġsubclass Ġto Ġallow Ġmultiple Ġtoken ĊĠĠĠĠ Ġ* Ġemission s , Ġthen Ġset Ġthis Ġto Ġthe Ġlast Ġtoken Ġto Ġbe Ġmatched Ġor ĊĠĠĠĠ Ġ* Ġsomething Ġnon null Ġso Ġthat Ġthe Ġauto Ġtoken Ġemit Ġmechanism Ġwill Ġnot ĊĠĠĠĠ Ġ* Ġemit Ġanother Ġtoken . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĠOverride Ġif Ġemit ting Ġmultiple Ġtokens . Ġ Ġ*/ ĊĠĠĠ Ġvar Ġtoken : ĠToken ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠWhat Ġcharacter Ġindex Ġin Ġthe Ġstream Ġdid Ġthe Ġcurrent Ġtoken Ġstart Ġat ? ĊĠĠĠĠ Ġ* ĠN eeded , Ġfor Ġexample , Ġto Ġget Ġthe Ġtext Ġfor Ġcurrent Ġtoken . Ġ ĠSet Ġat ĊĠĠĠĠ Ġ* Ġthe Ġstart Ġof Ġnext Token . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġ_ token Start Char Index Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĠThe Ġline Ġon Ġwhich Ġthe Ġfirst Ġcharacter Ġof Ġthe Ġtoken Ġres ides Ġ Ġ*/ ĊĠĠĠ Ġvar Ġ_ token Start Line : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠThe Ġcharacter Ġposition Ġof Ġfirst Ġcharacter Ġwithin Ġthe Ġline Ġ Ġ*/ ĊĠĠĠ Ġvar Ġ_ token Start Char Position In Line : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠOnce Ġwe Ġsee ĠEOF Ġon Ġchar Ġstream , Ġnext Ġtoken Ġwill Ġbe ĠEOF . ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġhave ĠDONE Ġ: ĠEOF Ġ; Ġthen Ġyou Ġsee ĠDONE ĠEOF . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġ_ hit EOF : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠThe Ġchannel Ġnumber Ġfor Ġthe Ġcurrent Ġtoken Ġ Ġ*/ ĊĠĠĠ Ġvar Ġchannel : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠThe Ġtoken Ġtype Ġfor Ġthe Ġcurrent Ġtoken Ġ Ġ*/ ĊĠĠĠ Ġvar Ġtype : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġ_ mode Stack Ġ= ĠInteger Stack () ĊĠĠĠ Ġvar Ġ_ mode Ġ= ĠLex er . DEFAULT _ MODE ĊĊĠĠĠ Ġ/** ĠYou Ġcan Ġset Ġthe Ġtext Ġfor Ġthe Ġcurrent Ġtoken Ġto Ġoverride Ġwhat Ġis Ġin ĊĠĠĠĠ Ġ* Ġthe Ġinput Ġchar Ġbuffer . Ġ ĠUse Ġset Text () Ġor Ġcan Ġset Ġthis Ġinstance Ġvar . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġ_ text : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġsource Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠinputStream !!. source Name !! ĊĊĠĠĠ Ġoverride Ġvar Ġline : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġinterpreter !!. line ĊĠĠĠĠĠĠĠ Ġset ( line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpreter !!. line Ġ= Ġline ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġchar Position In Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġinterpreter !!. char Position In Line ĊĠĠĠĠĠĠĠ Ġset ( char Position In Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpreter !!. char Position In Line Ġ= Ġchar Position In Line ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠWhat Ġis Ġthe Ġindex Ġof Ġthe Ġcurrent Ġcharacter Ġof Ġlook ahead ? Ġ Ġ*/ ĊĠĠĠ Ġval Ġchar Index : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠinputStream !!. index () ĊĊĠĠĠ Ġ/** ĠReturn Ġthe Ġtext Ġmatched Ġso Ġfar Ġfor Ġthe Ġcurrent Ġtoken Ġor Ġany ĊĠĠĠĠ Ġ* Ġtext Ġoverride . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĠSet Ġthe Ġcomplete Ġtext Ġof Ġthis Ġtoken ; Ġit Ġw ip es Ġany Ġprevious ĊĠĠĠĠ Ġ* Ġchanges Ġto Ġthe Ġtext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtext : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ(_ text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ text !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġinterpreter !!. getText ( read InputStream () !! ) ĊĠĠĠĠĠĠĠ Ġset ( text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval Ġchannel Names : ĠArray < String >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġval Ġmode Names : ĠArray < String >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠUsed Ġto Ġprint Ġout Ġtoken Ġnames Ġlike ĠID Ġduring Ġdebugging Ġand ĊĠĠĠĠ Ġ* Ġerror Ġreporting . Ġ ĠThe Ġgenerated Ġparsers Ġimplement Ġa Ġmethod ĊĠĠĠĠ Ġ* Ġthat Ġoverrides Ġthis Ġto Ġpoint Ġto Ġtheir ĠString [] Ġtoken Names . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġtoken Names : ĠArray < String ?> ? ĊĠĠĠĠĠĠĠ Ġ@ Deprecated ("") ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠReturn Ġa Ġlist Ġof Ġall ĠToken Ġobjects Ġin Ġinput Ġchar Ġstream . ĊĠĠĠĠ Ġ* ĠFor ces Ġload Ġof Ġall Ġtokens . ĠDoes Ġnot Ġinclude ĠEOF Ġtoken . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġall Tokens : ĠList < Token > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠArrayList < Token >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġnext Token () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( t !!. type Ġ!= ĠToken . EOF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . add ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġnext Token () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtokens ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor () Ġ{} ĊĊĠĠĠ Ġconstructor ( input : ĠChar Stream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . inputStream Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġthis ._ token Factory Source Pair Ġ= ĠPair < Token Source , ĠChar Stream >( this , Ġinput ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġw ack ĠLex er Ġstate Ġvariables ĊĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream !!. seek ( 0 ) Ġ// Ġre wind Ġthe Ġinput ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtoken Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠToken . INVALID _ TYPE ĊĠĠĠĠĠĠĠ Ġchannel Ġ= ĠToken . DEFAULT _ CHANNEL ĊĠĠĠĠĠĠĠ Ġ_ token Start Char Index Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ_ token Start Char Position In Line Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ_ token Start Line Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ_ text Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ_ hit EOF Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ_ mode Ġ= ĠLex er . DEFAULT _ MODE ĊĠĠĠĠĠĠĠ Ġ_ mode Stack . clear () ĊĊĠĠĠĠĠĠĠ Ġinterpreter !!. reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturn Ġa Ġtoken Ġfrom Ġthis Ġsource ; Ġi . e ., Ġmatch Ġa Ġtoken Ġon Ġthe Ġchar ĊĠĠĠĠ Ġ* Ġstream . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġnext Token (): ĠToken Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" nextToken Ġrequires Ġa Ġnon - null Ġinput Ġstream .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġstart Ġlocation Ġin Ġchar Ġstream Ġso Ġun buffered Ġstreams Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġguaranteed Ġat Ġleast Ġhave Ġtext Ġof Ġcurrent Ġtoken ĊĠĠĠĠĠĠĠ Ġval Ġtoken Start Marker Ġ= ĠinputStream !!. mark () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ hit EOF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit EOF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtoken !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Ġ= ĠToken . DEFAULT _ CHANNEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ token Start Char Index Ġ= ĠinputStream !!. index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ token Start Char Position In Line Ġ= Ġinterpreter !!. char Position In Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ token Start Line Ġ= Ġinterpreter !!. line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ text Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠToken . INVALID _ TYPE Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉĉ ĉ println (" nextToken Ġline Ġ"+ _ token Start Line +" Ġat Ġ"+ inputStream !!. LA ( 1 )+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉĉĉĉĉĉĉ ĠĠ Ġ" Ġin Ġmode Ġ"+ _ mode + Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉĉĉĉĉĉĉ ĠĠ Ġ" Ġat Ġindex Ġ"+ ĠinputStream !!. index ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġt type : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt type Ġ= Ġinterpreter !!. match ( read InputStream () !! , Ġ_ mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠLex er No V iable Alt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listeners ( e ) ĠĠĠĠĠĠĠ Ġ// Ġreport Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt type Ġ= ĠSKIP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputStream !!. LA ( 1 ) Ġ== ĠInt Stream . EOF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hit EOF Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠToken . INVALID _ TYPE ) Ġtype Ġ= Ġt type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠSKIP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ outer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( type Ġ== ĠMO RE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġemit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtoken !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġwe Ġrelease Ġmarker Ġafter Ġmatch Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġun buffered Ġchar Ġstream Ġwill Ġkeep Ġbuffer ing ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream !!. release ( token Start Marker ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIn struct Ġthe Ġlexer Ġto Ġskip Ġcreating Ġa Ġtoken Ġfor Ġcurrent Ġlexer Ġrule ĊĠĠĠĠ Ġ* Ġand Ġlook Ġfor Ġanother Ġtoken . Ġ Ġnext Token () Ġknows Ġto Ġkeep Ġlooking Ġwhen ĊĠĠĠĠ Ġ* Ġa Ġlexer Ġrule Ġfinishes Ġwith Ġtoken Ġset Ġto ĠSKIP _ TOKEN . Ġ ĠRe call Ġthat ĊĠĠĠĠ Ġ* Ġif Ġtoken == null Ġat Ġend Ġof Ġany Ġtoken Ġrule , Ġit Ġcreates Ġone Ġfor Ġyou ĊĠĠĠĠ Ġ* Ġand Ġemits Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġskip () Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠSKIP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmore () Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠMO RE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmode ( m : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ mode Ġ= Ġm ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Mode ( m : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Lexer AT NS im ulator . debug ) Ġprintln (" push Mode Ġ" Ġ+ Ġm ) ĊĠĠĠĠĠĠĠ Ġ_ mode Stack . push (_ mode ) ĊĠĠĠĠĠĠĠ Ġmode ( m ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Mode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ mode Stack . isEmpty ) Ġthrow ĠRuntimeException () ĊĠĠĠĠĠĠĠ Ġif Ġ( Lexer AT NS im ulator . debug ) Ġout Message (" pop Mode Ġback Ġto Ġ" Ġ+ Ġ_ mode Stack . peek ()) ĊĠĠĠĠĠĠĠ Ġmode (_ mode Stack . pop ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ mode ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĠBy Ġdefault Ġdoes Ġnot Ġsupport Ġmultiple Ġemits Ġper Ġnext Token Ġinvocation ĊĠĠĠĠ Ġ* Ġfor Ġefficiency Ġreasons . Ġ ĠSub class Ġand Ġoverride Ġthis Ġmethod , Ġnext Token , ĊĠĠĠĠ Ġ* Ġand ĠgetToken Ġ( to Ġpush Ġtokens Ġinto Ġa Ġlist Ġand Ġpull Ġfrom Ġthat Ġlist ĊĠĠĠĠ Ġ* Ġrather Ġthan Ġa Ġsingle Ġvariable Ġas Ġthis Ġimplementation Ġdoes ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġemit ( token : ĠToken ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// System . err . println (" emit Ġ"+ token ); ĊĠĠĠĠĠĠĠ Ġthis . token Ġ= Ġtoken ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġstandard Ġmethod Ġcalled Ġto Ġautomatically Ġemit Ġa Ġtoken Ġat Ġthe ĊĠĠĠĠ Ġ* Ġout erm ost Ġlex ical Ġrule . Ġ ĠThe Ġtoken Ġobject Ġshould Ġpoint Ġinto Ġthe ĊĠĠĠĠ Ġ* Ġchar Ġbuffer Ġstart .. stop . Ġ ĠIf Ġthere Ġis Ġa Ġtext Ġoverride Ġin Ġ' text ', ĊĠĠĠĠ Ġ* Ġuse Ġthat Ġto Ġset Ġthe Ġtoken 's Ġtext . Ġ ĠOverride Ġthis Ġmethod Ġto Ġemit ĊĠĠĠĠ Ġ* Ġcustom ĠToken Ġobjects Ġor Ġprovide Ġa Ġnew Ġfactory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġemit (): ĠToken Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġtoken Factory . create (_ token Factory Source Pair !! , Ġtype , Ġ_ text , Ġchannel , Ġ_ token Start Char Index , Ġchar Index Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ token Start Line , Ġ_ token Start Char Position In Line ) ĊĠĠĠĠĠĠĠ Ġemit ( t ) ĊĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġemit EOF (): ĠToken Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc pos Ġ= Ġchar Position In Line ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġline ĊĠĠĠĠĠĠĠ Ġval Ġeof Ġ= Ġtoken Factory . create (_ token Factory Source Pair !! , ĠToken . EOF , Ġnull , ĠToken . DEFAULT _ CHANNEL , ĠinputStream !!. index (), ĠinputStream !!. index () Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline , Ġc pos ) ĊĠĠĠĠĠĠĠ Ġemit ( eof ) ĊĠĠĠĠĠĠĠ Ġreturn Ġeof ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecover ( e : ĠLex er No V iable Alt Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inputStream !!. LA ( 1 ) Ġ!= ĠInt Stream . EOF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġa Ġchar Ġand Ġtry Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpreter !!. consume ( read InputStream () !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Listeners ( e : ĠLex er No V iable Alt Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġread InputStream () !!. getText ( Interval . of (_ token Start Char Index , ĠinputStream !!. index ())) ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" token Ġrecognition Ġerror Ġat : Ġ'" Ġ+ Ġget Error Display ( text ) Ġ+ Ġ"'" ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġerror Listener Dispatch ĊĠĠĠĠĠĠĠ Ġlistener . syntax Error ( this , Ġnull , Ġ_ token Start Line , Ġ_ token Start Char Position In Line , Ġmsg , Ġe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Error Display ( s : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġs . as CharArray ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( getError Display ( c . toInt ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Error Display ( c : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġc . to Char (). toString () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken . EOF Ġ-> Ġs Ġ= Ġ"< EOF >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ n '. toInt () Ġ-> Ġs Ġ= Ġ"\\ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ t '. toInt () Ġ-> Ġs Ġ= Ġ"\\ t " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ r '. toInt () Ġ-> Ġs Ġ= Ġ"\\ r " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Char Error Display ( c : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġget Error Display ( c ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ"' $ s '" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLex ers Ġcan Ġnormally Ġmatch Ġany Ġchar Ġin Ġit 's Ġvocabulary Ġafter Ġmatching ĊĠĠĠĠ Ġ* Ġa Ġtoken , Ġso Ġdo Ġthe Ġeasy Ġthing Ġand Ġjust Ġkill Ġa Ġcharacter Ġand Ġhope ĊĠĠĠĠ Ġ* Ġit Ġall Ġworks Ġout . Ġ ĠYou Ġcan Ġinstead Ġuse Ġthe Ġrule Ġinvocation Ġstack ĊĠĠĠĠ Ġ* Ġto Ġdo Ġs oph istic ated Ġerror Ġrecovery Ġif Ġyou Ġare Ġin Ġa Ġfragment Ġrule . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrecover ( re : ĠRecognition Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// System . out . println (" consum ing Ġchar Ġ"+ ( char ) input . LA ( 1 )+" Ġduring Ġrecovery "); ĊĠĠĠĠĠĠĠ Ġ// re . printStackTrace (); ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠDo Ġwe Ġlose Ġcharacter Ġor Ġline Ġposition Ġinformation ? ĊĠĠĠĠĠĠĠ ĠinputStream !!. consume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ MODE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠMO RE Ġ= Ġ- 2 ĊĠĠĠĠĠĠĠ Ġval ĠSKIP Ġ= Ġ- 3 ĊĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ TOKEN _ CHANNEL Ġ= ĠToken . DEFAULT _ CHANNEL ĊĠĠĠĠĠĠĠ Ġval ĠHID DEN Ġ= ĠToken . HIDDEN _ CHANNEL ĊĠĠĠĠĠĠĠ Ġval ĠMIN _ CHAR _ VALUE Ġ= Ġ 0 x 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠMAX _ CHAR _ VALUE Ġ= Ġ 0 x 1 0 FFFF ĊĠĠĠ Ġ} Ċ Ċ } Ċ