获取函数原型的简便方法?

时间:2010-11-06 07:22:14

标签: c++ compiler-construction

嘿伙计们,朋友和我正在讨论想象和真实的语言,如果我们中的一个人想要为另一种语言生成标题(也许是D which already has a tool),那么问题就出现了。这样做的好方法?

我们中的一个人说要扫描C文件和标题并忽略函数体,只计算其中的大括号以确定函数何时完成。对此的反击是typedef,定义(括号但定义被认为是一个微不足道的问题)和模板+专业化。

另一个解决方案是读取二进制文件,而不是实际的exe文件,而是链接器使用的目标文件。与此相反的是格式和复杂性。我们都不知道任何对象格式,所以我们无法估计(我们考虑的是gcc和VS c ++)。

你们觉得怎么样?哪个更容易?这应该以合理的逻辑和事实为后盾。

如果有人可以链接到一个有用的项目,那么解析C文件/标题并输出它或者读取elf数据并在示例项目中显示信息的项目将非常有用。我试过谷歌搜索,但我不知道它会被称为什么。我找到了libelf但是此刻我无法编译它。我或许可以很快。

6 个答案:

答案 0 :(得分:6)

您可以使用clang库来解析C / C ++源代码,并在特定的函数原型中提取您想要的任何信息。

由于library-based architecture,您可以轻松地重复使用所需的部分铿锵声。在您的情况下,这些是前端库(liblex,libparse,libsema)。考虑到你提到的困难(typedef,define等),我认为这是一种更可行的方法,然后使用手写扫描器。

clang也可用作解析源代码并以XML格式输出AST的工具,例如,如果您有文件test.cpp

void foo() {}

int main()
{
    foo();
}

并调用clang++ -Xclang -ast-print-xml -fsyntax-only test.cpp您将获得与以下内容类似的文件test.xml(此处为了简洁而省略了相关部分):

<?xml version="1.0"?>
<CLANG_XML>
  <TranslationUnit>
    <Function id="_1D" file="f2" line="1" col="6" context="_2"
              name="foo" type="_12" function_type="_1E" num_args="0">
    </Function>
    <Function id="_1F" file="f2" line="3" col="5" context="_2"
              name="main" type="_21" function_type="_22" num_args="0">
    </Function>
  </TranslationUnit>
  <ReferenceSection>
    <Types>
      <FunctionType result_type="_12" id="_1E"/>
      <FundamentalType kind="int" id="_21"/>
      <FundamentalType kind="void" id="_12"/>
      <FunctionType result_type="_21" id="_22"/>
      <PointerType type="_12" id="_10"/>
    </Types>
    <Files>
      <File id="f2" name="test.cpp"/>
    </Files>
  </ReferenceSection>
</CLANG_XML>

我认为至少对于具有C链接的符号来说,从二进制文件中提取这些信息是不可能的,因为它们没有名称修改。

答案 1 :(得分:2)

ctags的输出很容易阅读/解析

答案 2 :(得分:2)

如果你想简单地生成一个绑定,请尝试swig

答案 3 :(得分:1)

您所谈论的是compiling:将代码转换为另一种正式语言的行为。这背后有一个很好的科学依据,如果仔细遵循,将保证你的程序停止使用正确的类似代码。

当然,你不想解析整个C ++语言(对此很好!),所以你只需要定义相关语法并将其他所有语言定义为可接受的噪音或评论。

不要使用正则表达式。这些都不行,因为C ++不是常规语言。

答案 4 :(得分:1)

执行此操作的一种方法是使用抽象语言(IDL)定义接口,并为您感兴趣的所有语言生成标头。您可以将IDL的范围限制为这些功能每种目标语言都有可能。

Windows以MIDL语言采用此方法,例如。

答案 5 :(得分:1)

Doxygen可以帮助解决这个问题。这是一个高级主题,有些记录。