2013-05-07 3 views
2

В настоящее время я работаю над инструментом, который будет сравнивать два файла и сообщать о его различиях. Я хочу реализовать функцию, которая будет сравнивать два метода и сообщать, если они идентичны (при игнорировании изменений имени переменной). То, что я думал о том, чтобы делать, - это нормализовать все имена переменных (x0, x1 ..) или что-то похожее. Затем сортируйте методы (по алфавиту?), Чтобы порядок был одинаковым. Охватите свои контрольные суммы, а затем сравните их.Нормализация имен переменных C/C++

Мой вопрос:

Как я нормализуют имена переменных в файле в C/C++? или Есть ли у вас какие-либо другие идеи относительно того, как я могу реализовать эту функцию?

С уважением

+4

, пожалуйста, расскажите, как вы разобрали источник ... –

+0

Да, только определение того, какое использование переменной соответствует тому, какое объявление переменной далека от тривиального. – john

+0

Вы можете сопоставить «токены» (имена переменных) с интернированными формами, как описано выше, в соответствии со стабильным повторяемым порядком. –

ответ

1

Вы можете сопоставить «токены» (имена переменных) с «интернированной формой», как описано выше, если вы можете создать устойчивый порядок повторяемости &.

Это не пытается понять как токены разрешают, просто они присутствуют в одном шаблоне в двух исходных файлах. «Токены» - это все, кроме зарезервированных слов на C/C++, без серьезного разбора/лексинга.

После того, как вы это сделали, вы можете конвертировать комментарии & пробелы в каноническую форму.

Это не было бы полезным для меня, но я полагаю, что он достигнет 99,9% или лучше ударит по этой проблеме - вполне возможно, что его можно обмануть, но практически не очень вероятно.

Конечно, если у нас есть макросы, они тоже должны обрабатываться .. возможно, вы можете запустить предварительный процессор C на них, чтобы выполнить это, если это требование?

Надеюсь, это поможет.

0

Конечно, это не о нормализации имен, но о выяснить, если эти два метода делают то же самое с той же вещи в классе. Это означает синтаксический анализ исходного кода и построение некоторой структуры данных [вероятно, «дерева»]. Когда у вас будет дерево, имена как таковые станут бессмысленными. Вам, возможно, потребуется отслеживать, например, что относится к 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; 
    } 
    .... 
} 

Эти две функции выполняют то же самое.

0

Что об использовании временного представления дерева GCC генерирует во время компиляции, GCC имеет командную строку отбой для сохранения временных файлов:

gcc -save-temps <file> 

Этого код несколько упрощенный и имена унифицированы. Проблема состоит в том, чтобы идентифицировать различия в исходном файле. Не используйте Оптимизацию!

Смежные вопросы