Como fazer o código fonte sem pegar comentários

10

Eu pesquiso uma maneira de obter código-fonte sem ter, às vezes, um falso positivo por causa dos comentários. Por exemplo, se eu pesquisar no foo sobre este código-fonte:

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

Um ingênuo grep encontrará 3 ocorrências em que eu quero apenas uma. Eu vi dessa maneira para fazer isso no StackOverflow , mas não preenche minhas necessidades: o PHP não está disponível na plataforma. Eu também encontrei desta maneira para comentários de uma linha, mas só resolve uma parte do meu problema.

Eu preciso usar ferramentas clássicas de script (awk, sed, bash, grep, etc) e eu preciso que ele seja rápido mesmo se houver milhares de arquivos.

Você agora se e como é possível fazer um código-fonte e apenas o código-fonte?

    
por Coren 01.03.2012 / 09:59

3 respostas

10

Você pode tentar uma abordagem ingênua para corresponder a não-comentários como este:

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

Isso só inverte a correspondência com os comentários prefixados - ou seja, linhas iniciando com // , /* , * ou */ - e, portanto, não excluirá os blocos comentados com a /* e */ par.

    
por 01.03.2012 / 10:15
10
O

grep trabalha em texto puro e não sabe nada sobre a sintaxe subjacente do seu programa em C. Portanto, para não pesquisar nos comentários, você tem várias opções:

  1. Desmarque comentários C antes da pesquisa, você pode fazer isso usando gcc -fpreprocessed -dD -E yourfile.c Para mais detalhes, consulte

  2. Escreva / use alguns scripts que funcionam meio hacky como você já encontrou (por exemplo, eles funcionam ignorando as linhas que começam com // ou /* ) para lidar com os detalhes de todos os possíveis comentários em C / C ++ (mais uma vez, veja o link anterior para alguns testes difíceis). Então você ainda pode ter falsos positivos, mas não precisa pré-processar nada.

  3. Use ferramentas mais avançadas para fazer "pesquisa semântica" no código. Eu encontrei "coccigrep": link Esse tipo de ferramenta permite procurar por algumas declarações de linguagem específicas (ou seja, uma atualização de um estrutura com nome próprio) e certamente eles deixam os comentários.

por 01.03.2012 / 12:22
0

Aqui está uma variação específica para todos os demais que chegam tarde a esta pergunta:

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

Uma lista se os arquivos de origem C

ls -1 src/*.c

são canalizados para xargs, que executa o pré-processador em um shell filho

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

que é subsequentemente canalizado para um comando grep desejado

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

que é então enviado ao sed para prefixar cada linha com o nome do arquivo atual

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

Finalmente, todas as linhas em branco repetidas são reduzidas a linhas simples usando cat:

cat -s

Isso funciona em um sistema RHEL6, mas suponho que seja geral o suficiente para outros sistemas * nix.

    
por 06.06.2017 / 16:12