7

是否存在在运行时生成 AST/解析树的解析器?有点像一个库,可以接受一串 EBNF 语法或类似的东西并吐出一个数据结构?

  • 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。(喜欢跳过编译步骤)
  • 我知道 Boost::Spirit,它使用一些带有 C++ 语法的黑魔法在执行时生成这样的东西(肯定更接近我想要的,但在 C++ 方面我是个无赖。而且它仍然有点限制,因为你的语法是硬编码的)
  • 我不知道 python 或 ruby​​ 中的任何内容,尽管编译器编译器在这种语言中可能非常有效......

现在我知道解析器组合器了。(谢谢,乔纳斯)还有一些图书馆(谢谢 eliben)

顺便说一句,我最近还注意到Parsing Expression Grammars,如果有人实现它听起来很酷(他们说 Perl 6 会有它,但 Perl 回避了我的理解)

4

7 回答 7

5

看看我认为可能对你有帮助的解析器组合器。可以使用这种技术在运行时制作解析器。一种流行的解析器组合器是Parsec,它使用Haskell作为其宿主语言。从parsec 文档中:

组合解析器是在与程序其余部分相同的编程语言中编写和使用的。语法形式主义 (Yacc) 和实际使用的编程语言 (C) 之间没有差距

解析器是语言中的一流值。它们可以放入列表中,作为参数传递并作为值返回。使用针对特定问题的定制解析器很容易扩展可用的解析器集

如果您使用的是 .NET,请查看F# 的解析器组合库

于 2008-10-14T12:58:52.263 回答
4

如果 Java 更适合您,可以使用 Haskell Parsec 库的一个端口 - JParsec。非常强大,虽然文档不是很好。

您可以强制它执行直接的 lex 然后解析阶段,但您可以使用动态词法分析和动态语法做一些有趣的事情。

扭头的东西。

因为这一切都在 Java 中(您的 Parser 是 POJO),所以您可以重构和执行 TDD,以及您习惯在 Java 中执行的任何操作。这是更传统的 ANTLR/JavaCC/JJTree 方法的主要优势。

于 2008-12-02T17:01:19.383 回答
3

Lambda the Ultimate 讨论了一个允许语法扩展的解析器

我计划编写一个允许语法扩展(某种编译时元编程)的编译器。我不想拥有一个非常强大的系统,所以我考虑过:

{syntax: while (condition) do code}
while (condition, code) => // actual execution

并用对函数的调用替换与语法匹配的每个模式。但是,我不知道从哪里开始运行词法分析器和解析器,因为通常的工具,如 Flex/Bison 或 ANTLR(我想用 C# 编写编译器)似乎不允许这样做。

你能告诉我下一步该去哪里吗?我还读过 Scheme 或 Haskell 可能是更好的语言来完成这项任务。当然,我愿意接受有关实施它们的实际想法的任何建议。

于 2008-10-09T02:02:47.860 回答
3

是的当然 !

在所有动态语言中,这很容易实现,因为可以在运行时轻松生成和评估代码。我将推荐两种选择:

  • 在 Perl 中,使用 Parse::RecDescent。它从字符串中获取语法,您绝对可以要求它在运行时从新字符串生成新的解析器。
  • 在 Python 中,考虑 PLY。您可以在运行时轻松生成带有文档字符串的函数并在其上运行 PLY。

我个人推荐使用 Python 选项,尽管如果您了解 Perl 但不了解 Python,它可能无关紧要。

为了完整起见,我必须注意,您也可以使用 Lex 和 Yacc 来完成,但它很麻烦。您必须在运行时从您的语法生成 Lex / Yacc 文件,编译成 C,将其编译成共享库并在运行时加载它。这听起来像科幻小说,但有些工具实际上是为了满足效率和动态性的复杂需求而这样做的。

祝你好运。

于 2008-10-09T06:03:31.990 回答
1

JFlex是 JLex Java 扩展,可让您进行运行时编译,但它非常麻烦。

于 2008-10-09T14:00:08.970 回答
1

你要解析什么?在 C 或 C++ 中,您不会在运行时拥有解析器,因此如果没有额外的库,它就无法使用。但对于许多编程语言来说,这是真的。

默认情况下,所有解析器在您实现它们时都是“动态的”。即使在 C.

如果您要解析的语言是您自己的:编写解析器是一门自学的事情。即使使用解析器生成器,它本身也是一项工作。不过在你学会它之后,它会变得非常简单。不过,像缩进语法这样的特殊技巧仍然很棘手,您将需要进行良好而广泛的测试,以查看解析器是否符合您的要求。我写了一个解析器,所以我知道。

于 2008-10-14T14:18:41.463 回答
1

[Dropincc.java] http://pfmiles.github.com/blog/dropincc-dot-java-the-ultimate-tool-to-create-dsls-in-java/ "Dropincc.java 是纯java中的动态解析器​​生成器”。

这使您可以在 java 编程语言中定义语法规则,并且无需学习其他符号。无需使用其他命令行工具。您可以在纯 java 中定义、编译和“评估”您新定义的语言。

查看那里的链接以获取更多信息。

[项目主页] https://github.com/pfmiles/dropincc.java

于 2012-08-04T13:02:28.520 回答