【发布时间】:2020-05-04 16:46:26
【问题描述】:
我正在尝试解析资产类型列表,其中每种资产类型都可能具有名称。列表完成后,我想继续解析资产类型的属性列表,所有资产类型的列表。
我试图解析的字符串如下所示:
converter named a023, signaltower, powerunit named 23 attributes power, temperature
解析器签名看起来像
Parser<((Asset * AssetName option) list * Attribute liste),unit>
我分别解析了资产名称和属性,当我将两者结合并完成列表时出现问题,然后在属性字符串上失败,声明Expecting: 'named'。
在我看来,它似乎正在尝试在属性字符串上失败的 opt 资产名称解析器,但我不确定如何忽略它并在列表“完成”时继续前进(毕竟资产名称部分是可选的)..
type AssetName = AssetName of string
let named = str "named" >>. spaces1 >>. word
let assetName = spaces1 >>. (named |>> AssetName)
type Asset = | Converter | Signaltower | Powerunit
let assetType = ["converter"; "signaltower"; "powerunit";] |> Seq.map pstring |> choice
let findAsset = function
| "converter" -> Converter
| "signaltower" -> Signaltower
| "powerunit" -> Powerunit
| _ -> raise <| Exception "Invalid asset type"
let asset = (assetType |>> findAsset) .>>. opt assetName
type Attribute = Attribute of string
let attribute = word |>> Attribute
let attributes = spaces1 >>. str "attributes" >>. spaces1 >>. sepBy attribute commaMaybeSpace
let p = sepBy asset (pchar ',' >>. spaces) .>>. attributes
let r input = run p3 input
r "converter named a023, signaltower, powerunit named 23 attributes power, temperature"
【问题讨论】:
-
可能是最后一行字符串中的错字吗?它缺少
c,因为它以onverter而不是converter开头。我不知道这是否有帮助:) -
不幸的是我的复制/粘贴中的一个错字。解析没有属性的资产类型和名称按预期工作。
-
那么您需要专家的帮助:)