f# - 简单的 FParsec 列表示例
问题描述
我刚刚开始使用 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 ";")
推荐阅读
- mongodb - 我如何在 NESTJS 中设置多租户
- javascript - 为什么在两次请求后我的数组未定义?(使用 chart.js 和 stock.js)
- assembly - 这个 8051 ASM 功能是否像我想的那样复杂,还是我遗漏了什么?
- python - jupyter中的散景图被挤压
- javascript - JavaScript如何连接两个空值或未定义并返回空值
- php - 如何构建一个将日期的总和显示为一个的循环
- android - 为列表视图中的项目设置项目单击侦听器并转到新活动
- arduino - 为什么无论输入如何,adc 总是读取 1023
- python - 使用pynacl用一个文件加密,用第二个文件解密
- c# - 如何构建 RDKits C# Wrappers — Visual Studio 2019 x64