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