是否有任何编程语言的差异/合并工具,它以语法识别的方式工作(如XML Diff Tool),不仅仅是逐行比较(并且可选地忽略空格)。
我对实际遵循语言语法和分隔符的程序感兴趣,建议在不破坏语法正确性的情况下进行更改,或者在多行中分隔语句。示例行为是:
*找到引入额外嵌套级别的if(){
后,会自动将右括号}
与下面几行捆绑在一起。)
*将语法元素保持在一起,避免像删除块那样的愚蠢倾向于创建:
int function_A()
{
int ret;
ret = something;
ret += something_else;
<击> 撞击>
<击> return ret;
}
int function_B()
{
if(valid)
{
int ret;
ret = something;
ret += something_else;
击> <击> 撞击>
return ret;
}
<击> 撞击>
<击> else return -1;
}
击> <击> 撞击>
就个人而言,我很想找到能够处理C ++语法的软件,但了解其他语言的解决方案也会很有趣。
答案 0 :(得分:20)
Semantic Merge。
支持的语言来自网站:
我们从C#和Vb.net开始,然后添加了Java。现在已经支持C了,然后我们将专注于C ++,Objective-C和JavaScript,具体取决于你的 反馈
答案 1 :(得分:14)
虽然KDiff3不比较语法上下文中的语法元素,但它确实具有比“整行更改”更高的粒度,并且它将突出显示更改的行中的哪些部分。
根据我的经验,它有一个很好的检测变化的算法。鉴于上面的示例,它正确地比较了开箱即用的function_A和function_B:
即便如此,如果算法无法匹配您想要的,例如如下所示:
您可以通过将同步标记放在要执行比较的位置来手动覆盖。
备选方案1:
备选方案2:
答案 2 :(得分:11)
听起来你对Bram Cohen(BitTorrent创建者)Patience Diff算法(在市集版本控制系统中使用)感兴趣。
请参阅The diff problem has been solved,尤其是Patience Diff Advantages:
摘自第二个链接:
耐心差异的另一个优点是它经常不匹配普通不应匹配的行。例如,如果您完全重写了一段代码,那么它应该与每个版本中的空行不匹配,正如example所示。最后,有这个例子:
void func1() { x += 1 } +void functhreehalves() { + x += 1.5 +} + void func2() { x += 2 }
这很简单明了,但是频繁的diff算法会像这样解释它:
void func1() { x += 1 +} + +void functhreehalves() { + x += 1.5 } void func2() { x += 2 }
答案 3 :(得分:9)
Beyond Compare做了你要问的一些事情。它不能保持语法正确性或一次比较语言块,但它可以执行以下操作:
old_variable_name
替换为右侧new_variable_name
的每个地点的单个会话。这是迄今为止我使用过的最好的差异合并工具。它也是跨平台,便宜(标准30美元,专业50美元),评估期非常慷慨,值得一试。
答案 4 :(得分:6)
请参阅我们的SmartDifferencer工具。
SmartDifferencers是特定于语言的,由生产质量语言解析器驱动,构建AST并比较树。这使得他们完全独立于文本布局和干预评论;值得注意的是,如果文字所代表的实际值没有不同,它们不受文字文本(基数,移动小数点+改变指数,不同转义序列)的变化的影响。结果以语言语法术语和合理的编辑操作(移动,复制,插入,删除,重命名标识符在块内)报告。
有C#,Java,C ++,Python和各种其他语言的版本。网站上有各自的例子。
对于C存在SmartDifferencer,但是在没有完整编译器命令行的情况下解析C文件有时会出现问题,因此有时会失败并且您必须回退到更原始的比较工具,例如diff。我们正在努力改善这种状况。
答案 5 :(得分:6)
请查看Compare++。
它可以为C / C ++,Java,C#,Javascript,CSS,...进行语言感知的结构化比较。 并且可以选择忽略注释,纯格式化,空白和大小写更改,并具有唯一的能力来对齐移动的部分,例如C ++函数,Java命名空间,C#方法,CSS选择器......
答案 6 :(得分:3)
如果您正在使用eclipse,则集成的比较编辑器提供语法感知的diff / merge,至少对于Java。选中“常规/比较/补丁”首选项下的“自动打开结构比较”,然后在比较编辑器中选择“Java结构比较”。
答案 7 :(得分:1)
查看https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools特别是列结构化比较。
目前只有两种工具可以理解语言结构。
不幸的是,许多工具仍然将此列清空。