使用 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
我正在使用如下方式检查保留字:
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