How to prevent greed with PetitParser?

I am trying to implement BNF for EPD in Pharo / PetitParser.

digit18 := $1 asParser / $2 asParser / $3 asParser / $4 asParser / $5 asParser / $6 asParser / $7 asParser / $8 asParser.
piecePromotion := $N asParser / $B asParser / $R asParser / $Q asParser.
promotion := ($= asParser) , piecePromotion.
fileLetter := ($a asParser / $b asParser / $c asParser / $d asParser / $e asParser / $f asParser / $g asParser / $h asParser).
targetSquare := fileLetter , digit18.
disambiguation := fileLetter / digit18.
pieceCode := ($N asParser / $B asParser / $R asParser / $Q asParser / $K asParser) optional.
castles := $O asParser, $- asParser, $O asParser, (($- asParser, $O asParser) optional) .
sanMove := (pieceCode, disambiguation optional, targetSquare, promotion optional, ($+ asParser / $# asParser) optional) "/ castles". "commented out because I'd be getting another error with this enabled"

Then I will try to parse like this:

element := PPUnresolvedParser new.

element def: ( sanMove ).
mse := element end.
mse parse: 'Re4'.

But I get this error:

$h expected at 2 // btw these indexes seem to start at 0

If I try Ree4as input, it will successfully figure out how #($R $e #($e $4) nil nil). This makes me think that the optional flag for disambiguation does not work correctly and that the parser does not try and does not see if it parses "e" indiscriminately disambiguation, even if it is possible. This makes it impossible to parse mandatory targetSquare, though, so I don’t understand why PetitParser refuses.

+5
source share
1 answer

( , PetitParser) . , , - . " " , , .

BNF PEG , . BNF PetitParser. ( PEG). sanMove :

sanMove := pieceCode, ((targetSquare, promotion optional, ($+ asParser / $# asParser) optional) / (disambiguation optional, targetSquare, promotion optional, ($+ asParser / $# asParser) optional)).

:

sanMove end parse: 'Ree4'.
sanMove end parse: 'Re4'.
+4

All Articles