我正在使用类似这样的命令检查保留字:
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。