FParsec - 如何转义分隔符

FParsec - how to escape a separator

我正在研究 EDI 文件解析器,但我在为 'segment terminator' 实现转义时遇到了相当大的困难。对于有幸不使用 EDI 的人来说,段终止符(通常是撇号)是 之间的分隔符,它们就像单元格。

所需的行为如下所示:

ABC+123'DEF+567'  -> ["ABC+123", "DEF+567"]
ABC+123?'DEF+567' -> ["ABC+123?'DEF+567"]

使用 FParsec,不转义撇号(并且,为简单起见,忽略参数化),解析器看起来像这样:

let pSegment = //logic to parse the contents of a segment
let pAllSegments = sepEndBy pSegment (str "'")

上述示例的这种方法将产生 ["ABC+123?", "DEF+567"]

我的下一个考虑是使用正则表达式:

let pAllSegments = sepEndBy pSegment (regex @"[^\?]'")

这里的问题是撇号之前的字符也被消耗,导致消息不完整。

我很确定我对 FParsec 的理解还不够深入。有人有什么指点吗?

问题出在解析内容步骤。

解析器正在工作 'bottom up'。查找不允许包含终止符的段的内容,然后发现所有这些段都由终止符分隔,并构造列表。

我的错误是在 pSegment 步骤中,它使用了 (?:[A-Za-z0-9 \.]|\?[\?\+:\?])* 的参数化版本。看到第二个 ? 了吗?那应该是 '