- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每个 megaparsec 文档,"Since version 8, reporting multiple parse errors at once has become much easier."我一直无法找到一个这样做的例子。我找到的唯一一个是 this .然而,它只显示了如何解析换行符分隔的玩具语言,也没有显示如何 combine multiple errors进入 ParseErrorBundle。此 SO discussion不是决定性的。
最佳答案
您要使用 withRecovery
与 registerParseError
一起从 Megaparsec 生成的错误中恢复(或 registerFailure
或 registerFancyFailure
)“注册”这些错误(或您自己生成的错误)以进行延迟处理。
解析结束时,如果没有注册解析错误,则解析成功,如果注册了一个或多个解析错误,则将它们全部打印出来。如果您注册解析错误,然后还触发了未恢复的错误,解析将立即终止,并且将打印所有已注册的错误和最终未恢复的错误。
这是一个非常简单的示例,用于解析以逗号分隔的数字列表:
import Data.Void
import Text.Megaparsec
import Text.Megaparsec.Char
type Parser = Parsec Void String
numbers :: Parser [Int]
numbers = sepBy number comma <* eof
where number = read <$> some digitChar
comma = recover $ char ','
-- recover to next comma
recover = withRecovery $ \e -> do
registerParseError e
some (anySingleBut ',')
char ','
> parseTest numbers "1,2,3,4,5"
[1,2,3,4,5]
> parseTest numbers "1.2,3e5,4,5x"
1:2:
|
1 | 1.2,3e5,4,5x
| ^
unexpected '.'
expecting ','
1:6:
|
1 | 1.2,3e5,4,5x
| ^
unexpected 'e'
expecting ','
1:12:
|
1 | 1.2,3e5,4,5x
| ^
unexpected 'x'
expecting ',', digit, or end of input
> parseTest numbers "1,2,e,4,5x"
1:5:
|
1 | 1,2,e,4,5x
| ^
unexpected 'e'
expecting digit
sepBy
成功申请
number
和
comma
解析器以交替顺序解析
"1,2,"
.当它到达
e
,它适用于
number
失败的解析器(因为
some digitChar
需要至少一位字符)。这是一个无法恢复的错误,所以解析立即结束,没有记录其他错误,所以只打印一个错误。
<* eof
来自
numbers
的定义(例如,使其成为更大解析器的一部分),您会发现:
> parseTest numbers "1,2,3.4,5"
> parseTest numbers "1,2,3.4"
> parseTest numbers "1,2,3.4\n hundreds of lines without commas\nfinal line, with comma"
comma
解析器由
sepBy
使用以确定逗号分隔的数字列表何时结束。如果解析器成功(它可以通过恢复来完成,吞噬数百行到下一个逗号),
sepBy
会尝试继续运行;如果解析器失败(最初是因为恢复代码在扫描整个文件后找不到逗号),
sepBy
将完成。
关于parsing - 如何使用megaparsec报告多个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59640023/
我正在使用 Megaparsec 开发一个小型解析器并尝试解析算术。 -- Arithmetic expressions data Aexp = N Num | V Var
我正在尝试使用 lamdba 表达式解析一种简单的语言。但是runParser expr "lamdbda(x) (return x)返回Right (Var "lamdba")而不是Right (L
我在使用 Megaparsec 6 的 makeExprParser 时遇到问题 helper 。我似乎无法弄清楚如何绑定(bind)两个二进制 ^和一元 -在我期望的优先级。 使用这个makeExp
我想使用 Megaparsec 解析一种基本的缩进语言。最初我使用的是 Parsec,我设法通过缩进正常工作,但现在我遇到了一些麻烦。 我一直在关注一个教程here这是我必须解析一种忽略缩进的语言的代
我遇到了以下解析问题: 解析一些可能包含来自有限字符集的零个或多个元素的文本字符串,最多但不包括一组终止字符中的一个。应通过Maybe 指示内容/无内容。终止字符可能以转义形式出现在字符串中。任何不允
考虑这个正则表达式: ^foo/[^=]+/baz=(.*),[^,]*$ 如果我在 foo/bar/baz=one,two 上运行它,它会匹配并且子组捕获 one。如果我在 foo/bar/baz/
我有一个解析器定义为以下稍微复杂的版本: data X = X { getX :: State ([Int], [X]) Bool } type Parser = ParsecT Void Strin
我正在尝试为正在解析的某些源文件生成源映射,并且我想获取每个节点的范围。 getSourcePos只给出 start position一个节点(src:line:column)。如何获得它的结束位置?
我想使用 Megaparsec 在 Haskell 中解析与此类似的文本。 # START SKIP def foo(a,b): c = 2*a # Foo return a + b
使用 Megaparsec 5。 关注 this guide ,我可以通过结合 StateT 来实现回溯用户状态和 ParsecT (未定义的类型应该是明显的/不相关的): type MyParser
我在关注 Megaparsec documentation解析多维数组。 opSubscript = Postfix $ foldr1 (.) some singleIndex singleInde
所以我正在尝试做标准的“为类似方案的语言编写一个解析器”练习来找出 MegaParsec 和 monad 转换器。根据许多教程和博客文章的建议,我使用 ReaderT 和 local 来实现词法作用域
如果我有一个像这样的解析器: notZeroOrOne :: Parser Char notZeroOrOne = noneOf ['0' , '1'] 有没有一种方法可以组合另一个解析器(例如dig
我已经完成了this Megaparsec tutorial现在我正在尝试基于此编写我自己的解析器。我想为编写的汇编语言编写一个简单的解析器: Label: lda $0ffe sta
我是一名优秀的程序员,十分优秀!