練習として、私はEBNF/ABNF文法をMegaparsecで解析しようとしています。私は端末やオプション機能のような簡単なものを持っていますが、私は選択肢に苦しんでいます。EBNFをMegaparsecネストされたsepByで解析する
S ::= 'hello' ['world'] IDENTIFIER LITERAL | 'test';
そして、このコード:この文法では
unexpected '|'
expecting "IDENTIFIER", "LITERAL", ''', '[', or white space
が、私はそれが発生したときにalternativeTermパーサが生産パーサーに戻っていないと思います。
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
私はこのエラーを取得しますそれを解析することはできず、代わりにエラーがスローされます。
私はこれについて何ができますか? EBNFの私のADTを変更するか、どうやら解析を平らにするべきですか?しかし、もう一度、どうすればいいのですか?
あなたは 'に'(alternativeTermを試してみてください) 'を使用する場合、それはあなたがそれをする方法を動作しますが生産 '?ちょうど推測です。バックトラックが必要なようです。 – Lazersmoke
解析は内部の 'sepBy1'をエスケープしないようです。それは| 「用語」として解釈され、失敗します。代わりに 'sepEndBy1'を使うのはどうですか? –
@Lazersmoke tryはうまくいきません – SuperManitu