我正在尝试使用 FParsec 解析一个文件,该文件由 float 或 int 值组成。我面临着两个我找不到好的解决方案的问题。
1
两者pint32
和pfloat
都会成功解析同一个字符串,但给出不同的答案,例如解析字符串时pint32
返回,解析同一个字符串时返回。是否可以尝试使用解析浮点值并在字符串为时失败?3
"3.0"
pfloat
3.0
pint32
"3.0"
换句话说,有没有办法使以下代码工作:
let parseFloatOrInt lines =
let rec loop intvalues floatvalues lines =
match lines with
| [] -> floatvalues, intvalues
| line::rest ->
match run floatWs line with
| Success (r, _, _) -> loop intvalues (r::floatvalues) rest
| Failure _ ->
match run intWs line with
| Success (r, _, _) -> loop (r::intvalues) floatvalues rest
| Failure _ -> loop intvalues floatvalues rest
loop [] [] lines
这段代码会正确地将所有浮点值放入floatvalues
列表中,但由于解析字符串时pfloat
返回,所有整数值也会放入列表中。"3.0"
"3"
floatvalues
2
上面的代码示例对我来说似乎有点笨拙,所以我猜一定有更好的方法来做到这一点。我考虑使用组合它们choice
,但是两个解析器必须返回相同的类型才能工作。我想我可以使用一个选项用于浮点数和一个选项用于 int 来创建一个有区别的联合,pint32
并pfloat
使用|>>
运算符转换输出。但是,我想知道是否有更好的解决方案?