Skip to content

Fail error messages do not show choices of attempted elements as an option #104

@bookofproofs

Description

@bookofproofs

I have a grammar that has choices of elements, some of which have to be proceeded by the attempt parser (otherwise, I would get different grammar).

My problem is that a failing parser does not reflect the actual possibilities of the grammar.

To illustrate this behavior, check out this example:

let a = pchar 'a'
let bra = pchar '<'
let ket = pchar '>'
let comma = skipChar ','
let aBraKet = a .>> bra .>> ket 
let aChoice = attempt aBraKet <|> a
// note that `let aChoice = aBraKet <|> a` would define a different grammar, in which we would never be able to parse a single `a`
// neither would `let aChoice = a <|> aBraKet` do the trick, because we would never be able to parse a single `a<>`.
let list = sepBy1 aChoice comma

let input = "a<>,a<>,a,axxx"
let result = run (list .>> eof) input
printf "%O" result

This will output

Failure:
Error in Ln: 1 Col: 12
a<>,a<>,a,axxx
           ^
Expecting: end of input or ','

The actual grammar, however, expects '<', ',' or end of input.

This behavior may be a feature and not a bug of FParsec, but would it be possible to enhance the error message to display every choice that is available in the grammar at this parsing state?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions