2

I am trying to create my own recursive descent parser in python, but when my parser runs into a rule concerning arithmetic expressions, it surpasses the python recursion limit. Here is the grammar:

Term --> Factor {( "+" | "-" ) Factor}
Factor --> Grouping {( "*" | "/" | "%" ) Grouping}
Grouping --> Expression | "(" Expression ")" | "-" Factor


Expression --> Integer | Float | Tuple | ID | Term

The curly braces in the grammar denote that they can repeat (but also is optional), and are implemented using a while loop in my parser. I feel that what is causing this is the fact that a Grouping rule can be and Expression (whcih can recur over and over because the right side of the Factor and Term rule are optional).

What I am asking is: Is there a way to implement the left recusion with a recursive descent parser or eliminate it in my grammar somehow?

EDIT: I was browsing around and iit seem this type of recursion is called indirect left recursion, perhaps this has something to do with it?

Monolith
  • 1,067
  • 1
  • 13
  • 29

1 Answers1

1

As you observe, the infinite recursion is the result of the infinite loop

Expression ⇒ Term ⇒ Factor ⇒ Grouping ⇒ Expression

which must be broken. But it's a simple transcription error; Expression needs to start from the top, in a hierarchy of syntactic precedence:

Expression ⇒ Term {( "+" | "-" ) Term}
Term ⇒ Factor {( "*" | "/" | "%" ) Factor}
Factor ⇒ Item | "-" Factor
Item ⇒ Integer | Float | Tuple | ID | "(" Expression ")"
rici
  • 234,347
  • 28
  • 237
  • 341