Saya sedang meneliti tentang suite kompiler gcc di wikipedia di sini , ketika ini muncul:
GCC mulai menggunakan parser LALR yang dibuat dengan Bison, tetapi secara bertahap beralih ke parser rekursif-keturunan yang ditulis tangan; untuk C ++ pada tahun 2004, dan untuk C dan Objective-C pada tahun 2006. Saat ini semua ujung depan menggunakan parser recursive-descent yang ditulis tangan.
Jadi dengan kalimat terakhir itu, (dan sebanyak yang saya percayai wikipedia) saya pasti dapat mengatakan bahwa "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Merkuri, Modula-2, Modula-3, PL / I, D (gdc), dan VHDL (ghdl) "semuanya adalah ujung depan yang tidak ada lagi gunakan generator parser. Artinya, mereka semua menggunakan parser tulisan tangan.
Pertanyaan saya kemudian, apakah praktik ini ada di mana-mana? Secara khusus, saya mencari jawaban yang tepat untuk "apakah implementasi standar / resmi x memiliki parser tulisan tangan" untuk x dalam [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (Sebenarnya, informasi tentang bahasa lain juga diterima di sini.) Saya yakin saya dapat menemukannya sendiri setelah banyak menggali. Tapi saya juga yakin ini mudah dijawab oleh masyarakat. Terima kasih!
Jawaban:
AFAIK, GCC menggunakan parser yang ditulis tangan khususnya untuk meningkatkan diagnostik kesalahan sintaksis (yaitu memberikan pesan bermakna pada manusia tentang kesalahan sintaksis).
Teori parsing (dan generator parsing turun darinya) sebagian besar tentang mengenali dan parsing frase input yang benar . Tetapi kami berharap dari kompiler bahwa mereka memberikan pesan kesalahan yang bermakna (dan bahwa mereka dapat mengurai secara bermakna sisa input setelah kesalahan sintaksis), untuk beberapa input yang salah.
Juga, bahasa lawas lama -seperti C11 atau C ++ 11- (yang secara konsep sudah lama, bahkan jika revisi terakhir mereka baru berusia tiga tahun) sama sekali tidak bebas konteks. Berurusan dengan sensitivitas konteks dalam tata bahasa untuk generator parser (yaitu bison atau bahkan menhir ) sangat sulit.
sumber
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult
. Ini juga kurang lebih mungkin karena alat ini menghasilkan parser bebas konteks. Tempat yang benar untuk memeriksa apakah semua kendala peka konteks ada setelah Anda membuat parse tree jika Anda menggunakan alat seperti ini.Generator Parser dan mesin parser cukup umum. Keuntungan dari generalitas adalah membangun parser yang akurat dengan cepat dan membuatnya berfungsi dengan mudah, dalam skema keseluruhan.
Mesin parser sendiri mengalami masalah kinerja karena sifatnya yang umum. Kode tulisan tangan apa pun akan selalu jauh lebih cepat daripada mesin parser yang digerakkan oleh tabel.
Area kedua di mana generator parser / mesin mengalami kesulitan adalah bahwa semua bahasa pemrograman nyata adalah konteks sensitif, seringkali dengan cara yang cukup halus. Bahasa LR bebas konteks, artinya ada banyak seluk-beluk tentang penentuan posisi dan lingkungan yang tidak mungkin disampaikan dengan benar dalam sintaksis. Grammers yang dikaitkan mencoba untuk mengatasi aturan bahasa dasar seperti "menyatakan sebelum digunakan", dll. Pengkabelan sensitivitas konteks ini menjadi kode tulisan tangan sangat mudah.
sumber