上下文感知合并?

时间:2011-02-21 15:32:36

标签: merge diff cvs semantic-analysis

是否有任何编程语言的差异/合并工具,它以语法识别的方式工作(如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 ++语法的软件,但了解其他语言的解决方案也会很有趣。

8 个答案:

答案 0 :(得分:20)

Semantic Merge
支持的语言来自网站:

  

我们从C#和Vb.net开始,然后添加了Java。现在已经支持C了,然后我们将专注于C ++,Objective-C和JavaScript,具体取决于你的   反馈

答案 1 :(得分:14)

虽然KDiff3不比较语法上下文中的语法元素,但它确实具有比“整行更改”更高的粒度,并且它将突出显示更改的行中的哪些部分。

根据我的经验,它有一个很好的检测变化的算法。鉴于上面的示例,它正确地比较了开箱即用的function_A和function_B:

Comparision of function_A and function_B

即便如此,如果算法无法匹配您想要的,例如如下所示:

Comparision of old and new function_A

您可以通过将同步标记放在要执行比较的位置来手动覆盖。

备选方案1:

Comparision of old and new function_A with sync1

备选方案2:

Comparision of old and new function_A with sync2

答案 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做了你要问的一些事情。它不能保持语法正确性或一次比较语言块,但它可以执行以下操作:

  • 对语言语法的一些理解,因此它可以对比较文件进行语法高亮,并且它还可以识别并可选地忽略不重要的差异(如评论,包括多行注释)。
  • 支持使用外部转换程序加载和保存数据。开箱即用,它支持在比较之前使用它来美化XML和HTML。在比较两个C文件之前,您可以设置GNU Indent来标准化语法。
  • 可选线宽,让您可以为匹配提供更高的权重,例如,关闭大括号。我没试过这个功能。
  • 替换,要忽略左侧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特别是列结构化比较。

目前只有两种工具可以理解语言结构。

  • 比较++(适用于C ++)
  • Pretty Diff(语言识别代码比较工具,适用于多种基于Web的语言。它还可以美化,缩小和其他一些东西..)

不幸的是,许多工具仍然将此列清空。