| |
| |
| |
| |
| |
| import unittest |
|
|
|
|
| |
| |
| |
| from antlr4.Token import Token |
|
|
|
|
| class InputStream (object): |
|
|
| 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 |
|
|
|
|
| class TestInputStream(unittest.TestCase): |
|
|
| def testStream(self): |
| stream = InputStream("abcde") |
| self.assertEqual(0, stream.index) |
| self.assertEqual(5, stream.size) |
| self.assertEqual(ord("a"), stream.LA(1)) |
| stream.consume() |
| self.assertEqual(1, stream.index) |
| stream.seek(5) |
| self.assertEqual(Token.EOF, stream.LA(1)) |
| self.assertEqual("bcd", stream.getText(1, 3)) |
| stream.reset() |
| self.assertEqual(0, stream.index) |
|
|
|
|