嘿伙计们,朋友和我正在讨论想象和真实的语言,如果我们中的一个人想要为另一种语言生成标题(也许D 已经有了一个工具),那么问题就出现了,这将是一个简单而且非常好的方法.做这个?
我们中的一个人说要扫描C文件和标题并忽略函数体,只计算内部的大括号以确定函数何时完成.对此的反击是typedef,定义(括号但定义被认为是一个微不足道的问题)和模板+专业化.
另一个解决方案是读取二进制文件,而不是实际的exe文件,而是链接器使用的目标文件.与此相反的是格式和复杂性.我们都不知道任何对象格式,所以我们无法估计(我们考虑的是gcc和VS c ++).
你们有什么感想?哪个更容易?这应该用合理的逻辑和事实来支持.
如果有人可以链接到一个有用的项目,那么解析C文件/标题并输出它或者读取elf数据并在示例项目中显示信息的项目将非常有用.我试过谷歌搜索,但我不知道它会被称为什么.我找到了libelf但是此刻我无法编译它.我或许可以很快.
您可以使用clang库来解析C/C++源代码,并在特定的函数原型中提取您想要的任何信息.
由于基于库的架构,很容易重用您需要的部分clang.在您的情况下,这些是前端库(liblex,libparse,libsema).我认为这是一种更可行的方法,然后使用手写扫描器考虑您提到的困难(typedef,定义等).
clang也可以用作解析源代码并以XML格式输出AST的工具,例如,如果你有这个文件test.cpp:
void foo() {}
int main()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
并调用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>
Run Code Online (Sandbox Code Playgroud)
我不认为从二进制文件中提取此信息至少对于具有C链接的符号是可能的,因为它们没有名称修改.
| 归档时间: |
|
| 查看次数: |
1608 次 |
| 最近记录: |