我需要解析C#,Ruby和Python源代码来生成一些报告。我需要在类中获取方法名列表,并且我需要一些其他信息,例如使用全局变量或其他东西。只使用RE解析可能是一个解决方案,但我希望使用解析器的更好(系统)解决方案,如果它很容易实现。
提供了哪些语言解析器?
对于C#,我找到了http://csparser.codeplex.com/Wikipage,但对于其他人,我找到了一堆使用这些语言的解析器,但不是它们的语言解析器。
答案 0 :(得分:6)
您可以在ANTLR网站上找到您感兴趣的所有3种语言的语法(尽管Ruby语法仅适用于该语言的“简化”版本)。
接下来的困难可能是使这些语法适应您想要的特定目标语言,即解析器本身将生成的语言。
ANTLR的语法语言非常具有表现力,允许人们处理各种上下文敏感的语言。这是通过在类似EBNF的语法中插入各种片段(在目标语言中)和/或语义或句法谓词(也在目标语言中)来完成的;因此语法有点混乱,可能需要在目标语言改变时进行调整。 ANTLR的“本机”目标语言是Java,但支持许多其他目标语言。
总的来说, ANTLR代表了设置/学习曲线的努力,但由于您需要处理3种语言,因此可能值得投资,因为这将允许您有一个统一的框架(你有“完整”的控制权),而不是在你开始做的时候尝试将三个可能非常不同的,可能更多的“锁定”解析器包围起来。
所有三种语言都是相对复杂的语言,虽然你的目标只是“仅仅”来识别程序中的方法,但你可能能够破解/简化一些语法(或者简单地“忽略”它们的一部分),只有映射您最终目标所关注的几个解析器级规则 一旦识别出这些规则,您就可以应用相同或类似的动作,即片段(目标语言),当解析器遇到此类规则时,这些片段实现您希望完成的任务(例如:存储方法的签名)对于未来的报告,开始计算行数...无论如何。
最后的建议:
正如对问题的评论所暗示,并且根据您的目标,您可能重复使用现有的实用程序来直接或间接执行这些目标。
此外,因为对于这些复杂的语言而言,实际上对于解析器来说可能有点过分,可能是简单且可能容错的目标,正则表达式方法 可能 强烈的>以某种方式适应账单;事实上,这些语言都不是常规的,也没有上下文,因此正则表达式的成功将高度依赖于最终目标和输入数据(程序)。
又一个建议! 见 Larry Lustig 的回答!内省也可以简化你们的大部分工作。这意味着您需要a)在每种基础语言中编写逻辑b)集成/加载要检查的程序。所有这一切都取决于,但是,通过正式的语法工具,这可能是一种可能的方式 - 公平 - 相对较重的投资。
答案 1 :(得分:6)
对于Python,情况微不足道:标准库中有Python parser以及a more high-level module for manipulating ASTs。
此外,Python有一个简单的语法(至少如果你使用技巧在你的词法分析器中保留缩进堆栈并在你的令牌流中注入假的BEGIN
和END
令牌,那么你可以将Python视为一个简单的关键字,在解析器中分隔出类似Algol的语言),因此它经常被用作解析器生成器的示例语法,这意味着您可以为几乎每个解析器生成器找到几十个Python解析器,编程那里的语言和平台。 (例如,这里是a Haskell module implementing a Python lexer and parser。)
对于Ruby,有很多可用的解析器。
Ruby 难以理解难以解析,所以如果你需要完全保真,你几乎必须使用YARV Ruby实现中的原始YACC语法文件。 (parse.y
in the top-level source directory.)JRuby的解析器派生自该文件,它是唯一一个明确设计为其他客户端而不仅仅是解释器本身的实现解析器。 (例如,Eclipse RDT插件,Eclipse DLTK / Ruby插件,NetBeans Ruby插件和突出显示的jEdit Ruby语法都使用JRuby的解析器。)为了实现这一点,JRuby的解析器实际上已经被重新打包为separate project。
当然,世界上几乎所有语言都有YACC克隆。但是,请注意YARV不使用lex
生成的扫描程序。它在C中使用手写扫描程序,而且YACC语法在C中包含了相当多的语义操作。这些部分必须重新实现(就像它们在JRuby中一样)。
XRuby编译器是唯一不使用YARV parse.y
的完整Ruby实现,它使用从头开发的an ANTLRv3 grammar和ANTLRv3 tree grammar。 ANTLR可以为一大堆语言生成解析器,包括例如Java和C#。然而,它的Ruby后端迫切需要一些工作。
RedParse是一个用Ruby编写的Ruby解析器,它声称能够正确解析所有Ruby语法。例如,它在YARD Ruby文档工具中用于提取方法名称等。
ruby_parser是Ruby中的另一个Ruby解析器。它是通过parse.y
解析器生成器从racc
生成的,该生成器是Ruby标准库的一部分。
YARV实际上包含一个名为ripper
的解析器库,它允许您解析Ruby代码。不幸的是,它完全没有记录,所以你基本上必须通过阅读blog posts来弄明白。当然,除了没有文件记录之外,几乎没有人 else 已经想出来了,或者写了博客文章。
但是,出于您的目的,您实际上并不需要一个完整的Ruby解析器。您只需要提取方法名称和其他一些东西。
Ruby文档生成器RDoc包含一个Ruby解析器,它可以解析足够的Ruby,以及提取方法名称和其他一些东西。
Cardinal是Parrot Virtual Machine的Ruby实现。它尚未运行所有Ruby,但its parser应足够强大,以支持您所需要的一切。 (解析器是用Parrot语法引擎编写的,所以你显然必须在Parrot中运行它,比如在Perl6中编写你的报告工具。)
tinyrb是另一个Ruby实现,它不运行完整的Ruby,但包含{YARV better written parser。在这种情况下,解析器使用Ian Piumarta's leg
Parsing Expression Grammar parser generator。
答案 2 :(得分:2)
对于Ruby和Python,您不能简单地反省该类来学习方法的名称吗?您必须在每种语言中编写相同的功能,但(至少在Python中)几乎没有任何内容。
答案 3 :(得分:1)
DMS Software Reengineering Toolkit具有完整,强大的C#和Python解析器,可自动构建完整的AST。 DMS提供步行树木和收集您可能希望收集的任何数据的设施。
另一张海报的答案表明Ruby很难解析。 C ++也很难解析。 DMS已经被用来解析大约30种其他语言,包括许多方言中的完整C ++,因此Ruby看起来非常可行。但是,DMS没有Ruby的现成解析器。