2

演習として、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 を変更するか、何らかの方法で解析を平坦化する必要があります。しかし、もう一度、どうすればそうできますか?

4

1 に答える 1