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