Pharo/PetitParserにBNF for EPDを実装しようとしています。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"
私は、試してみて、解析し、次のように:
element := PPUnresolvedParser new.
element def: (sanMove).
mse := element end.
mse parse: 'Re4'.
しかし、私はこのエラーを取得する:私は、入力としてRee4
をしようとした場合
$h expected at 2 // btw these indexes seem to start at 0
それは#($R $e #($e $4) nil nil)
として成功裏に解析します。これにより、曖昧さ回避のオプションフラグが正しく機能していないと考えられ、 "e"を解析することなく解析するかどうかは、disambiguation
としても、パーザは試してみません。しかし、PetitParserがなぜあきらめるのか分からないので、義務的な文を解釈することはできません。targetSquare