def endBy1(parser, sep, keep=False): '''Parses one or more occurrences of 'parser', separated and ended by 'sep'. If keep is True, returns a list of values returned by BOTH 'parser' and 'sep'; otherwise, a list of values returned by 'parser'. ''' if keep: parseOne, transform = sequence(parser, sep), concat else: parseOne, transform = parser >= (lambda p: sep >> lift(p)), lambda x: x return fmap(transform, many1(parseOne))
def trailing_space(parser): "Skips trailing whitespace" return parser >= (lambda p: whiteSpace >> lift(p))
def between(open, close, parser): '''Parses 'open' -> 'parser' -> 'close'. Returns the value returned by 'parser'. ''' return open >> parser >= (lambda p: close >> lift(p))
def option(default_value, parser): '''Runs 'parser' and returns a value returned by it. If parsing failed, returns 'default_value'. ''' return parser | lift(default_value)