Как получить исходный код без перехвата комментариев

10

Я ищу способ поиска исходного кода без порой ложных срабатываний из-за комментариев. Например, если я ищу foo в этом исходном коде .c:

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

Наивный grepнайдет 3 случая, где мне нужен только один. Я видел этот способ сделать это на StackOverflow, но он не удовлетворяет мои потребности: PHP не доступен на платформе. Я также нашел этот способ для однострочных комментариев, но это решает только часть моей проблемы.

Мне нужно использовать классические скриптовые инструменты (awk, sed, bash, grep и т. Д.), И мне нужно, чтобы это было быстро, даже если есть тысячи файлов.

Знаете ли вы сейчас, если и как можно получить доступ к исходному коду и только к исходному коду?

Корен
источник
3
Создание таблицы тегов может быть лучшим подходом, в зависимости от того, что вы делаете.
Жиль "ТАК - перестань быть злым"

Ответы:

10

Вы можете попробовать наивный подход, чтобы сопоставить не комментарии, как это:

 $ egrep -v "^(//|/\*| \*)" sourcecode

Это будет только обратный матч с префиксами комментариев - это строки , начинающиеся с любой //, /*, *или */- и , следовательно, не уеду из блоков, которые закомментированные с /*и */парой.


источник
Немного изменен для работы с отступом комментариев: $ egrep -v "^ [[: space:]] * ((// | / * | *)" исходный код
мобильность
11

grep работает с чистым текстом и ничего не знает о базовом синтаксисе вашей C-программы. Поэтому, чтобы не искать внутри комментариев, у вас есть несколько вариантов:

  1. Уберите C-комментарии перед поиском, вы можете сделать это, используя gcc -fpreprocessed -dD -E yourfile.cПодробнее. Пожалуйста, смотрите /programming/2394017/remove-comments-from-cc-code

  2. Напишите / используйте некоторые хакерские полуработающие скрипты, которые вы уже нашли (например, они работают, пропуская строки, начинающиеся с //или /*), чтобы обрабатывать детали всех возможных комментариев C / C ++ (опять же, смотрите предыдущую ссылку для некоторых страшных тестовых случаев) , Тогда у вас все еще могут быть ложные срабатывания, но вам не нужно ничего предварительно обрабатывать.

  3. Используйте более продвинутые инструменты для выполнения «семантического поиска» в коде. Я нашел "coccigrep": http://home.regit.org/software/coccigrep/ Этот вид инструментов позволяет искать некоторые специфические языковые операторы (например, обновление структуры с заданным именем) и, конечно, они сбрасывают комментарии.

dying_sphynx
источник
1

Вот конкретный вариант для всех нас, опоздавших на этот вопрос:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

Список исходных файлов C

ls -1 src/*.c

передаются в xargs, который выполняет препроцессор в дочерней оболочке

gcc -fpreprocessed -dD -E {} 2>&1

который впоследствии передается в желаемую команду grep

grep -wi -e one -e two -e three -n

который затем передается в sed для префикса каждой строки с текущим именем файла

sed 's:^:{}\::'

Наконец, все повторяющиеся пустые строки свернуты в одну строку с помощью cat:

cat -s

Это работает в системе RHEL6, но я предполагаю, что она достаточно общая для других систем * nix.

Дэвид А. Пиментел
источник