我正在寻找一个基于Windows的库,可用于解析一堆C文件以列出全局和局部变量。可以使用typedef声明全局变量和局部变量。然后可以使用输出(即全局变量和局部变量列表)进行后处理(例如,用新名称替换变量名称)。
这样的图书馆可用吗?
答案 0 :(得分:11)
一些可用的方法:
或者,您可以使用公开lex and yacc和lex specification使用yacc grammar(或其亲属和野牛)编写自己的作品。
答案 1 :(得分:3)
可能有点矫枉过正,但是有一个用Boost.Spirit编写的完整的ANSI C解析器: http://spirit.sourceforge.net/repository/applications/c.zip
也许你能够根据自己的需要对其进行建模。
答案 2 :(得分:3)
当你考虑时,解析C比它看起来要困难得多 帐户不同的方言,预处理器指令, 解析时需要类型信息等。 告诉你“只使用lex和yacc”的人有 显然没有做过生产C解析器。
可以执行此操作的工具是我们的C front end
它解决了上述所有问题。
完成后,它有一个完整的可导航符号表 包含所有标识符和相应的类型信息。 列出全局和局部变量对此来说是微不足道的。
我是Semantic Designs背后的架构师。
答案 3 :(得分:1)
我不知道它是否提供了库,但请查看CTAGS。
答案 4 :(得分:0)
如果它是普通的C,lex
和yacc
是你的朋友,但你需要考虑C预处理器 - 具有未扩展宏的源文件通常不符合C语法所以解析器,用K& R语法写的,很可能会失败。
如果您决定解析预处理器的输出,请准备好您的解析器因特定编译器的“扩展”而失败,因为很可能标准库头使用它们。至少就是GCC的情况。
我和GCC有过这个,最后决定用不同的方法实现我的目标。如果你只需要更改变量的名称,正则表达式就可以了,并且不需要构建完整的解析器,恕我直言。如果您的目标只是收集数据,那么最终的数据源就是调试信息。有一些方法可以从二进制文件中获取调试信息 - 对于使用DWARF的ELF可执行文件,有libdwarf,对于Windows-land(COFF?)也应该是这样的。可能你可以使用一些现有的工具来获取有关二进制文件的调试信息 - 再次,我对Windows一无所知,你需要进行调查。
答案 5 :(得分:0)
我最近读到了一个基于win32的系统,该系统查看了COFF dll中的调试信息: http://www.drizzle.com/~scottb/gdc/fubi-paper.htm
答案 6 :(得分:0)
也许gnu project cflow http://www.gnu.org/software/cflow/?