|
|
|
|
|
|
|
|
|
|
|
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 |
|
|