【发布时间】:2018-07-24 13:51:53
【问题描述】:
为了好玩,我正在使用 FParsec 编写一个小型 org-mode 解析器,但在将表格行解析为字符串列表时遇到了一些麻烦。我当前的代码如下所示:
let parseRowEntries :Parser<RowEntries, unit> =
let skipInitialPipe = skipChar '|'
let notaPipe = function
| '|' -> false
| _ -> true
let pipeSep = pchar '|'
skipInitialPipe >>. sepEndBy (many1Satisfy notaPipe) pipeSep
|>> RowEntries
这工作正常,直到您解析字符串 |blah\n|blah\n|blah|,这应该因为换行符而失败。不幸的是,在notaPipe 条件中简单地将\n 设置为false 会导致解析器在第一个'blah' 之后停止并说它已成功解析。我想要 manySatisfy 做的是解析(几乎)任何字符,在管道处停止,无法解析换行符(可能是 eof 字符)。
我尝试过使用charsTillString,但这也只是在第一个管道处停止解析,没有错误。
【问题讨论】:
-
所以规则是一行必须以管道字符开始和结束,对吧?即
|foo|\n|bar|\n有效,但|foo\n|bar\n无效,因为没有终止管道?在那种情况下,我认为您想要的是使用between组合器的东西。我会做一些测试,然后根据我的发现写一个答案。