Parsing 动态(?)分析器

Parsing 动态(?)分析器,parsing,compiler-construction,interpreter,lex,Parsing,Compiler Construction,Interpreter,Lex,是否存在在运行时生成AST/解析树的解析器?有点像一个库,它会接受一个EBNF语法字符串或类似的东西,然后吐出一个数据结构 我知道antlr、jlex和他们的同类产品。他们生成可以实现这一点的源代码。(希望跳过编译步骤) 我知道Booo::精神,它使用一些C++语言的黑魔法来在执行时生成这些东西(当然,我更接近我想要的东西,但是我在C++时是个大傻瓜,而且它仍然有点限制,因为你的语法是硬编码的) 我不知道python或ruby中的任何东西,尽管编译器在这种语言中可能非常有效 现在我知道了解析

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

  • 我知道antlr、jlex和他们的同类产品。他们生成可以实现这一点的源代码。(希望跳过编译步骤)
  • 我知道Booo::精神,它使用一些C++语言的黑魔法来在执行时生成这些东西(当然,我更接近我想要的东西,但是我在C++时是个大傻瓜,而且它仍然有点限制,因为你的语法是硬编码的)
  • 我不知道python或ruby中的任何东西,尽管编译器在这种语言中可能非常有效
现在我知道了解析器组合器。(谢谢,乔纳斯)和一些图书馆(谢谢伊莱本)
顺便说一句,我最近也注意到,有人实现它听起来很酷(他们说Perl 6将拥有它,但Perl回避了我的理解)

Lambda最终讨论了一个

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

{syntax: while (condition) do code}
while (condition, code) => // actual execution
并用对函数的调用替换与语法匹配的每个模式。 但是,我不知道从哪里开始运行lexer和解析器,因为像Flex/Bison或ANTLR(我想用C#编写编译器)这样的常用工具似乎不允许这样做

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

是的,当然

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

  • 在Perl中,使用Parse::RecDescent。它从一个字符串中获取语法,您可以明确地要求它在运行时从一个新字符串生成一个新的解析器
  • 在Python中,考虑PLY。您可以在运行时轻松地使用docstring生成函数并在其上运行PLY
我个人建议使用Python选项,但如果您了解Perl而不了解Python,则可能与此无关

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

祝你好运。

,jlexjava扩展,可以让你进行运行时编译,但这是一个非常棘手的问题。

看看我认为对你有帮助的地方。使用此技术可以在运行时生成解析器。一种流行的解析器组合器是,它使用作为其宿主语言。从:

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

解析器是语言中的一级值。它们可以放入列表,作为参数传递,并作为值返回。使用特定于特定问题的定制解析器可以轻松扩展可用的解析器集


如果您使用的是.NET,请查看。

您将解析什么?在C或C++中,运行时不会有解析器,因此没有额外的库就不能使用。但对于许多编程语言来说,这是正确的

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


如果您要解析的语言是您自己的:编写解析器是一件需要自己学习的事情。即使使用解析器生成器,它本身也是一项工作。但在你学会之后,它会变得非常简单。但是,像缩进语法这样的特殊技巧仍然很棘手,您需要进行良好且广泛的测试,以确保解析器能够满足您的需要

如果Java更适合您,那么Haskell Parsec库有一个端口-。非常强大,尽管文档不是很好

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

扭头的东西

因为它都是用Java实现的(您的解析器是POJO),所以您可以重构、执行TDD,以及您在Java中习惯的任何操作。这是更传统的ANTLR/JavaCC/JJTree方法的主要优势。

[Dropincc.java]“Dropincc.java是纯java中的动态解析器生成器”

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

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


[项目主页]

我认为您对解析器感兴趣,而不仅仅是词汇分析器。通常,词法分析器从输入字符流生成一个标记流。解析器从令牌流创建AST。你可以考虑改变你的问题的措辞来获得正确的音频。我不知道我在说什么。解析器。这样做更有意义。Python缩进符合html吗?这主意不错。