+def _or_parser(*parsers):
+ def result_parser(index, tokens):
+ failure = (False, index, None)
+
+ for parser in parsers:
+ success, index, value = parser(index, tokens)
+
+ if success:
+ return (success, index, value)
+
+ return failure
+
+ return result_parser
+
+def _zero_or_more_parser(formatter, parser):
+ def result_parser(index, tokens):
+ values = []
+
+ while index < len(tokens):
+ success, index, value = parser(index, tokens)
+
+ if success:
+ values.append(value)
+ else:
+ break
+
+ return (True, index, formatter(values))
+
+ return result_parser
+