Cara memahami kode sumber tanpa mendapat komentar

10

Saya mencari cara untuk memahami kode sumber tanpa kadang-kadang salah-positif karena komentar. Sebagai contoh jika saya mencari di foo pada kode sumber .c ini:

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

Naif grepakan menemukan 3 kejadian di mana saya hanya menginginkan satu. Saya telah melihat cara ini untuk melakukannya di StackOverflow, tetapi tidak memenuhi kebutuhan saya: PHP tidak tersedia di platform. Saya juga menemukan cara ini untuk komentar satu-baris, tetapi hanya memecahkan sebagian dari masalah saya.

Saya perlu menggunakan alat skrip klasik (awk, sed, bash, grep, dll) dan saya perlu membuatnya cepat bahkan jika ada ribuan file.

Apakah Anda sekarang jika dan bagaimana mungkin untuk memahami kode sumber, dan hanya kode sumber?

Coren
sumber
3
Membangun tabel tag mungkin merupakan pendekatan yang lebih baik, tergantung pada apa yang Anda lakukan.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

10

Anda dapat mencoba pendekatan naif untuk mencocokkan non-komentar seperti ini:

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

Ini akan cocok hanya terbalik terhadap komentar diawali - yang baris yang dimulai dengan baik //, /*, *atau */- dan karena itu tidak akan meninggalkan blok yang komentar dengan /*dan */pasangan.


sumber
Dimodifikasi sedikit agar berfungsi untuk komentar lekukan: $ egrep -v "^ [[: space:]] * ((// | / * | *)"
sourcecode
11

grep bekerja pada teks murni dan tidak tahu apa-apa tentang sintaks yang mendasari program C. Karena itu, agar tidak mencari di dalam komentar Anda memiliki beberapa opsi:

  1. Lepaskan komentar C sebelum pencarian, Anda dapat melakukan ini menggunakan gcc -fpreprocessed -dD -E yourfile.cUntuk perincian, silakan lihat /programming/2394017/remove-comments-from-cc-code

  2. Tulis / gunakan beberapa skrip setengah-kerja yang sudah rusak seperti yang sudah Anda temukan (misalnya skrip tersebut bekerja dengan melompati garis yang dimulai dengan //atau /*) untuk menangani detail semua komentar C / C ++ yang mungkin (sekali lagi, lihat tautan sebelumnya untuk beberapa testcary menakutkan) . Maka Anda mungkin masih memiliki positif palsu, tetapi Anda tidak harus melakukan preproses apa pun.

  3. Gunakan alat yang lebih canggih untuk melakukan "pencarian semantik" dalam kode. Saya telah menemukan "coccigrep": http://home.regit.org/software/coccigrep/ Alat semacam ini memungkinkan pencarian untuk beberapa pernyataan bahasa tertentu (yaitu pembaruan struktur dengan nama yang diberikan) dan tentunya mereka memberikan komentar.

dying_sphynx
sumber
1

Berikut adalah variasi spesifik untuk kita semua yang terlambat datang ke pertanyaan ini:

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

Daftar jika file sumber C

ls -1 src/*.c

disalurkan ke xargs, yang mengeksekusi preprocessor di shell anak

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

yang kemudian disalurkan ke perintah grep yang diinginkan

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

yang kemudian disalurkan ke sed untuk awalan setiap baris dengan nama file saat ini

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

Akhirnya, semua baris kosong yang diulang diciutkan menjadi satu baris menggunakan cat:

cat -s

Ini bekerja pada sistem RHEL6, tetapi saya menganggap itu cukup umum untuk sistem * nix lainnya.

David A. Pimentel
sumber