Spaces:
Build error
Build error
# | |
# 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) | |