| | |
| | |
| | |
| | |
| | |
| | from antlr4.RuleContext import RuleContext |
| | from antlr4.Token import Token |
| | from antlr4.error.ErrorListener import ProxyErrorListener, ConsoleErrorListener |
| |
|
| | |
| | RecognitionException = None |
| |
|
| | class Recognizer(object): |
| | __slots__ = ('_listeners', '_interp', '_stateNumber') |
| |
|
| | tokenTypeMapCache = dict() |
| | ruleIndexMapCache = dict() |
| |
|
| | def __init__(self): |
| | self._listeners = [ ConsoleErrorListener.INSTANCE ] |
| | self._interp = None |
| | self._stateNumber = -1 |
| |
|
| | def extractVersion(self, version): |
| | pos = version.find(".") |
| | major = version[0:pos] |
| | version = version[pos+1:] |
| | pos = version.find(".") |
| | if pos==-1: |
| | pos = version.find("-") |
| | if pos==-1: |
| | pos = len(version) |
| | minor = version[0:pos] |
| | return major, minor |
| |
|
| | def checkVersion(self, toolVersion): |
| | runtimeVersion = "4.9.3" |
| | rvmajor, rvminor = self.extractVersion(runtimeVersion) |
| | tvmajor, tvminor = self.extractVersion(toolVersion) |
| | if rvmajor!=tvmajor or rvminor!=tvminor: |
| | print("ANTLR runtime and generated code versions disagree: "+runtimeVersion+"!="+toolVersion) |
| |
|
| | def addErrorListener(self, listener): |
| | self._listeners.append(listener) |
| |
|
| | def removeErrorListener(self, listener): |
| | self._listeners.remove(listener) |
| |
|
| | def removeErrorListeners(self): |
| | self._listeners = [] |
| |
|
| | def getTokenTypeMap(self): |
| | tokenNames = self.getTokenNames() |
| | if tokenNames is None: |
| | from antlr4.error.Errors import UnsupportedOperationException |
| | raise UnsupportedOperationException("The current recognizer does not provide a list of token names.") |
| | result = self.tokenTypeMapCache.get(tokenNames, None) |
| | if result is None: |
| | result = zip( tokenNames, range(0, len(tokenNames))) |
| | result["EOF"] = Token.EOF |
| | self.tokenTypeMapCache[tokenNames] = result |
| | return result |
| |
|
| | |
| | |
| | |
| | |
| | def getRuleIndexMap(self): |
| | ruleNames = self.getRuleNames() |
| | if ruleNames is None: |
| | from antlr4.error.Errors import UnsupportedOperationException |
| | raise UnsupportedOperationException("The current recognizer does not provide a list of rule names.") |
| | result = self.ruleIndexMapCache.get(ruleNames, None) |
| | if result is None: |
| | result = zip( ruleNames, range(0, len(ruleNames))) |
| | self.ruleIndexMapCache[ruleNames] = result |
| | return result |
| |
|
| | def getTokenType(self, tokenName:str): |
| | ttype = self.getTokenTypeMap().get(tokenName, None) |
| | if ttype is not None: |
| | return ttype |
| | else: |
| | return Token.INVALID_TYPE |
| |
|
| |
|
| | |
| | def getErrorHeader(self, e:RecognitionException): |
| | line = e.getOffendingToken().line |
| | column = e.getOffendingToken().column |
| | return "line "+line+":"+column |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | def getTokenErrorDisplay(self, t:Token): |
| | if t is None: |
| | return "<no token>" |
| | s = t.text |
| | if s is None: |
| | if t.type==Token.EOF: |
| | s = "<EOF>" |
| | else: |
| | s = "<" + str(t.type) + ">" |
| | s = s.replace("\n","\\n") |
| | s = s.replace("\r","\\r") |
| | s = s.replace("\t","\\t") |
| | return "'" + s + "'" |
| |
|
| | def getErrorListenerDispatch(self): |
| | return ProxyErrorListener(self._listeners) |
| |
|
| | |
| | |
| | def sempred(self, localctx:RuleContext, ruleIndex:int, actionIndex:int): |
| | return True |
| |
|
| | def precpred(self, localctx:RuleContext , precedence:int): |
| | return True |
| |
|
| | @property |
| | def state(self): |
| | return self._stateNumber |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | @state.setter |
| | def state(self, atnState:int): |
| | self._stateNumber = atnState |
| |
|
| | del RecognitionException |
| |
|