使用XML的EBNF实现XML转换器

时间:2009-09-04 19:30:10

标签: xml parsing yacc context-free-grammar qi

我正在考虑使用编译器生成器实现XML转换器的想法,该生成器基于W3C的XML 1.1规范,其中包含完整的EBNF语法。

更确切地说,我打算使用Qi-YACC,因为我想学习这个工具。这将是我第一次尝试使用任何编译器编译器。

我计划实现的第一种翻译非常简单:XML到S-EXPRs。之后,我计划推广我的翻译,但这不是我的问题。

您是否预计此类项目存在任何重大缺陷?我已经读过使用其EBNF翻译XML a bad idea。我想知道为什么。并且它不像Qi语言已经有了XML解析器,所以我绝对不想在这里重新发明轮子。

2 个答案:

答案 0 :(得分:3)

我现在不需要解析XML的原因。

但是QiYacc可以使用全局变量来利用上下文。它会更清洁 如果你可以在解析器中传递一个状态,例如或类似的东西。 这不是齐,但我打算为沉实现这样的功能。

所以可以做到。

/斯蒂芬

答案 1 :(得分:1)

我对QiYACC一无所知,但是将XML的EBNF转换为递归下降(RD)解析器或多或少是直截了当的。需要记住的是,有些地方对语法进行一些小的调整会对解析器产生很大的性能影响。这是因为语法写得简洁明了,而不是试图避免追逐规则。

我在C ++中做过类似的事情,将XML的语法写成一组类型。你可以在Code Project看到我写的一篇文章。相同的基本原则可以应用于任何语言。

我还建议你看看PEG语法。它们通过允许您引入零宽度断言来扩展EBNF,并且是扩展解析器的EBNF语法的好方法。