Haskell Parsec和无序属性

Rob*_*oli 6 icalendar haskell properties parsec parser-generator

我试图使用Parsec来解析这样的事情:

property :: CharParser SomeObject
property = do
    name
    parameters
    value
    return SomeObjectInstance { fill in records here }
Run Code Online (Sandbox Code Playgroud)

我正在实现iCalendar规范,并且每个类似都有一个名称:parameters:value triplet,非常类似于XML具有名称的方式:attributes:content triplet.事实上,您可以非常轻松地将iCalendar转换为XML格式(我不能真正看到它的优点).

我的观点是,参数根本不必按任何顺序排列,每个参数可能有不同的类型.一个参数可以是字符串,而另一个参数是另一个元素的数字id.它们可能没有任何相似性,最后,我想将它们正确地放在正确的记录字段中,以便我希望解析器返回的"SomeObjectInstance".我如何去做这类事情(或者你能指出一个例子,有人必须解析这样的数据)?

谢谢,我知道我的问题可能有点困惑,但这反映了我对我需要做的事情的理解程度.

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

开始:VCALENDAR
版本:2.0
PRODID: - // hacksw/handcal // NONSGML v1.0 // EN开始
:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER; CN = John Doe:MAILTO:john.doe@example .com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
摘要:巴士底日派对
END:VEVENT
END:VCALENDAR

正如您所看到的,它在VCalendar中包含一个VEvent,我在这里创建了代表它们的数据结构.

我正在尝试编写一个解析器来解析这种类型的文件到我的数据结构中,我被困在我需要处理任何类型的任何顺序的属性的位置; date,time,int,string,uid等.我希望在不重复整个iCalendar规范的情况下更有意义.

Ste*_*ley 6

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

不幸的是,Perm模块大多没有记录.最好的参考是Haddock doc页面引用的Parsing Permutation Phrases文章,但即便如此,这主要是对技术的描述而不是如何使用它.

  • 对于其他正在寻找此类问题解决方案的人,罗伯特确实写了一篇关于该主题的博客文章:http://robertmassaioli.wordpress.com/2010/09/15/unordered-parsing-in-parsec/ 不幸的是,博客软件似乎正在剔除某些字符。我已经添加了缺失的部分并将其发布在这里:http://hpaste.org/46655/simple_example_of_parsec_perm 感谢罗伯特编写了一个简单的示例。 (2认同)