@@ -91,11 +91,16 @@ func (l *LexerATNSimulator) Match(input CharStream, mode int) int {
9191
9292 dfa := l .decisionToDFA [mode ]
9393
94- if dfa .getS0 () == nil {
94+ var s0 * DFAState
95+ l .atn .stateMu .RLock ()
96+ s0 = dfa .getS0 ()
97+ l .atn .stateMu .RUnlock ()
98+
99+ if s0 == nil {
95100 return l .MatchATN (input )
96101 }
97102
98- return l .execATN (input , dfa . getS0 () )
103+ return l .execATN (input , s0 )
99104}
100105
101106func (l * LexerATNSimulator ) reset () {
@@ -117,11 +122,7 @@ func (l *LexerATNSimulator) MatchATN(input CharStream) int {
117122 suppressEdge := s0Closure .hasSemanticContext
118123 s0Closure .hasSemanticContext = false
119124
120- next := l .addDFAState (s0Closure )
121-
122- if ! suppressEdge {
123- l .decisionToDFA [l .mode ].setS0 (next )
124- }
125+ next := l .addDFAState (s0Closure , suppressEdge )
125126
126127 predict := l .execATN (input , next )
127128
@@ -207,7 +208,9 @@ func (l *LexerATNSimulator) getExistingTargetState(s *DFAState, t int) *DFAState
207208 return nil
208209 }
209210
211+ l .atn .edgeMu .RLock ()
210212 target := s .getIthEdge (t - LexerATNSimulatorMinDFAEdge )
213+ l .atn .edgeMu .RUnlock ()
211214 if LexerATNSimulatorDebug && target != nil {
212215 fmt .Println ("reuse state " + strconv .Itoa (s .stateNumber ) + " edge to " + strconv .Itoa (target .stateNumber ))
213216 }
@@ -537,7 +540,7 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg
537540 suppressEdge := cfgs .HasSemanticContext ()
538541 cfgs .SetHasSemanticContext (false )
539542
540- to = l .addDFAState (cfgs )
543+ to = l .addDFAState (cfgs , true )
541544
542545 if suppressEdge {
543546 return to
@@ -551,6 +554,8 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg
551554 if LexerATNSimulatorDebug {
552555 fmt .Println ("EDGE " + from .String () + " -> " + to .String () + " upon " + strconv .Itoa (tk ))
553556 }
557+ l .atn .edgeMu .Lock ()
558+ defer l .atn .edgeMu .Unlock ()
554559 if from .getEdges () == nil {
555560 // make room for tokens 1..n and -1 masquerading as index 0
556561 from .setEdges (make ([]* DFAState , LexerATNSimulatorMaxDFAEdge - LexerATNSimulatorMinDFAEdge + 1 ))
@@ -564,7 +569,7 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg
564569// configurations already. This method also detects the first
565570// configuration containing an ATN rule stop state. Later, when
566571// traversing the DFA, we will know which rule to accept.
567- func (l * LexerATNSimulator ) addDFAState (configs ATNConfigSet ) * DFAState {
572+ func (l * LexerATNSimulator ) addDFAState (configs ATNConfigSet , suppressEdge bool ) * DFAState {
568573
569574 proposed := NewDFAState (- 1 , configs )
570575 var firstConfigWithRuleStopState ATNConfig
@@ -585,16 +590,22 @@ func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet) *DFAState {
585590 }
586591 hash := proposed .hash ()
587592 dfa := l .decisionToDFA [l .mode ]
593+
594+ l .atn .stateMu .Lock ()
595+ defer l .atn .stateMu .Unlock ()
588596 existing , ok := dfa .getState (hash )
589597 if ok {
590- return existing
591- }
592- newState := proposed
593- newState .stateNumber = dfa .numStates ()
594- configs .SetReadOnly (true )
595- newState .configs = configs
596- dfa .setState (hash , newState )
597- return newState
598+ proposed = existing
599+ } else {
600+ proposed .stateNumber = dfa .numStates ()
601+ configs .SetReadOnly (true )
602+ proposed .configs = configs
603+ dfa .setState (hash , proposed )
604+ }
605+ if ! suppressEdge {
606+ dfa .setS0 (proposed )
607+ }
608+ return proposed
598609}
599610
600611func (l * LexerATNSimulator ) getDFA (mode int ) * DFA {
0 commit comments