如何使用 W3C EBNF-Notation 并生成解析器生成器?

How to consume W3C EBNF-Notation and produce a parser generator?

在整个 RDF 规范中,EBNF-NOTATION XML 规范用于指定文档的语法。所以我想知道如何使用 Antlr/bison/yacc(也许这些工具中有一些我不知道如何搜索的标志)——或其他我还不知道的工具——来使用这些规范并生成解析器供我在尝试加载之前查看我的 RDF 是否格式正确。

我的特定用例的示例语法是: https://www.w3.org/TR/n-quads/#sec-grammar

我已经将此语法转换为 Antlr4 语法并使用该工具创建了一个解析器,并尝试只编写我自己的递归下降解析器,但这很耗时,如果必须的话,我宁愿不重复练习再做一次。

真的没有任何代码,这只是一个信息请求。

我想做的基本上是 copy/paste 这个 XML EBNF-NOTATION 中指定的语法,并生成一个类似于 Antlr 提供的解析器生成器。

使用工具将 EBNF 转换 为您选择的解析器生成器规范的解析器生成器规范可能更容易。

要做到这一点,您需要一个可以教您阅读 EBNF 的工具;实际上,您可能可以通过写下 EBNF 的语法来教大多数解析器生成器。

该工具还必须构建某种表示 EBNF 的语法树,您可以通过 over/transform 找到目标 EBNF。这是经典的代码生成...伴随着您必须指定树的形状、构建它,然后编写生成目标 BNF 所需的所有临时树遍历的常见问题。

您可以将所有这些机器打包成一个包作为程序转换系统 (PTS)。 PTS 通常包括解析器生成、树构建和 pattern-directed 代码转换。然后就可以专心写EBNF文法,写source-to-source翻译规则

我们的DMS Software Reengineering Toolkit可以用于此。我们对 DMS 做了类似的事情:即阅读 XML DTD 描述并在 Java.

中综合了高性能 XML 阅读器

REx Parser Generator works from grammars in W3C-style EBNF, and Railroad Diagram Generator可以直接从W3C文档中提取语法。

以下是如何从示例语法创建工作解析器(在 Java 中 - 也支持其他一些目标语言):

  • 浏览至 Railroad Diagram Generator
  • Get Grammar 选项卡上,输入示例 URL https://www.w3.org/TR/n-quads
  • 继续 Edit Grammar
  • 在语法末尾添加空格规则: WHITESPACE ::= [ #x9]+ /* ws: definition */
  • 将语法保存到本地文件n-quads.ebnf
  • 浏览至 REx Parser Generator
  • 使用输入文件n-quads.ebnf和命令行-java -tree -main
  • 保存生成的解析器n_quads.java并编译它
  • 运行 示例文件上的解析器:java n_quads -i a-sample-file

完全披露:我是 REx Parser Generator 的创建者和维护者。