rust-bakery/nom

Any other approach to handle left recursion

Chiichen opened this issue · 0 comments

Knowing that I can handle left recursion cases by rewriting the grammar. But I am wondering if there is any other approach (since rewriting might greatly reduce the code readability beacause we can not easily infer the usage of a single combinator literraly) in some simple cases like recursively parsing an arithmetic grammar(I believe threre is no a general method to handle left recursion without rewriting grammar at current version).

Here is an example:

We have a left recuesive grammar :

  • E -> E op E (op = {'+','-','*','/','&','|',"==","!="})
  • E -> T (BuiltInType)
  • E -> F (Function Call)
  • E -> (E)

We rewrite it into:

  • E -> (E)E'
  • E -> TE'
  • E -> FE'
  • E'-> op E E' | ε

Before we rewrite it,each production can be clearly and easily described by a single combinator.But after rewriting the grammar, each production is coupling with E' which greatly reduces the self-explanation of combinators

#445 is a previous issue