【发布时间】:2017-05-23 11:39:23
【问题描述】:
作为练习,我尝试使用 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,或者我应该以某种方式使解析变平。但话说回来,我该怎么做呢?
【问题讨论】:
-
如果您在
production中使用(try alternativeTerm),它会按照您的意愿工作吗?只是猜测,因为您似乎需要回溯。 -
似乎解析没有逃脱内部
sepBy1。它试图解析 |作为term并失败。改用sepEndBy1怎么样? -
@Lazersmoke 尝试不起作用
-
@PhilippKiener 我应该替换哪个 sepBy?
-
alternativeTerm中的那个。但是,这仅在最后一个术语和 | 之间有保证的空格时才有效。
标签: parsing haskell ebnf megaparsec