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