为了在后续步骤中创建更好的错误消息,我希望保存解析器成功的位置和文本。获取位置似乎很容易(因为有
假设我有这个类型来保存位置信息:
我想创建一个函数,将
getPosition
解析器),但我不知道如何访问文本。假设我有这个类型来保存位置信息:
type SourceLocation = {
from: Position
to: Position
text: string
}
我想创建一个函数,将
SourceLocation
添加到另一个解析器的结果中:let trackLocation (parser: Parser<'A, 'B>): Parser<SourceLocation * 'A, 'B> =
let mkLocation ((start: Position, data: 'A), stop: Position: 'Positon) =
let location = { from = start; to = stop } // how do I get the text?
in (location, data)
getPosition .>>. parser .>>. getPositon |>> mkLocation
由于解析器只是接受 CharStream
的函数,我认为可以使用流和我的位置中的 Index
一起获取文本,但我没有看到获取此文本的方法。
那么获取解析器成功的文本的正确方法是什么?
inputText
的字符串变量中,则只需要使用inputText.[start.Index .. stop.Index]
,然后您就可以得到匹配的文本。请注意,FParsec的Position.Index
属性是int64,因此如果您的输入小于2^32字节,则可能需要转换为int
。 - rmunninputText.[start.Index .. stop.Index - 1]
:我没有尝试过getPosition
,也不知道你是否有闭区间或半开区间。在盲目应用我的建议之前,请检查防护栏错误。 - rmunnsepBy
解析器返回一个Parser<'a list, 'u>
,而您不必处理原始文本。但我认为CharStream.BacktrackTo
方法可能是您所需的。给我一点时间,我会写出一个可能的方法。 - rmunnskipped
和withSkippedString
组合子:http://www.quanttec.com/fparsec/reference/parser-overview.html#parsing-strings-with-the-help-of-other-parsers - Stephan Tolksdorf