/* Ċ Ġ* Ġ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 . at n Ċ Ċ import Ġorg . antlr . v 4 . kotlin runtime . ParserRuleContext Ċ import Ġorg . antlr . v 4 . kotlin runtime . RuleContext Ċ import Ġorg . antlr . v 4 . kotlin runtime . Token Ċ import Ġorg . antlr . v 4 . kotlin runtime . misc . Interval Set Ċ Ċ /** Ġ Ġ*/ Ċ class ĠAT N Ċ /** ĠUsed Ġfor Ġruntime Ġde serialization Ġof ĠAT Ns Ġfrom Ġstrings Ġ Ġ*/ Ċ ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġtype Ġof Ġthe ĠAT N . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġgrammar Type : ĠAT N Type , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmaximum Ġvalue Ġfor Ġany Ġsymbol Ġrecognized Ġby Ġa Ġtransition Ġin Ġthe ĠAT N . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġmax TokenType : ĠInt ) Ġ{ ĊĊĊĠĠĠ Ġval Ġstates : ĠMutable List < AT N State ?> Ġ= ĠArrayList < AT N State ?> () ĊĊĠĠĠ Ġ/** ĠEach Ġsub rule / rule Ġis Ġa Ġdecision Ġpoint Ġand Ġwe Ġmust Ġtrack Ġthem Ġso Ġwe ĊĠĠĠĠ Ġ* Ġcan Ġgo Ġback Ġlater Ġand Ġbuild ĠD FA Ġpredict ors Ġfor Ġthem . Ġ ĠThis Ġincludes ĊĠĠĠĠ Ġ* Ġall Ġthe Ġrules , Ġsub rules , Ġoptional Ġblocks , Ġ() +, Ġ() * Ġetc ... ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdecision To State : ĠMutable List < Decision State > Ġ= ĠArrayList < Decision State >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġfrom Ġrule Ġindex Ġto Ġstarting Ġstate Ġnumber . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrule To Start State : ĠArray < Rule Start State ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġfrom Ġrule Ġindex Ġto Ġstop Ġstate Ġnumber . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrule To Stop State : ĠArray < Rule Stop State ?> ? Ġ= Ġnull ĊĊĊĠĠĠ Ġval Ġmode Name To Start State : ĠMap < String , ĠTokens Start State > Ġ= ĠLinkedHashMap < String , ĠTokens Start State >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġlexer ĠAT Ns , Ġthis Ġmaps Ġthe Ġrule Ġindex Ġto Ġthe Ġresulting Ġtoken Ġtype . ĊĠĠĠĠ Ġ* ĠFor Ġparser ĠAT Ns , Ġthis Ġmaps Ġthe Ġrule Ġindex Ġto Ġthe Ġgenerated Ġbypass Ġtoken ĊĠĠĠĠ Ġ* Ġtype Ġif Ġthe ĊĠĠĠĠ Ġ* Ġ[ AT N Deserialization Options . is Generate Rule By pass Transitions ] ĊĠĠĠĠ Ġ* Ġde serialization Ġoption Ġwas Ġspecified ; Ġotherwise , Ġthis Ġis Ġ` null `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrule To TokenType : ĠInt Array ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġlexer ĠAT Ns , Ġthis Ġis Ġan Ġarray Ġof Ġ[ Lexer Action ] Ġobjects Ġwhich Ġmay ĊĠĠĠĠ Ġ* Ġbe Ġreferenced Ġby Ġaction Ġtransitions Ġin Ġthe ĠAT N . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġlexer Actions : ĠArray < Lexer Action ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġmode To Start State : ĠMutable List < Tokens Start State > Ġ= ĠArrayList < Tokens Start State >() ĊĊĠĠĠ Ġval ĠnumberOf Dec isions : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdecision To State . size ĊĊĠĠĠ Ġ/** ĠCompute Ġthe Ġset Ġof Ġvalid Ġtokens Ġthat Ġcan Ġoccur Ġstarting Ġin Ġstate Ġ` s `. ĊĠĠĠĠ Ġ* ĠIf Ġ` ctx ` Ġis Ġnull , Ġthe Ġset Ġof Ġtokens Ġwill Ġnot Ġinclude Ġwhat Ġcan Ġfollow ĊĠĠĠĠ Ġ* Ġthe Ġrule Ġsurrounding Ġ` s `. ĠIn Ġother Ġwords , Ġthe Ġset Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġrestricted Ġto Ġtokens Ġreachable Ġstay ing Ġwithin Ġ` s `' s Ġrule . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Tokens ( s : ĠAT N State , Ġctx : ĠRule Context ?): ĠInterval Set Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanal Ġ= ĠLL 1 Analyzer ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġanal . LOOK ( s , Ġctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCompute Ġthe Ġset Ġof Ġvalid Ġtokens Ġthat Ġcan Ġoccur Ġstarting Ġin Ġ` s ` Ġand ĊĠĠĠĠ Ġ* Ġstay ing Ġin Ġsame Ġrule . Ġ[ Token . EPS ILON ] Ġis Ġin Ġset Ġif Ġwe Ġreach Ġend Ġof ĊĠĠĠĠ Ġ* Ġrule . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Tokens ( s : ĠAT N State ): ĠInterval Set ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( s . nextToken Within Rule Ġ!= Ġnull ) Ġreturn Ġs . nextToken Within Rule ĊĠĠĠĠĠĠĠ Ġs . nextToken Within Rule Ġ= Ġnext Tokens ( s , Ġnull ) ĊĠĠĠĠĠĠĠ Ġs . nextToken Within Rule !!. is Readonly Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġs . nextToken Within Rule ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd State ( state : ĠAT N State ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate !!. at n Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate !!. state Number Ġ= Ġstates . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstates . add ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove State ( state : ĠAT N State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstates [ state . state Number ] Ġ= Ġnull Ġ// Ġjust Ġfree Ġmem , Ġdon 't Ġshift Ġstates Ġin Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdefine Decision State ( s : ĠDecision State ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġdecision To State . add ( s ) ĊĠĠĠĠĠĠĠ Ġs . decision Ġ= Ġdecision To State . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn Ġs . decision ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Decision State ( decision : ĠInt ): ĠDecision State ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! decision To State . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecision To State [ decision ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġset Ġof Ġinput Ġsymbols Ġwhich Ġcould Ġfollow ĠAT N Ġstate Ġnumber ĊĠĠĠĠ Ġ* Ġ` state Number ` Ġin Ġthe Ġspecified Ġfull Ġ` context `. ĠThis Ġmethod ĊĠĠĠĠ Ġ* Ġcons iders Ġthe Ġcomplete Ġparser Ġcontext , Ġbut Ġdoes Ġnot Ġevaluate Ġsemantic ĊĠĠĠĠ Ġ* Ġpredicates Ġ( i . e . Ġall Ġpredicates Ġencountered Ġduring Ġthe Ġcalculation Ġare ĊĠĠĠĠ Ġ* Ġassumed Ġtrue ). ĠIf Ġa Ġpath Ġin Ġthe ĠAT N Ġexists Ġfrom Ġthe Ġstarting Ġstate Ġto Ġthe ĊĠĠĠĠ Ġ* Ġ[ Rule Stop State ] Ġof Ġthe Ġout erm ost Ġcontext Ġwithout Ġmatching Ġany ĊĠĠĠĠ Ġ* Ġsymbols , Ġ[ Token . EOF ] Ġis Ġadded Ġto Ġthe Ġreturned Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ` context ` Ġis Ġ` null `, Ġit Ġis Ġtreated Ġas Ġ[ ParserRuleContext . EMPTY ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġdoes ĠNOT Ġgive Ġyou Ġthe Ġset Ġof Ġall Ġtokens Ġthat Ġcould ĊĠĠĠĠ Ġ* Ġappear Ġat Ġa Ġgiven Ġtoken Ġposition Ġin Ġthe Ġinput Ġphrase . Ġ ĠIn Ġother Ġwords , ĊĠĠĠĠ Ġ* Ġit Ġdoes Ġnot Ġanswer : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" Given Ġa Ġspecific Ġpartial Ġinput Ġphrase , Ġreturn Ġthe Ġset Ġof Ġall Ġtokens ĊĠĠĠĠ Ġ* Ġthat Ġcan Ġfollow Ġthe Ġlast Ġtoken Ġin Ġthe Ġinput Ġphrase ." ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġbig Ġdifference Ġis Ġthat Ġwith Ġjust Ġthe Ġinput , Ġthe Ġparser Ġcould ĊĠĠĠĠ Ġ* Ġland Ġright Ġin Ġthe Ġmiddle Ġof Ġa Ġlook ahead Ġdecision . ĠGetting ĊĠĠĠĠ Ġ* Ġall Ġ* possible * Ġtokens Ġgiven Ġa Ġpartial Ġinput Ġstream Ġis Ġa Ġseparate ĊĠĠĠĠ Ġ* Ġcomputation . ĠSee Ġhttps :// github . com / antlr / antlr 4 / issues / 1 4 2 8 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġthis Ġfunction , Ġwe Ġare Ġspecifying Ġan ĠAT N Ġstate Ġand Ġcall Ġstack Ġto Ġcompute ĊĠĠĠĠ Ġ* Ġwhat Ġtoken ( s ) Ġcan Ġcome Ġnext Ġand Ġspecifically : Ġoutside Ġof Ġa Ġlook ahead Ġdecision . ĊĠĠĠĠ Ġ* ĠThat Ġis Ġwhat Ġyou Ġwant Ġfor Ġerror Ġreporting Ġand Ġrecovery Ġupon Ġparse Ġerror . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstate Number Ġthe ĠAT N Ġstate Ġnumber ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġfull Ġparse Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġset Ġof Ġpotentially Ġvalid Ġinput Ġsymbols Ġwhich Ġcould Ġfollow Ġthe ĊĠĠĠĠ Ġ* Ġspecified Ġstate Ġin Ġthe Ġspecified Ġcontext . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe ĠAT N Ġdoes Ġnot Ġcontain Ġa Ġstate Ġwith ĊĠĠĠĠ Ġ* Ġnumber Ġ` state Number ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Expected Tokens ( state Number : ĠInt , Ġcontext : ĠRule Context ?): ĠInterval Set Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Number Ġ< Ġ 0 Ġ|| Ġstate Number Ġ>= Ġstates . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġstate Ġnumber .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġctx : ĠRule Context ? Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġstates [ state Number ] ĊĠĠĠĠĠĠĠ Ġvar Ġfollowing Ġ= Ġnext Tokens ( s !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! following !!. contains ( Token . EPS ILON )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfollowing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠInterval Set () ĊĠĠĠĠĠĠĠ Ġexpected . addAll ( following ) ĊĠĠĠĠĠĠĠ Ġexpected . remove ( Token . EPS ILON ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ctx Ġ!= Ġnull Ġ&& Ġctx !!. inv oking State Ġ>= Ġ 0 Ġ&& Ġfollowing !!. contains ( Token . EPS ILON )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinvokingState Ġ= Ġstates [ ctx !!. inv oking State ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrt Ġ= ĠinvokingState !!. transition ( 0 ) Ġas ĠRule Transition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfollowing Ġ= Ġnext Tokens ( rt . follow State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected . addAll ( following ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected . remove ( Token . EPS ILON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx Ġ= Ġctx !!. read Parent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( following !!. contains ( Token . EPS ILON )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected . add ( Token . EOF ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexpected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠINVALID _ ALT _ NUMBER Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ