|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from antlr4.CommonTokenFactory import CommonTokenFactory |
|
from antlr4.Lexer import TokenSource |
|
from antlr4.Token import Token |
|
|
|
|
|
class ListTokenSource(TokenSource): |
|
__slots__ = ('tokens', 'sourceName', 'pos', 'eofToken', '_factory') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, tokens:list, sourceName:str=None): |
|
if tokens is None: |
|
raise ReferenceError("tokens cannot be null") |
|
self.tokens = tokens |
|
self.sourceName = sourceName |
|
|
|
|
|
|
|
self.pos = 0 |
|
|
|
self.eofToken = None |
|
|
|
self._factory = CommonTokenFactory.DEFAULT |
|
|
|
|
|
|
|
|
|
|
|
@property |
|
def column(self): |
|
if self.pos < len(self.tokens): |
|
return self.tokens[self.pos].column |
|
elif self.eofToken is not None: |
|
return self.eofToken.column |
|
elif len(self.tokens) > 0: |
|
|
|
|
|
lastToken = self.tokens[len(self.tokens) - 1] |
|
tokenText = lastToken.text |
|
if tokenText is not None: |
|
lastNewLine = tokenText.rfind('\n') |
|
if lastNewLine >= 0: |
|
return len(tokenText) - lastNewLine - 1 |
|
return lastToken.column + lastToken.stop - lastToken.start + 1 |
|
|
|
|
|
|
|
return 0 |
|
|
|
|
|
|
|
|
|
def nextToken(self): |
|
if self.pos >= len(self.tokens): |
|
if self.eofToken is None: |
|
start = -1 |
|
if len(self.tokens) > 0: |
|
previousStop = self.tokens[len(self.tokens) - 1].stop |
|
if previousStop != -1: |
|
start = previousStop + 1 |
|
stop = max(-1, start - 1) |
|
self.eofToken = self._factory.create((self, self.getInputStream()), |
|
Token.EOF, "EOF", Token.DEFAULT_CHANNEL, start, stop, self.line, self.column) |
|
return self.eofToken |
|
t = self.tokens[self.pos] |
|
if self.pos == len(self.tokens) - 1 and t.type == Token.EOF: |
|
self.eofToken = t |
|
self.pos += 1 |
|
return t |
|
|
|
|
|
|
|
|
|
@property |
|
def line(self): |
|
if self.pos < len(self.tokens): |
|
return self.tokens[self.pos].line |
|
elif self.eofToken is not None: |
|
return self.eofToken.line |
|
elif len(self.tokens) > 0: |
|
|
|
|
|
lastToken = self.tokens[len(self.tokens) - 1] |
|
line = lastToken.line |
|
tokenText = lastToken.text |
|
if tokenText is not None: |
|
line += tokenText.count('\n') |
|
|
|
|
|
return line |
|
|
|
|
|
|
|
return 1 |
|
|
|
|
|
|
|
|
|
def getInputStream(self): |
|
if self.pos < len(self.tokens): |
|
return self.tokens[self.pos].getInputStream() |
|
elif self.eofToken is not None: |
|
return self.eofToken.getInputStream() |
|
elif len(self.tokens) > 0: |
|
return self.tokens[len(self.tokens) - 1].getInputStream() |
|
else: |
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def getSourceName(self): |
|
if self.sourceName is not None: |
|
return self.sourceName |
|
inputStream = self.getInputStream() |
|
if inputStream is not None: |
|
return inputStream.getSourceName() |
|
else: |
|
return "List" |
|
|