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

时间:2019-09-03 07:51:52

标签: fparsec

我正在使用类似这样的命令检查保留字:

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

是否可以创建一个解析器执行相同的检查,但是它将保留字的数组作为参数?像这样:

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

2 个答案:

答案 0 :(得分:1)

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

您可以像这样使用它:

let reservedWords = [
    "word1"
    "word2"
]

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

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

答案 1 :(得分:0)

偶然发现@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