C++感知的差异工具

7

有没有一款免费的差异工具可以使用它们的AST而不是文本来比较两个C++文件?

我想的是这样的:

  • 将两个文件都转换为AST
  • 将AST渲染回C++代码(这将规范化缩进)
  • 在这两者之间进行正常的差异比较
  • 还尝试检测已完成的简单重构(例如添加/删除/重命名成员)

5
那样会很慢,我想不出为什么有人会想要这样的东西。 - Mooing Duck
3
我想这是为了抓学生作弊。 - chrisaycock
1
这是为了让另一个程序员能够审查我代码的更改,因为他不喜欢我的编码风格。由于我们的团队没有官方的样式规则,这种工具将非常有帮助。 - tohava
3
@tohava,你的团队应该在为时已晚之前实施官方的代码风格规则。 - Mahmoud Al-Qudsi
3
如果他在不进行其他更改的情况下重新格式化了您的代码(或者您对他做了同样的事情),告诉他停止(或停止这样做)。此外,您应该就代码风格达成一致,并使用工具(如IDE的设置或预先检查的代码格式化程序)来强制执行。无论您是否喜欢这种风格都不那么重要,比起让每个人的代码都保持相当一致更加重要。 - bames53
显示剩余3条评论
4个回答

5
Semantic Designs的SmartDifferencer工具可以解析C++,并基于ASTs计算差异;布局格式并不重要。该解析器是完整的C++11解析器。只要它们是“结构化”的,“大多数预处理器指令都不会被扩展”,就可以解析大多数源文件;C++预处理器用法通常不像C语言那么滥用。SmartDifferencer也有其他语言的版本。
[披露:我是Semantic Designs的CTO]

2
我可以想到两个解决方案来解决你的问题:
  1. 讨论一种将作为团队使用并坚持的编码风格。你可能需要在团队成员的不同个人编码风格之间寻找折衷方案。

  2. 如果您正在使用源代码控制,请添加挂钩以在提交时删除所有格式,并在检出时自定义代码格式。这需要一些工作,但允许团队成员使用自己的格式化样式。当然,这并不能解决变量命名和其他非格式化代码风格元素的不同意见。


2

1
你可以在进行代码比较之前,通过 AStyle 规范缩进、空格和格式。这并不会对重构产生任何影响,但是,就我所知,要想做到这一点,您需要进行完整的预处理/编译操作。

http://astyle.sourceforge.net/


2
这个工具不会强制规定一个CANONICAL形式。例如,"int main()\n{\n}"和"int main\n()\n{\n}"是不同的输出。一个将代码编译成AST的工具在这种情况下会很有帮助。 - tohava
我觉得你不明白你在要求什么。一个完整的AST遍历至少需要一个完整的预处理器遍历,这意味着每个#include都会被展开,每个#define都会被展开等等。在许多情况下,你的代码与最初的样子几乎没有任何相似之处。这还没有考虑到“检测重构”部分,这似乎只是一个空想。 - StilesCrisis
让我们跳过检测重构。在美化打印期间,#includes 可以很容易地回滚(我们有 #line 指令或类似的东西可以用于此)。宏比较棘手,我认为如果预处理器被修改以创建类似 JavaScript 行映射的东西,那么它们可能仍然会被处理,然后漂亮的打印机可以使用这些映射来回滚宏。我错过了什么吗? - tohava
2
如果你想要一个免费的现成工具来完成所有这些任务,那么你要求有点过多了。回答你最初的问题,我认为如果你想要一个能够完成你所描述的所有任务的工具,你需要自己编写它。在我看来,与其这样,你不如与同事沟通并达成共识,或者考虑换一份新工作。 - StilesCrisis
有一些商业工具可以解析C++,并基于AST计算差异。我知道的这个工具可以解析源文件,而不扩展大多数预处理器指令(只要它们是“结构化的”;C++预处理器的使用通常不像在C中那样滥用)。 - Ira Baxter
或许你应该把那个工具的名称作为答案发布,Ira? - StilesCrisis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接