nom_supreme

Module multi

Source
Expand description

Perfected looping parsers designed to behave more reliably and provide more useful parse errors.

The combinators in this module all generally follow the same pattern for parsing in a loop. They parse an item; then, they attempt to parse a terminator. If the terminator is found, the parse returns successfully; otherwise, they attempt to parse a separator. If they fail to parse either a separator or a terminator, the parse fails; otherwise, it will continue on to parse the next item. The parsed items are collected together into a final value; each combinator does this in a slightly different way:

These combinators always parse at least 1 item. If you want 0 or more things to be parsed, use opt or alt to handle that case.

These combinators will stop as soon as they find a terminator. If you wish to have a terminator parser that is the same as your separator, you’ll need to add some extra context to the terminator parser; perhaps a lookahead with peek.

These combinators exists to provide meaningful parse errors. By requiring a terminator, we can ensure that they don’t suffer from the normal folding parser problem of unconditionally returning success because a subparser failure is interpreted as the end of the loop. This ensures that potentially important errors aren’t thrown away.

The combinators will attempt to smartly allow 0-length matches. It will allow subparsers to have 0-length matches, but if a full loop is made without any progress being made, we assume we’ve encountered an infinite loop and return a parse error.

Functions§

  • Parse a series of 1 or more things, separated by separator, terminated by terminator, and collect them into a collection using Extend.
  • Parse a series of 1 or more things, separated by separator, terminated by terminator, and fold them together using a folding function.
  • Parse a series of 1 or more things, separated by some separator, terminated by some terminator, folding them all together with a fallible fold function.