Yorum yakalamadan kaynak kodu nasıl grep


10

Yorumlar nedeniyle bazen yanlış pozitif olmadan kaynak kodu grep için bir yol arar. Örneğin, bu .c kaynak kodunda foo üzerinde arama yaparsam:

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

Bir naif grepsadece bir tane istediğim 3 olayı bulur. StackOverflow bunu yapmak için bu şekilde gördüm , ama benim ihtiyaçlarını doldurmaz: PHP platformda kullanılamaz. Tek satırlık yorumlar için de bu yolu buldum , ancak sorunumun sadece bir kısmını çözdü.

Klasik kodlama araçlarını (awk, sed, bash, grep, vb.) Kullanmam gerekiyor ve binlerce dosya olsa bile hızlı olması gerekiyor .

Şimdi sadece kaynak kodu ve sadece kaynak kodu grep mümkün olup olmadığını ve nasıl?


3
Bir etiket tablosu oluşturmak , ne yaptığınıza bağlı olarak daha iyi bir yaklaşım olabilir.
Gilles 'SO

Yanıtlar:


10

Bunun gibi yorum olmayanlarla eşleşmek için naif bir yaklaşım deneyebilirsiniz:

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

Öneki yorumlara karşı Bunu yaptığınızda yalnızca ters maç - çizgiler ya ile başlayan olup //, /*, *veya */dolayısıyla onunla yorum haline bloklar dışarı bırakmaz edeceğiz - /*ve */çifti.


Girintili yorumlar için çalışmak için biraz değiştirildi: $ egrep -v "^ [[: space:]] * ((// | / * | *)" kaynak kodu
mbonness

11

grep saf metin üzerinde çalışır ve C programınızın temel sözdizimi hakkında hiçbir şey bilmez. Bu nedenle, yorumların içinde arama yapmamak için birkaç seçeneğiniz vardır:

  1. Aramadan önce C-yorumlarını şeritleyin, bunu kullanarak gcc -fpreprocessed -dD -E yourfile.cayrıntılar için lütfen /programming/2394017/remove-comments-from-cc-code adresine bakın.

  2. Olası tüm C / C ++ yorumlarının ayrıntılarını işlemek için zaten bulduğunuz gibi bazı yarı çalışan komut dosyaları yazın (örneğin //veya ile başlayan satırları atlayarak çalışırlar /*) (yine, bazı korkunç test senaryoları için önceki bağlantıya bakın) . O zaman hala yanlış pozitifleriniz olabilir, ancak hiçbir şeyi ön işlemek zorunda değilsiniz.

  3. Kodda "anlamsal arama" yapmak için daha gelişmiş araçlar kullanın. Ben "coccigrep" buldum: http://home.regit.org/software/coccigrep/ Bu tür araçlar bazı belirli dil ifadeleri (yani verilen adla bir yapının güncellenmesi) için arama sağlar ve kesinlikle yorum bırakın.


1

İşte bu soruya geç gelenlerin geri kalanı için özel bir varyasyon:

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 kaynak dosyalarının listesi

ls -1 src/*.c

bir alt kabukta önişlemciyi yürüten xargs'e bağlanır

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

daha sonra istenen bir grep komutuna aktarılır

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

daha sonra her satıra mevcut dosya adının önekini eklemek için sed içine pipetlenir

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

Son olarak, tekrarlanan tüm boş satırlar cat kullanılarak tek satırlara daraltılır:

cat -s

Bu bir RHEL6 sistemi üzerinde çalışır, ancak diğer * nix sistemleri için yeterince genel olduğunu varsayıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.