是否存在在运行时生成AST /解析树的解析器?有点像接受一串EBNF语法或类似的东西并吐出数据结构的库?
现在我知道解析器组合器了。 (谢谢,Jonas)和一些图书馆(感谢eliben)
顺便说一下,我最近也注意到了Parsing Expression Grammars,听起来很酷的是有人实现它(他们说Perl 6会有它,但Perl会逃避我的理解)
答案 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)
是的,当然!
在所有动态语言中,实现起来非常简单,因为可以在运行时轻松生成和评估代码。我将推荐两种选择:
我个人推荐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中定义,编译和“评估”新定义的语言。
查看那里的链接以获取更多信息。