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
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.
source
share