Skip to main content
 首页 » 编程设计

python之从 XML DTD 生成 lex 匹配规则和 yacc 语法规则

2025年05月04日12飞鱼

概览

虽然这个问题涉及用 C 编写的 lex/yacc,但它从根本上围绕着 python 编程。

我有几个非常相似的 DTD,用于解析文档。程序的该部分是用 C 语言编写的,只是不需要为此目的调用完整的 SAX 处理程序(viz.,libxml2)。由于 DTD(因此 XML 文件)具有静态格式,我认为这个问题最好用 lex 和 yacc 来解决。

虽然为任何 XML 文档编写完整的词法解析器过于复杂,但为 XML 文档的特定子集编写一个完整的词法解析器是完全可管理的。 DTD 可用于生成词法分析器(标记输入)以及 YACC 中的解析器生成器。

我愿意做出两个假设:

  1. XML 文档相对于 REC-xml-19980210 格式正确
  2. XML 文档相对于其 DTD 是有效的

因此,如果 XML 文档不满足上述任何条件,则词法分析器/解析器应该对该特定文件失败。

问题

我的最终目标是编写成功的 python 脚本:(1) 解析 DTD;和 (2) 生成 lex/yacc 文件。在开始之前,我有几个问题:

  1. 这个问题已经解决了吗?
    • 如果是,是否有我应该考虑查看的库?
    • 如果不是,是因为没有使用我提到的工具的解决方案吗?
  2. 是否有比使用静态解析器更好的(按性能衡量)从 XML 文件中提取非标记“内容”的方法?

我意识到我可以使用 PLY解析 DTD,但因为我对生成 lex/yacc 文件以包含在 C 程序中感兴趣,所以该选项将不起作用。因此,我想我可能会使用 xml.parsers.expat解析 DTD。这允许我注册跟踪元素名称的回调,它们在树中的位置,是否需要它们,等。这应该为我提供足够的信息来生成 lex/yacc 文件,但我想看看你们有什么建议。

请您参考如下方法:

使用 XML Lexer 的组合, yacc grammar , 和 YAXX生成相应文件的扩展名。