动态(?)解析器

时间:2008-10-09 01:21:10

标签: parsing compiler-construction interpreter lex

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

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

现在我知道解析器组合器了。 (谢谢,Jonas)和一些图书馆(感谢eliben)

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

7 个答案:

答案 0 :(得分:5)

看看parser combinators,我认为可以帮到你。可以使用此技术在运行时创建解析器。一种流行的解析器组合器是Parsec,它使用Haskell作为宿主语言。来自parsec documentation

  

组合器解析器的编写语言与程序的其余部分使用相同的编程语言。语法形式主义(Yacc)与使用的实际编程语言(C)

之间没有差距      

解析器是该语言中的一流值。它们可以放入列表中,作为参数传递并作为值返回。通过针对特定问题定制的自定义解析器,可以轻松扩展可用的解析器集

如果您使用的是.NET,请查看parser combinator library for F#

答案 1 :(得分:4)

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

你可以强迫它做一个直接的lex然后解析阶段,但你可以用动态lexing和动态语法做一些有趣的事情。

头部扭曲的东西。

因为它全部是Java(你的Parser是一个POJO),你可以重构,做TDD,以及你习惯用Java做的任何事情。这是更传统的ANTLR / JavaCC / JJTree方法的主要优势。

答案 2 :(得分:3)

Lambda the Ultimate讨论了parser that allows syntax extensions

  

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

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

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

     

你能否告诉我下一步去哪儿方向?我还读到,Scheme或Haskell可能是更好的语言来完成这项任务。当然,我对任何有关实施它们的实际想法的建议持开放态度。

答案 3 :(得分:3)

是的,当然!

在所有动态语言中,实现起来非常简单,因为可以在运行时轻松生成和评估代码。我将推荐两种选择:

  • 在Perl中,使用Parse :: RecDescent。它从字符串中获取语法,你肯定可以要求它在运行时从一个新字符串生成一个新的解析器。
  • 在Python中,考虑PLY。您可以在运行时使用docstrings轻松生成函数,并在其上运行PLY。

我个人推荐Python选项,但如果你知道Perl而不是Python,它可能不相关。

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

祝你好运。

答案 4 :(得分:1)

JFlex,JLex Java扩展,允许你进行运行时编译,但它非常多毛。

答案 5 :(得分:1)

你打算解析什么?在C或C ++中,您将无法在运行时使用解析器,因此如果没有其他库,则无法使用它。对于许多编程语言而言,这是正确的。

实现它们时,所有解析器默认为“动态”。即使在C。

如果您要解析的语言是您自己的语言:编写解析器是一件值得学习的事情。即使使用解析器生成器,它本身也是一项工作。在你学会了它之后,它会变得非常简单。像缩进语法这样的特殊技巧仍然会很棘手,你需要进行大量的测试才能看到解析器能够达到你想要的效果。 I've written a parser so I know.

答案 6 :(得分: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