有没有从C或C文件中提取typedef,结构,枚举,变量,函数的命令行工具?

我希望从C或C源文件提取定义或声明(typedef,结构,枚举,变量或函数)的命令行工具.另外,替换现有定义/声明的方法也是很方便的(在用户提交的脚本转换提取的定义之后).有没有这样的通用工具可用,还是这种工具的一些共同的近似近似?

脚本和与用户创建的脚本或程序连接的能力在这里非常重要,尽管我对GUI程序也很有好奇心. Unix / Linux阵营的开源解决方案是首选(尽管我也对Windows和OS X工具很好奇).主要的语言兴趣是C和C,但更通用的解决方案会更好(我认为我们不需要超精确的解析功能来查找,提取和替换程序源文件中的定义).

使用案例(额外 – 好奇心):

>给定这些类型的深层嵌套结构和变量(数组)初始化,假设需要通过添加或重新排序字段来更改结构定义,或者以更可读的格式重写变量/数组定义,而不会引入体力劳动导致的错误.这将通过提取旧的初始化,然后使用脚本/程序来编写新的初始化来替换旧的初始化.
>实现代码浏览工具 – 提取定义.
>装饰代码生成(例如记录功能条目/返回).
>脚本代码结构化(例如提取这个和那个东西并放在不同的地方而不改变 – 版本控制提交注释可以记录命令来执行这个操作,使其显而易见和验证没有改变).

替代问题:如果有一个工具来告诉定义的位置(开始和结束行就足够了 – 我们甚至可以假设我们感兴趣的所有定义/声明都在自己的行),那么这将简单地运行手指灵巧来写程序

>提取定义,
>替换定义,甚至
>提取定义,运行一个由命令行选项(或编辑器)指定的程序

>从stdin(或从临时文件)接收所需的提取定义,
>执行转换(编辑),和
>将新定义输出到stdout(或将它们保存到给定的临时文件)

由执行程序代替.

因此,主要的,更具挑战性的问题将是找到定义的开始和结束.

关于标签的注意事项:比代码生成更准确的标签将是代码转换,但不存在.

解决方法

我们 DMS Software Reengineering Toolkit试图成为您希望的工具.但它正在推动艺术状态,而不是一个涅ana风格的工具.做好真正有趣的工作是件好事.

DMS提供了解析,分析和转换源代码的一般设施.

它使用显式语法来定义语言(如C和C);语法驱动构建抽象语法树(AST)的解析器.各种分析原语提供a)设施[“属性语法”ATGs]用于沿着类似于AST的形状的树状信息流路径收集信息,b)构造符号使用符号定义映射[“符号表”],c)control and data flow analysis使用ATG提取的事实,d)范围分析,e)本地和全球的分析.这些原始分析器可用于从AST组成事实,以得出关于由AST表示的代码的结论(例如,“该语句修改这些变量”). langauge front end将语法和语言特定的分析器集成在一起,可重复使用的捆绑包. DMS具有各种语言的不同程度的深度和成熟度的语言前端.

[编辑6/27:C和C前端支持C和C的具体方言:ANSIC,C99,GCC3 / 4 C,MS Visual C,ANSI C 98,ANSI C 11,MS Visual C 2005/2008/2010.如果要准确分析代码,则应使用“正确”方言来处理代码.]

但“分析”不是重点.分析的目的是推动变革. DMS提供了额外的支持,以程序上修改AST,修改由语言表面语法编写的AST(均由某些选定的分析结果调节),或将一组程序和源到源重写在一起,以使复合重写,可以执行大规模的代码更改,如重构等.在AST变换之后,它们可以用于在相应的前端语言/方言中重新生成(“漂亮”)语法正确的代码. [通过修改一种语言的AST,直到您有另一种语言的AST,您可以构建翻译器,但这并不像这句话所暗示的那样简单].

这一切都在相当程度上起作用,但仍然受到某些语言并发症的阻碍.对于C和C,一个着名的并发症是预处理器;通过任意编辑程序文本,预处理条件可以通过类似于标准解析技术的任何类似的方式使源代码不可粗体化. DMS的C和C前端有所改善,可以使用结构良好的预处理器指令来解析代码,包括一些奇怪的情况,大多数人不会调用结构化但通常发生:

#IF  cond
        if (abc)  {
   #ELSE
        if (def)  {
   #ENDIF

我们正在使用预处理条件的任意放置来解析代码进行有趣的进展.但是一旦你这样做了,现在所有的分析仪都突然要考虑到预处理条件,而且我们都突然在编译人员没有真正访问过的草坪上.

DMS已被用于在大型C程序中进行主要的架构转换,通过大量的代码重排将CORBA风格转换为CORBA风格,通过任意控制流程路径提取代码,为现有的C代码生成SOW样式的API,在大型C程序中插入仪器以检测指针错误等[已被许多其他语言应用于其他任务].

在我们自己的经验中,仍然很难使用.在我们看来,这是同样的意义,民主是所有制度的最坏的,除了所有其他的制度;因人而异.该网站有大量的DMS衍生工具和讨论.

事实上,它已经被用来提取功能(SOW练习比这更普遍)和插入函数(这是一个通用的仪器).

像GCC-XML这样的工具是DMS功能的阴影. GCC-XML解析,构建符号表,并转储数据声明(而不是代码),但不能进行任何代码更改. ang更好它将C和C解析为AST,可以对LLVM中间表示进行分析,并且具有某种机制,用于分发待应用的稍后补丁以源于所需树更改启发的文本.我不知道Clang可以执行大量的代码转换,特别是那些转换结果再次被转换的代码(你如何修改延迟文本补丁的树)? DMS可以一整天这样做,并且可以为C和C以外的许多语言执行此操作,并且可以对它知道的langauges的任意混合进行操作.

直到有条件的预处理器问题得到解决,分析/转换C和C代码将不容易.我们通过纯粹的意志力和使用我们可以建立的最强大的工具来完成这些语言的这些任务. (Java没有这些问题,DMS相应地更好地分析/转换它).

在傲慢的危险中,我认为DMS是用于通用分析和转型的最好的工具.作为其建筑师,我认为它是我的长期工作,使其变得更加强大.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...