我正在尝试使用Parsec来解析这样的内容:

property :: CharParser SomeObject
property = do
    name
    parameters
    value
    return SomeObjectInstance { fill in records here }

我正在实现iCalendar规范,每一个上都有一个name:parameters:value三元组,非常类似于XML具有name:attributes:content三元组的方式。实际上you could very easily convert an iCalendar into XML format(认为我看不到优点)。

我的观点是,参数根本不必按任何顺序排列,每个参数可以具有不同的类型。一个参数可以是字符串,而另一个则是另一个元素的数字ID。它们可能没有相似之处,最后,我想将它们正确放置在正确的记录字段中,以获取解析器要返回的任何“SomeObjectInstance”。我该如何做这种事情(或者您可以指出一个有人必须解析此类数据的示例)?

谢谢,我知道我的问题可能有点困惑,但这反射(reflect)了我对我需要做的事情的理解水平。

编辑:我试图避免给出预期的输出(因为它很大,而不是因为它是隐藏的),但这是输入文件的示例(来自维基百科):



如您所见,它在一个VCalendar中包含一个VEvent,我制作了data structures that represent them here

我正在尝试编写一个解析器,将这种类型的文件解析为我的数据结构,而我被困在处理任何类型的属性以任何顺序出现的位置上。日期,时间,整数,字符串,uid等。我希望在不重复整个iCalendar规范的情况下更有意义。

最佳答案

Parsec具有Parsec.Perm模块,可以精确地解析无序但线性的元素(即语法树中处于同一级别),例如XML文件中的属性标签。

不幸的是,Perm模块几乎没有文档。最好的引用是Haddock doc页面所引用的Parsing Permutation Phrases(解析排列短语)论文,但是即使如此,它在很大程度上也只是对该技术的描述,而不是如何使用它。

10-07 23:36