演習として、Megaparsec を使用して EBNF/ABNF 文法を解析してみます。端末やオプションなどの些細なことは機能していますが、代替手段に苦労しています。この文法では:
S ::= 'hello' ['world'] IDENTIFIER LITERAL | 'test';
そして、このコード:
production :: Parser Production
production = sepBy1 alternativeTerm (char '|') >>= return . Production
alternativeTerm :: Parser AlternativeTerm
alternativeTerm = sepBy1 term space >>= return . AlternativeTerm
term :: Parser Term
term = terminal
<|> optional
<|> identifier
<|> literal
次のエラーが表示されます。
unexpected '|'
expecting "IDENTIFIER", "LITERAL", ''', '[', or white space
解析できないシーケンスに遭遇したときに、alternativeTerm パーサーが本番パーサーに戻らず、代わりにエラーをスローしていると思います。
これについて何ができますか?EBNF の ADT を変更するか、何らかの方法で解析を平坦化する必要があります。しかし、もう一度、どうすればそうできますか?