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