作为练习,我尝试使用 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,或者我应该以某种方式使解析变平。但话又说回来,我该怎么做呢?