Skip to content

Left-Recursive Expressions #4

Open
@j-mie6

Description

@j-mie6

Parser combinator libraries, like our very own miniparsec, are often vulnerable to left-recursion:

Expressions with left recursion cannot be encoded by recursive descent parsers and will diverge.

Let's suppose we had the parser:

bad = bad *> char 'a' <|> char 'b'

This could be interpreted as matching a regex like ba*, but using a recursive descent algorithm it will evaluate bad by immediately evaluating... bad. Oops! In order for parsers to be productive, they have to have consumed some input before they recurse again.

Commonly, the grammar can be factored to remove left-recursion, but this exposes implementation details and complicates the grammar, so ideally we could avoid that... I'll have a think.

Metadata

Metadata

Assignees

No one assigned

    Labels

    pitfallA problem that could be encountered when using combinators

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions