使用 FParsec 中的字符串列表进行解析

Parse using a list of strings in FParsec

我正在使用如下方式检查保留字:

let astr s = attempt (pstringCI s)
let reservedWord = astr "text" <|> astr "date" // etc.

是否可以创建一个执行相同检查但将保留字数组作为参数的解析器?类似于:

newReservedWordParser "something" ["text"; "date"; ...]

偶然发现了来自@bytebuster here 的答案,这可以像这样完成(但不确定我是否需要这个!):

let reservedWord (reservedWords: string list) = 
    (many1 letter |>> System.String.Concat) >>= 
    fun x -> 
        if List.contains x reservedWords then preturn x 
        else fail "not a reserved word"

LINQPad 分享here.

关于 >>= 的 FParsec 文档是 here

为什么不用choice?它需要一个 seq 作为参数。

你可以这样使用它:

let reservedWords = [
    "word1"
    "word2"
]

let parseReservedWord = reservedWords |> List.map pstringCI |> choice

我正在我的项目中做类似的事情here