在这里,我记住可能的配置是规范树,每个规范都有一个相应的关键字(字符串)和类型。事情是这样的:使用Parsec解析配置
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
(让我们假设一个配置文件只是一个分隔换行符的名单对,关键字=等等,其中胡说的东西该关键字可以处理相应的解析器;但它们可以以任何顺序排列,只需与树的一个可能“有效子集”匹配,其中有效子集是包含顶级节点的任何子集,其中包含它所包含的“and”节点的所有子节点,并确切地说,它包含一个“或”节点的一个孩子。)
我不知道如何开始构建这样的解析器。任何人都可以提供一些关于如何继续的技巧,或者将上述ConfigTree数据类型完全重构为更适合解析的方法?
非常感谢。我刚刚完成了使用这个答案来完成将输入变为填充配置树的内容,如果生成的树无效,则会发出错误。我还没有将错误信息尽可能地提供给帮助(这是我考虑使用Parsec的原因之一),但现在看起来工作正常。谢谢! – 2012-02-05 03:56:51
好的,我现在唯一真正的问题是:除了列出所有可能发挥作用的类型之外,是否有一种正确处理类型的好方法? (我意识到这不是真正的问题,对不起。) – 2012-02-05 08:26:30
也许'Data.Dynamic'是你在找什么?但我不认为列出所有类型是一个坏主意。会有多少种不同的类型?也许3 - 诠释,双和字符串?顺便说一句:你看看Hackage上的软件包是否适合你的需求? – bzn 2012-02-05 09:11:00