gpt4 book ai didi

haskell - 使用 Parsec 解析配置

转载 作者:行者123 更新时间:2023-12-02 07:09:26 24 4
gpt4 key购买 nike

这里我想到的一个可能的配置是一个规范树,每个规范都有一个相应的关键字(字符串)和类型。像这样的事情:

data Select = And | Or
data ConfigTree = Node Select [ConfigTree] | Leaf (String, *)

考虑到没有“类型的类型”,我不确定如何正确编写它,但暂时不用担心。

现在,给定这样一棵树,我想构建一个可以读取可能的有效配置的解析器;我假设我已经有可以解析关键字/类型对的子解析器。

例如,可能的配置树是:

Node And [ Leaf ("width", Double)
, Node Or [ Leaf ("height", Double) , Leaf ("aspectratio", Double)
]

可以指定矩形的大小。一个可能的配置文件是:

aspectratio = 2
width = 10

(假设配置文件只是换行符分隔对的列表,keyword = blah,其中 blah 是该关键字的相应解析器可以处理的内容;但它们可以采用任何顺序,并且只需匹配树的一个可能的“有效子集”,其中有效子集是包含顶部节点的任何子集,该子集包含它所包含的“和”节点的所有子节点,并且确切地说它是“或”节点的一个子节点包含。)

我不知道如何开始构建这样的解析器。任何人都可以提供一些有关如何继续的提示,或者一种将上述 ConfigTree 数据类型完全重构为更易于解析的数据的方法吗?

最佳答案

为此构建解析器的问题是您的输入格式与您的数据类型根本不匹配。输入格式是简单、易于解析的键值对列表,而数据类型是树。例如。要确定 And 节点中的所有子树是否有效,您必须知道完整的输入。

因此,不要直接在解析器中验证键值对列表,而是稍后再验证。

我整理了一个小例子来说明我的意思:

data Type = TDouble | TString 
data Select = And | Or
data ConfigTree = Node Select [ConfigTree] | Leaf (String, Type)

-- matches a list of key-value pairs against a tree
match :: [(String, String)] -> ConfigTree -> Bool
match sts (Leaf (s, t)) = case filter ((== s) . fst) sts of
-- we don't want multiple occurences of a key
[(_, v)] -> if valid v t then True else False
_ -> False
match sts (Node And cfgs) = and . map (match sts) $ cfgs
-- not completely what you described, because it will match 1 or more
match sts (Node Or cfgs) = or . map (match sts) $ cfgs

-- validates a string against a type
valid :: String -> Type -> Bool
valid s TDouble = case reads s :: [(Double, String)] of
[(_, "")] -> True
_ -> False
valid _ TString = True

-- this is what you actually parsed
config = [ ("aspectratio", "2")
, ("width", "123")
, ("name", "Sam")
]

-- the example tree
cfgTree = Node And [ Leaf ("width", TDouble)
, Node Or [ Leaf ("height", TDouble), Leaf ("aspectratio", TDouble)]
]

我不认为这是一个特别有用的示例,因为它所做的只是检查您的配置数据是否有效,它不会提取它们,但我希望它能证明我的意思。

关于haskell - 使用 Parsec 解析配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com