【问题标题】:How to get names of function use in code如何获取代码中使用的函数名称
【发布时间】:2012-10-18 14:46:23
【问题描述】:

我将 C++ 方法的主体作为 String 获取,并希望获取此代码中使用的所有方法的列表。 什么工具最适合做这样的解析?

它必须支持所有情况:

opSomeMethod();
someObject.someMethod();
someObject->someMethod();

最好用 Java 编写,但也可以是在控制台上运行的小型 c++ 程序。

【问题讨论】:

  • 一个 C++ 编译器跃入脑海。
  • Clang 可能是您最好的选择,尽管您可以全力以赴并为 ANTLR 或任何其他解析器生成器使用 C++ 语法之一。
  • WhozCraig:看起来有点复杂,你能用简单的例子告诉我你指的是哪个编译器飞跃吗? @Captain Obvlious:你能给我举个例子吗,我试图找到从代码片段中获取这些函数名称的最简单和干净的方法?
  • 这件事我必须和队长一起去。它可能提供了正确拾取符号的最佳机会。即使这样,其中一些也几乎不可能完全计算出来。尤其是在 obj.mthd() 实际上触发 void *(mthd)() 的情况下,它是 obj 类的成员 variable,它恰好也是一个函数指针。
  • 您实际上需要一个完整的 C++ 前端才能在所有可能的情况下正确执行此操作。解析器还不够

标签: c++ parsing


【解决方案1】:

您可以使用 LEX 和 YACC 工具来定义语法和解析字符串。 Lex 和 Yacc 可以读取源程序并发现其结构。

再次发现源结构的任务被分解为子任务:

  • 将源文件拆分为标记 (Lex)。
  • 查找程序的层次结构 (Yacc)。

Lex 帮助编写控制流由输入流中的正则表达式实例引导的程序。它非常适合编辑器脚本类型转换和分段输入以准备解析例程。 Lex 源是正则表达式和相应程序片段的表。该表被转换为一个程序,该程序读取输入流,将其复制到输出流并将输入划分为与给定表达式匹配的字符串。当每个这样的字符串被识别时,相应的程序片段就会被执行。表达式的识别由 Lex 生成的确定性有限自动机执行。用户编写的程序片段按照输入流中对应的正则表达式出现的顺序执行。

See the online manual for LEX for more details.

Yacc 提供了一个通用工具来描述计算机程序的输入。 Yacc 用户指定其输入的结构,以及在识别每个此类结构时要调用的代码。 Yacc 将这样的规范转化为处理输入过程的子程序;通常,让这个子程序处理用户应用程序中的大部分控制流是方便和适当的。

See the online manual for YACC for more details.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多