| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #
- # Copyright (c) 2012-2017 The ANTLR 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.
- #/
- from antlr4.PredictionContext import PredictionContextCache, PredictionContext, getCachedPredictionContext
- from antlr4.atn.ATN import ATN
- from antlr4.atn.ATNConfigSet import ATNConfigSet
- from antlr4.dfa.DFAState import DFAState
- class ATNSimulator(object):
- __slots__ = ('atn', 'sharedContextCache', '__dict__')
- # Must distinguish between missing edge and edge we know leads nowhere#/
- ERROR = DFAState(configs=ATNConfigSet())
- ERROR.stateNumber = 0x7FFFFFFF
- # The context cache maps all PredictionContext objects that are ==
- # to a single cached copy. This cache is shared across all contexts
- # in all ATNConfigs in all DFA states. We rebuild each ATNConfigSet
- # to use only cached nodes/graphs in addDFAState(). We don't want to
- # fill this during closure() since there are lots of contexts that
- # pop up but are not used ever again. It also greatly slows down closure().
- #
- # <p>This cache makes a huge difference in memory and a little bit in speed.
- # For the Java grammar on java.*, it dropped the memory requirements
- # at the end from 25M to 16M. We don't store any of the full context
- # graphs in the DFA because they are limited to local context only,
- # but apparently there's a lot of repetition there as well. We optimize
- # the config contexts before storing the config set in the DFA states
- # by literally rebuilding them with cached subgraphs only.</p>
- #
- # <p>I tried a cache for use during closure operations, that was
- # whacked after each adaptivePredict(). It cost a little bit
- # more time I think and doesn't save on the overall footprint
- # so it's not worth the complexity.</p>
- #/
- def __init__(self, atn:ATN, sharedContextCache:PredictionContextCache):
- self.atn = atn
- self.sharedContextCache = sharedContextCache
- def getCachedContext(self, context:PredictionContext):
- if self.sharedContextCache is None:
- return context
- visited = dict()
- return getCachedPredictionContext(context, self.sharedContextCache, visited)
|