Ada teorema rakyat yang mengatakan C sulit untuk diurai, dan C ++ pada dasarnya tidak mungkin.
Itu tidak benar.
Yang benar adalah bahwa C dan C ++ cukup sulit diurai menggunakan parser LALR (1) tanpa meretas mesin parsing dan kusut dalam data tabel simbol. GCC sebenarnya dulu mem-parse mereka, menggunakan YACC dan peretasan tambahan seperti ini, dan ya itu jelek. Sekarang GCC menggunakan parser tulisan tangan, tetapi masih dengan hackery tabel simbol. Orang-orang Clang tidak pernah mencoba menggunakan generator parser otomatis; AFAIK the Clang parser selalu merupakan turunan rekursif dengan kode tangan.
Yang benar, adalah bahwa C dan C ++ relatif mudah diurai dengan parser otomatis yang lebih kuat, misalnya, pengurai GLR , dan Anda tidak memerlukan peretasan apa pun. The Elsa C ++ parser adalah salah satu contoh dari ini. Kami C ++ Front End adalah lain (seperti semua "compiler" ujung depan kami, GLR adalah teknologi parsing cukup indah).
Bagian depan C ++ kami tidak secepat GCC, dan tentunya lebih lambat dari Elsa; kami telah mencurahkan sedikit energi untuk menyesuaikannya dengan hati-hati karena kami memiliki masalah lain yang lebih mendesak (bahkan telah digunakan pada jutaan baris kode C ++). Elsa mungkin lebih lambat dari GCC hanya karena lebih umum. Mengingat kecepatan prosesor saat ini, perbedaan ini mungkin tidak terlalu menjadi masalah dalam praktiknya.
Tetapi "penyusun sebenarnya" yang didistribusikan secara luas saat ini berakar pada penyusun 10 atau 20 tahun yang lalu atau lebih. Inefisiensi kemudian menjadi lebih penting, dan tidak ada yang pernah mendengar tentang pengurai GLR, jadi orang melakukan apa yang mereka tahu bagaimana melakukannya. Dentang pasti lebih baru, tetapi teorema rakyat mempertahankan "persuasif" mereka untuk waktu yang lama.
Anda tidak harus melakukannya dengan cara itu lagi. Anda dapat menggunakan GLR dan pengurai lainnya dengan sangat wajar sebagai ujung depan, dengan peningkatan dalam pemeliharaan kompiler.
Apa yang benar, adalah bahwa mendapatkan tata bahasa yang sesuai perilaku ramah lingkungan Anda compiler sulit. Meskipun hampir semua kompiler C ++ menerapkan (sebagian besar) standar asli, mereka juga cenderung memiliki banyak ekstensi sudut gelap, misalnya, spesifikasi DLL dalam kompiler MS, dll. Jika Anda memiliki mesin parsing yang kuat, Anda dapat menghabiskan waktu Anda mencoba untuk mendapatkannya tata bahasa akhir agar sesuai dengan kenyataan, daripada mencoba mengubah tata bahasa Anda agar sesuai dengan batasan generator parser Anda.
EDIT November 2012: Sejak menulis jawaban ini, kami telah meningkatkan front end C ++ kami untuk menangani C ++ 11 lengkap, termasuk dialek varian ANSI, GNU, dan MS. Meskipun ada banyak hal tambahan, kami tidak perlu mengubah mesin parsing kami; kami baru saja merevisi aturan tata bahasa. Kami memang harus mengubah analisis semantik; C ++ 11 secara semantik sangat rumit, dan pekerjaan ini membebani upaya untuk menjalankan parser.
EDIT Februari 2015: ... sekarang menangani C ++ 14 penuh. (Lihat mendapatkan AST yang dapat dibaca manusia dari kode c ++ untuk parse GLR dari sedikit kode sederhana, dan C ++ yang terkenal "parse paling menjengkelkan").
EDIT April 2017: Sekarang menangani (draf) C ++ 17.