changeset 27:6e9cf2fb5f49 draft

Improve Skip behavior
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 21 May 2019 10:11:43 +0200
parents 25aab2c2a695
children 7973c4d6a945
files pcombinators/combinators.py
diffstat 1 files changed, 14 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/pcombinators/combinators.py	Tue May 21 01:26:22 2019 +0200
+++ b/pcombinators/combinators.py	Tue May 21 10:11:43 2019 +0200
@@ -135,7 +135,7 @@
             return self._transform(r), st2
         except Exception as e:
             st.reset(initial)
-            raise Exception('{} (at {} (col {}))'.format(e, st, st.index()))
+            raise Exception('{} (in {} at {} (col {}))'.format(e, self._transform, st, st.index()))
 
 class _Sequence(Parser):
     _parsers = []
@@ -156,7 +156,8 @@
                     return None, st
                 st.reset(before)
                 break
-            Util.extend_results(results, result)
+            if result is not SKIP_MARK:
+                results.append(result)
             st = st2
         return results, st2
 
@@ -202,7 +203,8 @@
                     st.reset(initial)
                     return None, st
                 return results, st2
-            Util.extend_results(results, r)
+            if r is not SKIP_MARK:
+                results.append(r)
             st = st2
             i += 1
         return results, st
@@ -273,11 +275,18 @@
 
 def Last(p):
     """Return the last result from the list of results of p. Result is scalar."""
-    return p >> (lambda l: l[-1] if isinstance(l, list) else l)
+    def last(l):
+        if isinstance(l, list):
+            if len(l) == 0:
+                return l
+            return l[-1]
+    return p >> last
+
+SKIP_MARK = []
 
 def Skip(p):
     """Omit the result of parser p, and replace it with []. Result is []."""
-    return p >> (lambda r: [])
+    return p >> (lambda r: SKIP_MARK)
 
 def ConcatenateResults(p):
     """Concatenate string results into a single string. Result is string."""