简单的 FParsec 列表示例
Simple FParsec list example
我刚刚开始使用 FParsec,无法理解简单的列表解析器。
给定输入
"{
a;b;c
d;
}"
我要得到结果['a';'b';'c';'d']
如果我这样做
let baseChars = ['0'..'9'] @ ['A'..'Z'] @ ['a'..'z'] @ ['_'; '-']
let chars : Parser<_> = anyOf baseChars
let nameChars : Parser<_> = anyOf (baseChars @ ['.'])
let semiColonList p : Parser<_> = sepBy p (pstring ";")
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
do """{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"
我在最后一个 } 上失败了,因为它试图在关闭 between 解析器之前在 nameChars 解析器上匹配它。
这感觉就像我缺少一个简单的解决方案,特别是因为如果我删除 d 之后的最后一个分号,所有工作都会按预期进行。
任何帮助表示赞赏。
[编辑]
感谢 Fyodor Soikin 的以下工作:
let semiColonList p = many (p .>> (pstring ";" >>. spaces))
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
"""{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"
sepBy
不允许尾随分隔符。像 sepBy a b
这样的解析器是用来解析像 a b a b a
这样的输入的,但是你的输入像 a b a b a b
- 最后有一个额外的分隔符 b
。
您要做的是解析多个类似于 a b
的表达式 - 这将为您提供所需的输入形状。
为了解析一个这样的表达式,使用排序运算符 .>>
,为了解析多个这样的对,使用 many
:
semiColonList p = many (p .>> pstring ";")
我刚刚开始使用 FParsec,无法理解简单的列表解析器。 给定输入
"{
a;b;c
d;
}"
我要得到结果['a';'b';'c';'d']
如果我这样做
let baseChars = ['0'..'9'] @ ['A'..'Z'] @ ['a'..'z'] @ ['_'; '-']
let chars : Parser<_> = anyOf baseChars
let nameChars : Parser<_> = anyOf (baseChars @ ['.'])
let semiColonList p : Parser<_> = sepBy p (pstring ";")
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
do """{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"
我在最后一个 } 上失败了,因为它试图在关闭 between 解析器之前在 nameChars 解析器上匹配它。 这感觉就像我缺少一个简单的解决方案,特别是因为如果我删除 d 之后的最后一个分号,所有工作都会按预期进行。 任何帮助表示赞赏。
[编辑] 感谢 Fyodor Soikin 的以下工作:
let semiColonList p = many (p .>> (pstring ";" >>. spaces))
let pList p : Parser<_> = between (pstring "{") (pstring "}") (semiColonList p)
"""{
a;b;c;
d;
}"""
|> run (parse {
let! data = pList (spaces >>. many1Chars nameChars)
return data
})
|> printfn "%A"
sepBy
不允许尾随分隔符。像 sepBy a b
这样的解析器是用来解析像 a b a b a
这样的输入的,但是你的输入像 a b a b a b
- 最后有一个额外的分隔符 b
。
您要做的是解析多个类似于 a b
的表达式 - 这将为您提供所需的输入形状。
为了解析一个这样的表达式,使用排序运算符 .>>
,为了解析多个这样的对,使用 many
:
semiColonList p = many (p .>> pstring ";")