|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from antlr4.Token import Token |
|
|
|
|
|
class InputStream (object): |
|
__slots__ = ('name', 'strdata', '_index', 'data', '_size') |
|
|
|
def __init__(self, data: str): |
|
self.name = "<empty>" |
|
self.strdata = data |
|
self._loadString() |
|
|
|
def _loadString(self): |
|
self._index = 0 |
|
self.data = [ord(c) for c in self.strdata] |
|
self._size = len(self.data) |
|
|
|
@property |
|
def index(self): |
|
return self._index |
|
|
|
@property |
|
def size(self): |
|
return self._size |
|
|
|
|
|
|
|
|
|
|
|
def reset(self): |
|
self._index = 0 |
|
|
|
def consume(self): |
|
if self._index >= self._size: |
|
assert self.LA(1) == Token.EOF |
|
raise Exception("cannot consume EOF") |
|
self._index += 1 |
|
|
|
def LA(self, offset: int): |
|
if offset==0: |
|
return 0 |
|
if offset<0: |
|
offset += 1 |
|
pos = self._index + offset - 1 |
|
if pos < 0 or pos >= self._size: |
|
return Token.EOF |
|
return self.data[pos] |
|
|
|
def LT(self, offset: int): |
|
return self.LA(offset) |
|
|
|
|
|
def mark(self): |
|
return -1 |
|
|
|
def release(self, marker: int): |
|
pass |
|
|
|
|
|
|
|
|
|
def seek(self, _index: int): |
|
if _index<=self._index: |
|
self._index = _index |
|
return |
|
|
|
self._index = min(_index, self._size) |
|
|
|
def getText(self, start :int, stop: int): |
|
if stop >= self._size: |
|
stop = self._size-1 |
|
if start >= self._size: |
|
return "" |
|
else: |
|
return self.strdata[start:stop+1] |
|
|
|
def __str__(self): |
|
return self.strdata |
|
|