Mercurial > lbo > hg > pcombinators
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."""