Apa adalah beberapa alat yang baik untuk mendapatkan mulai cepat untuk parsing dan menganalisis C/C++ code?
Secara khusus, saya'm mencari alat open source yang menangani C/C++ preprocessor dan bahasa. Sebaiknya, alat ini akan menggunakan lex/yacc (atau flex/bison) untuk tata bahasa, dan tidak terlalu rumit. Mereka harus menangani terbaru ANSI C/C++ definisi.
Berikut ini's apa yang saya've ditemukan sejauh ini, tapi belum't melihat mereka secara rinci (pikiran?):
I'm berharap untuk menggunakan ini sebagai titik awal untuk menerjemahkan sumber C/C++ menjadi mainan baru itu.
Terima kasih!!! -Matt
(Ditambahkan 2/9): Hanya sebuah klarifikasi: saya ingin mengekstrak informasi semantik dari preprocessor selain C/C++ kode itu sendiri. Saya don't "#define foo 42" menghilang ke integer "42", tapi tetap melekat pada nama "anu". Ini, sayangnya, tidak termasuk beberapa solusi yang menjalankan preprocessor pertama dan satu-satunya memberikan C/C++ parse tree)
Parsing C++ adalah sangat sulit karena tata bahasa undecidable. Untuk penawaran Yossi Kreinin:
luar Biasa rumit tata bahasa
"Biasa" harus diartikan secara harfiah, karena semua bahasa populer memiliki context-free (atau "hampir" bebas konteks) tata bahasa, sedangkan C++ memiliki undecidable tata bahasa. Jika anda suka compiler dan parser, anda mungkin tahu apa artinya ini. Jika anda're tidak menjadi hal-hal semacam ini, ada's contoh sederhana menunjukkan masalah dengan parsing C++: adalah
AA BB(CC);
objek definisi atau deklarasi fungsi? Ternyata jawabannya sangat bergantung pada kode sebelum pernyataan - "konteks". Hal ini menunjukkan (pada tingkat intuitif) bahwa C++ tata bahasa cukup konteks-sensitif.
The ANTLR parser generator memiliki tata untuk C/C++ serta preprocessor. I've tidak pernah menggunakannya jadi saya bisa't mengatakan bagaimana menyelesaikan parsing C++ akan menjadi. ANTLR itu sendiri telah menjadi alat yang berguna bagi saya pada beberapa kesempatan untuk parsing jauh lebih sederhana bahasa.
Tergantung pada masalah anda GCCXML mungkin menjadi jawaban anda. Pada dasarnya itu mem-sumber menggunakan GCC dan kemudian memberikan anda dengan mudah dicerna XML parse tree. Dengan GCCXML anda adalah dilakukan sekali dan untuk semua.
pycparser lebih lengkap parser untuk C (C99) yang ditulis dalam Python. Ini telah sepenuhnya dikonfigurasi AST backend, sehingga's yang digunakan sebagai dasar untuk setiap jenis pengolahan bahasa yang anda mungkin perlu.
Doesn't dukungan C++, meskipun. Memang, itu's banyak lebih sulit daripada C.
Update (2012): untuk saat ini jawabannya, tanpa keraguan, akan Dentang - it's modular, mendukung penuh C++ (dengan banyak C++-11 fitur) dan memiliki relatif ramah basis kode. Ini juga memiliki C API for binding untuk bahasa tingkat tinggi (yaitu untuk Python).
Lihatlah bagaimana doxygen karya, kode sumber lengkap tersedia dan's flex-based.
Yang menyesatkan calon EMAS yang gratis berbasis Windows parser toolkit secara eksplisit untuk menciptakan penerjemah. Daftar supported languages mengacu pada bahasa-bahasa di mana satu dapat melaksanakan parser, tidak daftar yang didukung mengurai tata bahasa.
Mereka hanya memiliki tata bahasa C dan C#, C++.
Parsing C++ adalah sangat kompleks tantangan.
Ada's Dorongan/Semangat kerangka, dan beberapa tahun yang lalu mereka melakukannya bermain-main dengan menerapkan C++ parser, tapi itu's jauh dari lengkap.
Sepenuhnya dan benar parsing ISO C++ adalah jauh dari sepele, dan ada sebenarnya banyak terkait upaya. Tapi itu adalah inheren pekerjaan yang kompleks yang isn't mudah dicapai, tanpa menulis ulang lengkap compiler frontend memahami semua C++ dan preprocessor. Pra-prosesor implementasi yang disebut "gelombang" tersedia dari Roh orang-orang.
Yang mengatakan, anda mungkin ingin melihat-lihat di babi/oink (elsa-based), yang merupakan C++ parser toolkit khusus dimaksudkan untuk digunakan untuk kode sumber transformasi tujuan, hal ini sedang digunakan oleh proyek Mozilla untuk melakukan skala besar statis source code analisis dan otomatis menulis ulang kode, bagian yang paling menarik adalah bahwa hal itu tidak hanya mendukung sebagian besar dari C++, tetapi juga preprocessor itu sendiri!
Di sisi lain ada's memang salah satu solusi proprietary yang tersedia: EDG frontend, yang dapat digunakan untuk hampir semua C++ terkait upaya.
Secara pribadi, saya akan memeriksa elsa berbasis daging babi/oink suite yang digunakan di Mozilla, terlepas dari itu, FSF telah disetujui bekerja pada gcc plugin menggunakan runtime library lisensi, sehingga saya'd mengasumsikan bahwa hal-hal akan berubah dengan cepat, setelah orang-orang dapat dengan mudah memanfaatkan gcc berbasis C++ parser untuk tujuan tersebut menggunakan biner plugin.
Jadi, singkatnya: jika anda bucks: EDG, jika anda membutuhkan sesuatu yang gratis/open source sekarang: lain/oink cukup menjanjikan, jika anda memiliki beberapa waktu, anda mungkin ingin menggunakan gcc untuk proyek anda.
Pilihan lain hanya untuk kode C adalah cscout.
Dalam bahasa C++ adalah semacam sangat berbulu. Ada's baik benang di Lambda tentang hal itu, tetapi intinya adalah bahwa C++ tata bahasa dapat memerlukan sewenang-wenang banyak lookahead.
Untuk jenis hal yang saya bayangkan akan kau lakukan, aku'a berpikir tentang hacking yang baik Gnu CC, atau Belat. Gnu CC secara khusus tidak memisahkan bahasa generasi bagian yang cukup menyeluruh, sehingga anda mungkin menjadi yang terbaik dari bangunan baru g++ backend.
Sebenarnya, PUMA dan AspectC++ yang masih aktif dipelihara dan diperbarui. Aku melihat ke dalam menggunakan AspectC++ dan bertanya-tanya tentang kurangnya pembaruan diri. Aku e-mail penulis yang mengatakan bahwa kedua AspectC++ dan PUMA yang masih sedang dikembangkan. Anda bisa mendapatkan kode sumber melalui SVN https://svn.aspectc.org/repos atau anda bisa mendapatkan biner biasa dibangun di http://akut.aspectc.org. Seperti dengan banyak fasilitas c++ proyek di hari-hari ini, penulis doesn't memiliki waktu untuk menjaga dengan halaman web pemeliharaan. Masuk akal jika anda've mendapat pekerjaan penuh waktu dan kehidupan.
Elsa mengalahkan segala sesuatu yang lain aku tahu turun tangan untuk C++ parsing, meskipun hal ini tidak 100% sesuai. I'm kipas angin. Ada's modul yang mencetak C++, sehingga dapat menjadi titik awal yang baik untuk anda proyek mainan.
Lihat kami di C++ Front End untuk fitur lengkap C++ parser: membangun Rlangsung, tabel simbol, apakah nama dan jenis resolusi. Anda bahkan dapat mengurai dan mempertahankan preprocessor arahan. C++ dibangun di atas kami di DMS Software Reengineering Toolkit, yang memungkinkan anda untuk menggunakan informasi tersebut untuk melaksanakan sewenang-wenang perubahan kode sumber dengan menggunakan sumber-ke-sumber transformasi.
DMS adalah mesin yang ideal untuk menerapkan penerjemah.
Setelah mengatakan itu, aku don't melihat banyak gunanya anda membayangkan tugas; I don't melihat banyak nilai dalam mencoba untuk menggantikan C++, dan anda'll menemukan bangunan lengkap penerjemah sejumlah besar pekerjaan, terutama jika anda target adalah "mainan" bahasa. Dan ada kemungkinan titik kecil di parsing C++ menggunakan kuat parser, jika satu-satunya tujuan adalah untuk menghasilkan yang isomorfis versi C++ yang lebih mudah untuk mengurai (tunggu, kita mendalilkan kuat C++ sudah!).
MENGEDIT Mei 2012: DMS's C++ front end sekarang menangani GCC3/GCC4/C++11,Microsoft VisualC 2005/2010. Kokoh.
EDIT Feb 2015: Kini menangani C++14 di GCC dan MS dialek-dialek.
MENGEDIT agustus 2015: Sekarang mem-parsing dan menangkap kedua kode dan preprocessor directive dalam unified pohon.
Beberapa waktu lalu saya mencoba untuk menulis sebuah alat yang secara otomatis akan menghasilkan unit tes untuk c file.
Untuk preprosessing saya meletakkan file-file melalui GCC. Output adalah jelek tapi anda dapat dengan mudah melacak di mana dalam kode asli dari kebiasaan-kebiasaan file. Tapi untuk kebutuhan anda, anda mungkin perlu sesuatu yang lain.
Aku digunakan Meter sebagai dasar untuk C parser. Ini adalah open source dan menggunakan lex dan yacc. Hal ini membuat mudah untuk bangun dan berjalan dalam waktu singkat tanpa sepenuhnya memahami lex & yacc.
Saya juga menulis sebuah C aplikasi sejak lex & yacc solusi tidak bisa membantu saya melacak fungsi seluruh fungsi dan mengurai struktur dari seluruh fungsi dalam satu lulus. Itu menjadi unmaintainable dalam waktu singkat dan ditinggalkan.