代码之家  ›  专栏  ›  技术社区  ›  prosseek

语言分析器

  •  3
  • prosseek  · 技术社区  · 14 年前

    我需要解析c_、ruby和python源代码来生成一些报告。我需要在一个类中得到一个方法名列表,我还需要一些其他信息,比如全局变量的用法等等。使用re进行解析可能是一个解决方案,但是如果很容易实现的话,我希望使用解析器可以得到更好的(系统的)解决方案。

    为这些语言提供了哪些解析器?

    对于C,我发现 http://csparser.codeplex.com/Wikipage 但是对于其他人,我发现了一堆使用这些语言的解析器,但是没有使用它们的语言解析器。

    4 回复  |  直到 14 年前
        1
  •  6
  •   mjv    14 年前

    也许值得一看 ANTLR parser generator .

    在antlr站点上,您可以找到您感兴趣的所有3种语言的语法(尽管ruby语法仅适用于语言的“简化”版本)。

    下一个困难可能是将这些语法改编成特定的 目标语言 您希望,也就是说,生成解析器本身的语言。
    antlr的语法语言非常有表现力,允许人们处理各种上下文敏感的语言。这是通过在类似ebnf的语法中插入各种片段(在目标语言中)和/或语义或句法谓词(在目标语言中也是如此)来完成的;因此,语法有点混乱,可能需要在目标语言更改时进行调整。Java的“本机”目标语言是Java,但支持许多其他目标语言。

    总的来说, antlr代表了一点设置/学习曲线的努力 ,但是由于您需要处理3种语言,这可能是值得的投资,因为这将允许您拥有一个统一的框架(在这个框架上您拥有“完全”控制权),而不是像您开始做的那样试图将三个可能非常不同的、可能更多的“锁定”解析器组合起来。

    所有这三种语言都是相对复杂的语言,尽管您的目标是“仅仅”识别程序中的方法,但是您可能能够破解/简化一些语法(或者可能只是“忽略”其中的一部分),只将少数感兴趣的解析器级规则映射到最终的goa。L。
    一旦确定了这些规则,就可以应用相同或相似的规则 行动 ,即实现解析器遇到此类规则时希望完成的任务的片段(在目标语言中)(例如:存储方法的签名以备将来报告,开始计算行数…无论如何)。

    最后建议:
    正如对这个问题的评论所暗示的,根据你的目标,你可以 重用现有实用程序 直接或间接地实现这些目标。
    另外,由于对这些复杂语言的解析器的干扰可能对您来说有点过火,可能是简单的,也可能是容错的目标,所以 正则表达式 方法 可以 不管怎么说,这都是合情合理的;事实上,这些语言都不是正则的,也不是上下文无关的,因此regex的成功将在很大程度上取决于最终目标和输入数据(程序)。

    又一个建议!
    拉里卢斯蒂格 答案!内省也可以简化你的工作。这意味着您需要a)在每种底层语言中编写逻辑b)集成/加载要检查的程序。一切都取决于,但同样,一个可能的出路-让我们公平-相对沉重的投资与正式的语法工具。

        2
  •  6
  •   Jörg W Mittag    14 年前

    对于python,情况很简单:有一个 Python parser 在标准库中以及 a more high-level module for manipulating ASTs .

    另外,python有一个简单的语法(至少当你使用这个技巧在你的lexer中保留一个缩进堆栈并注入fake BEGIN END 令牌流中的令牌,以便您可以将python视为解析器中一种简单的关键字分隔的类algol语言),因此它通常用作解析器生成器的示例语法,这意味着您可以为几乎每个解析器生成器找到几十个python解析器。R,编程语言和平台。(例如,这里是 a Haskell module implementing a Python lexer and parser )

    对于ruby,有相当多的解析器可用。

    露比是 难以置信地 很难解析,所以如果需要完全保真度,就必须使用yarv ruby实现中的原始yacc语法文件。( parse.y in the top-level source directory. )JRuby的解析器是从该文件派生的,它是唯一一个被显式设计为也可由 其他 客户,而不仅仅是口译员本身。(例如,EclipseRDT插件、EclipseDLTK/Ruby插件、NetbeansRuby插件和JeditRuby语法突出显示都使用JRuby的解析器。)为了方便起见,JRuby的解析器实际上被重新打包为 separate project .

    当然,地球上几乎每种语言都有yacc克隆。但是,请注意,yarv不使用 lex 生成的扫描仪。它使用c语言的手写扫描器,而且yacc语法在c语言中包含相当多的语义操作,这些部分必须重新实现(就像在jruby中一样)。

    xruby编译器是唯一不使用yarv的完整ruby实现。 解析Y ,它使用 an ANTLRv3 grammar 和一个 ANTLRv3 tree grammar 是白手起家的。ANTLR可以为整个语言群生成解析器,例如Java和C.*。然而,它的ruby后端非常需要一些工作。

    RedParse 是一个用ruby编写的ruby解析器,它声称能够正确地解析所有ruby语法。例如,在 YARD ruby文档工具,其中包括提取方法名。

    ruby_parser 是ruby中的另一个ruby解析器。它是由 解析Y 通过 racc 分析器生成器,它是ruby标准库的一部分。

    yarv实际上包含一个名为 ripper ,它允许您解析ruby代码。不幸的是,它完全没有文档记录,所以你基本上必须通过阅读 blog posts . 当然,除了无证,几乎没有人 其他的 我也知道了,还写了一篇博文。

    然而,出于您的目的,实际上并不需要一个成熟的ruby解析器。你只需要提取方法名和其他一些东西。

    RDoc ruby文档生成器包含一个ruby解析器,它可以解析足够的ruby来提取方法名和其他一些东西。

    Cardinal Parrot Virtual Machine . 它还没有运行所有的ruby,但是 its parser 应该足够强大来支持你所需要的一切。(解析器是在parrot语法引擎中编写的,因此您显然必须在parrot中运行它,例如在perl6中编写报告工具)。

    tinyrb 是另一个不运行完整ruby但包含 better written parser 比亚尔。在这种情况下,解析器使用 Ian Piumarta's leg Parsing Expression Grammar parser generator .

        3
  •  2
  •   Larry Lustig    14 年前

    对于ruby和python,您不能简单地对类进行内省来学习方法的名称吗?您必须在每种语言中编写相同的功能,但(至少在python中)几乎没有任何功能。

        4
  •  1
  •   Ira Baxter    14 年前

    这个 DMS Software Reengineering Toolkit 有完整的、健壮的c和python解析器,可以自动构建完整的ast。DMS为您提供了在树上行走和收集您可能希望收集的任何数据的设施。

    另一张海报的答案表明ruby很难解析。C++也很难解析。DMS已经被用于解析30种其他语言,包括多个方言中的完全C++,因此露比似乎非常可行。然而,DMS没有现成的Ruby解析器。