Mengapa GCC beralih dari Bison ke parser keturunan rekursif untuk C ++ dan C?

10

Apakah ada perubahan bahasa yang mengharuskannya atau alasan praktis mengapa Bison tidak lagi sesuai atau optimal?

Saya melihat di wikipedia bahwa mereka beralih, merujuk pada catatan rilis GCC 3.4 dan GCC 4.1 .

Catatan rilis ini menyatakan:

Pengurai C ++ recursive-descent yang ditulis tangan telah menggantikan pengurai C ++ yang diturunkan dari YACC dari rilis GCC sebelumnya. Parser baru berisi banyak infrastruktur yang ditingkatkan yang diperlukan untuk penguraian kode sumber C ++ yang lebih baik, penanganan ekstensi, dan pemisahan bersih (jika mungkin) antara analisis semantik yang tepat dan penguraian. Parser baru memperbaiki banyak bug yang ditemukan di Parser lama.

Dan:

Parser C dan Objective-C berbasis Bison yang lama telah digantikan oleh pengurai turunan rekursif-keturunan baru yang lebih cepat.

Yang ingin saya ketahui adalah masalah aktual apa yang mereka hadapi dan mengapa tidak mungkin / tidak praktis untuk diselesaikan menggunakan Bison

neelsg
sumber
1
akhirnya semua parser akan menjadi homebrewn setelah modifikasi yang cukup ketika generator parser tidak dapat menangani persyaratan
ratchet freak
1
Berbagi penelitian Anda membantu semua orang . Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling utama itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
1
@gnat, saya memperluas pertanyaan saya
neelsg
1
C ++ adalah bahasa yang sangat kompleks untuk diurai dibandingkan dengan kebanyakan bahasa pemrograman lainnya. Perasaan saya adalah parser serba guna yang mungkin tidak dapat mendukung optimasi tertentu yang dapat digunakan parser buatan sendiri.

Jawaban:

16

GCC beralih ke penguraian tulisan tangan karena pesan kesalahan lebih bermakna ketika menggunakan teknik keturunan rekursif, seperti yang saya jelaskan di sini .

Juga, C ++ menjadi bahasa yang kompleks (secara sintaksis) untuk mem-parsing sehingga penggunaan generator parser tidak berguna untuk itu.

Akhirnya, sebagian besar pekerjaan kompiler nyata tidak parsing, itu mengoptimalkan. Pass optimasi GCC middle end jauh lebih kompleks daripada parsingnya.

(BTW Anda dapat menyesuaikan GCC misalnya dengan plugin atau menggunakan MELT , tetapi Anda tidak dapat benar-benar memperpanjang sintaks bahasa yang diterima - kecuali dengan menambahkan atribut dan pragma).

Basile Starynkevitch
sumber