【问题标题】:Normalizing variable names C/C++规范化变量名 C/C++
【发布时间】:2013-05-07 10:02:10
【问题描述】:

我目前正在开发一种工具,该工具将比较两个文件并报告其差异。我想实现一个功能来比较两种方法,并报告它们是否相同(同时忽略变量名更改)。我想做的是将所有变量名标准化为 (x0,x1 ..) 或类似的东西。然后对方法进行排序(按字母顺序?),以便顺序相同。获取它们的校验和,然后比较两者。

我的问题:

如何规范化 C/C++ 文件中的变量名? 或者 您对我如何实现该功能还有其他想法吗?

问候

【问题讨论】:

  • 请告诉我们您如何解析源代码...
  • 是的,只是识别哪个变量使用对应哪个变量声明远非微不足道。
  • 您可以根据稳定的可重复排序将“令牌”(变量名)映射到实习形式,如上所述。
  • 看看CPD 多年来使用的算法。它目前使用Karp-Rabin
  • 看这里 ieeexplore.ieee.org/xpl/… 我记得 LCS 可以以某种方式使用

标签: c++ c variables gcc normalization


【解决方案1】:

如果您能提出可重复且稳定的排序,您可以将“令牌”(变量名)映射到“实习形式”,如上所述。

这并不试图理解 标记如何解析,只是它们以相同的模式出现在两个源文件中。 “令牌”将是 C/C++ 保留字以外的所有内容,不需要认真的解析/词法分析。

完成此操作后,您可以将 cmets 和空格转换为规范形式。

这对我来说大部分用处不大,但我相信它会达到 99.9% 或更好的解决问题的能力——可以想象它可能会被愚弄,但实际上不太可能。

当然,如果我们也有必须处理的宏......也许你可以在它们上运行 C 预处理器来实现它,如果这是一个要求?

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    当然,这不是关于规范名称,而是关于确定这两个方法是否对类中的相同事物执行相同的操作。这意味着解析源代码并从中构建某种数据结构[可能是“树”]。一旦你有了这棵树,这样的名字就变得毫无意义了。例如,您可能需要跟踪类成员变量所引用的 OFFSET 以及类中的哪些虚函数。

    我不认为这是微不足道的(除非您将代码限制为 C++ 代码的一小部分),因为有很多不同的方法可以让某件事情做同样的事情,只是细微的差别就会消失用最复杂的工具做任何事情。例如。

    class A
    {
       private:
         int arr[10];
         ...
       public:
         int sum()
         {
            int r = 0;
            for(i = 0; i < 10; i++)
                r += arr[i];
            return r;
         }
    }
    
    
    class B
    {
       private:
         int arr[10];
         ...
       public:
         int sum()
         {
            int r = 0;
            int *p = arr;
            for(i = 0; i < 10; i++)
                r += *p++;
            return r;
         }
         .... 
    }
    

    这两个函数做同样的事情。

    【讨论】:

      【解决方案3】:

      如何使用 gcc 在编译期间生成的临时树表示,gcc 有一个命令行开关来保存临时文件:

      gcc -save-temps <file>
      

      此代码有些简化,名称统一。问题是识别原始文件中的差异。 不要使用优化!

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多