Mercurial > lbo > hg > pcombinators
changeset 53:2202ec2712c8 draft
Introduce general optimization for string lookahead in state.
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Fri, 24 May 2019 00:07:39 +0200 |
parents | bc662ab63361 |
children | 79b3b77fd4bf |
files | pcombinators/state.py |
diffstat | 1 files changed, 11 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/pcombinators/state.py Fri May 24 00:07:15 2019 +0200 +++ b/pcombinators/state.py Fri May 24 00:07:39 2019 +0200 @@ -72,7 +72,7 @@ def finished(self): return self.index() == self.len() - def remaining(self): + def remaining(self, nmin): raise NotImplementedError() class ParseException(Exception): @@ -88,7 +88,7 @@ _total_offset = 0 # Index of first _buf entry in stream since start def __repr__(self): - return 'PFS(ix={}, to={}, buf={})'.format(self._index, self._total_offset, self._buf) + return 'PFS(ix={}, to={}, buf="{}")'.format(self._index, self._total_offset, ''.join(self._buf)) def __init__(self, f): self._stream_finished = False @@ -152,10 +152,11 @@ self.fill_buffer(self._index + n) self._index += n - def remaining(self): - print('warning: remaining() on ParseFileState is only accurate to up to {} characters lookahead and expensive'.format(self.PREFIL)) - self.fill_buffer(self.PREFILL) - return self._buf[self._index:] + def remaining(self, nmin=-1): + self.fill_buffer(self.PREFILL if nmin == -1 else nmin) + if nmin == -1: + return ''.join(self._buf[self._index:]) + return ''.join(self._buf[self._index:self._index+nmin]) def len(self): print('warning: len() is inaccurate on ParseFileState, returning only past and present state') @@ -213,7 +214,9 @@ def finished(self): return self._index == len(self._input) - def remaining(self): + def remaining(self, nmin=-1): if self.finished(): return '' - return self._input[self._index:] + if nmin == -1: + return self._input[self._index:] + return self._input[self._index:self._index+nmin] \ No newline at end of file