Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds a new combinator
left_assoc
to parse left-associative operators.Parsing operator with different precedence in
nom
has usually been a bit of a challenge. There is this other PR#1362, but it seems a bit stalled.The classical alternative in LALR grammars is to use a recursive rule such as:
Alas, that can't be parsed easily with
nom
because it will recurse infinitely.The solution is to parse it with this other equivalent rule:
while calling a callback to give the user the chance to build the AST, or whatever.
This could be implemented as a call to
B
and thenfold_many0
with thepair(op, B)
. Instead, I chose copying theseparated_list1
code (thatOM
thing is tricky).As an alternative public API, the type of the left expression and that of the right expression could be different. Then we would need two separated parsers,
left
andright
returning typesL
andR
; and thebuilder
would be of typeFnMut(L, OP, R) -> L
. Maybe another combinator,left_assoc_2()
could be added for that?