gpt4 book ai didi

java - 使用另一个C/Java程序从给定的C++/Java程序中提取信息

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:09 25 4
gpt4 key购买 nike

谁能给我一些关于如何从给定的C++或Java程序(源代码)中提取信息的想法?这些信息可能是类的名称或方法的名称或告诉某些继承关系或类层次结构等。您必须为此编写一个c++或Java程序。我已经尝试并能够做到这一点,但这并不完全正确。现在我正在做的事情是逐行读取给定的程序并检查“class”关键字,如果我找到任何这样的单词,这意味着紧随其后的单词是该类的名称(以提取类的名称)我只是在想是否有任何内置的C或Java库可以更有效地完成这项工作?请提出一些简单的想法(而不是一些外部库或插件)。

最佳答案

如果您只需要类名和类中的方法,则可以绑定(bind)一组正则表达式以选择各种标记(标识符,“{”,“}”,运算符,数字,字符串)和模糊解析器(称为“岛屿解析器”),以识别组成类声明和方法声明的标记序列。 (提示:对于Java和C++,请确保您以某种方式匹配
相应的{...}“)。

此特技适用于类和方法,因为从本质上讲,这是实际编译器的工作方式:它们将输入流分解为 token (通常使用称为“lexer generators”的正则表达式的编译器泛化),然后使用解析器确定实际的代码结构,并且在语法中很容易发现类和方法。 (此解决方案是OP发布的一种干净版本)。

如果您想获取Java或C++源代码形式的任何其他信息(例如,方法参数的类型等),则可能需要一个可以实际解析语言并构建符号表的工具,以便您有机会知道找到的标识符在各个位置的意思。

(编辑:OP表示他想找出什么功能调用了其他功能。没有完整的语言前端(至少需要解析器+符号表),他无法明智地做到这一点。

您可以获得解析C++的各种工具(GCC,Clang,Elsa等)以及解析Java的各种其他工具(ANTLR,javacc等)。您会发现GCC非常难以执行一般任务,而Clang和Elsa则没有问题。 ANTLR和Javacc将解析Java代码,但不会AFAIK构建符号表,因此它们对于一般用途的任务有些落伍。您会发现,使用C++工具将与使用Java工具完全不同,因为这些工具都没有通用的编译器基础结构。

从每种方法中提取类和方法名称的方式会有所不同,但是大多数方法都提供了某种方式来越过解析树(并且您针对要查找的内容编写了一些临时匹配项,例如,类声明语法)和/或浏览符号表(并吐出标记为“类”或“方法”名称的符号)。如何找到正确的语法要求您详细了解树的结构,并编写大量测试代码以匹配正确的树结构。

如果您确实要处理两种语言,并使用单个基础结构来进行处理,则可以考虑使用DMS Software Reengineering Toolkit。 DMS与语言无关,但可以调整为任意语言,然后解析这些语言,构建抽象符号表和各种流分析。 DMS具有完整的C++ Front end(带有内置预处理器并以各种形式处理C++,包括新标准C++ 11)和Java Front end,它们可以处理Java直至1.6的所有方言(其中1.7会瞬时发生)。

要执行查找类和方法的OP(最初规定)任务,您需要让DMS解析文件,然后爬到树或符号表上,就像其他工具一样。您可以在DMS中编写临时树匹配器,但编写模式更容易:

 pattern match_class_declaration(i: identifier, b: statements): class_declaration
= " class \i { \b } ";

可以与DMS一起使用,以匹配恰好是类声明的那些树,并且将返回绑定(bind)到对应子树的“i”(我们不在乎的“b”)。 “i”当然包含您想要的类名。其他模式可用于识别其他构造,例如继承或实现接口(interface)的类名或返回某种类型的方法或返回void的方法。
关键是您不必十分详细地了解树结构即可使用此类模式。

要走得更远,OP似乎想做(例如,建立 call 者/被 call 者信息),则需要构造控制流程图,进行指向分析等。DMS为此提供了支持。

好消息是,一种基础结构可以同时使用两种语言。您甚至可以在DMS中混合使用C++和Java,而不会感到困惑。更困难的消息是DMS是相当复杂的野兽,但这是因为DMS必须处理C++和Java(以及许多其他语言)的所有复杂性。在使用两个截然不同的实现以及两个完整的学习曲线集的两个不同的语言解析器一起工作时,仍然表现出色。

关于java - 使用另一个C/Java程序从给定的C++/Java程序中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com