# # 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(). # #
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.
# #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.
#/ 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)