Pembaruan / peringatan: Jawaban ini mungkin kedaluwarsa!
Satu perbedaan utama adalah bahwa ANTLR menghasilkan parser LL (*), sedangkan YACC dan Bison keduanya menghasilkan parser yang LALR. Ini adalah perbedaan penting untuk sejumlah aplikasi, operator yang paling jelas:
expr ::= expr '+' expr
| expr '-' expr
| '(' expr ')'
| NUM ;
ANTLR sepenuhnya tidak mampu menangani tata bahasa apa adanya. Untuk menggunakan ANTLR (atau generator parser LL lainnya), Anda perlu mengubah tata bahasa ini menjadi sesuatu yang tidak rekursif kiri. Namun, Bison tidak memiliki masalah dengan tata bahasa bentuk ini. Anda perlu mendeklarasikan '+' dan '-' sebagai operator asosiatif kiri, tetapi itu tidak sepenuhnya diperlukan untuk rekursi kiri. Contoh yang lebih baik mungkin dikirim:
expr ::= expr '.' ID '(' actuals ')' ;
actuals ::= actuals ',' expr | expr ;
Perhatikan bahwa keduanya expr
danactuals
aturannya bersifat rekursif kiri. Ini menghasilkan AST yang jauh lebih efisien ketika tiba saatnya untuk pembuatan kode karena ia menghindari kebutuhan akan banyak register dan tumpahan yang tidak perlu (pohon yang condong ke kiri dapat runtuh sedangkan pohon yang condong ke kanan tidak bisa).
Dalam hal selera pribadi, saya pikir bahwa tata bahasa LALR jauh lebih mudah untuk dibangun dan di-debug. Kelemahannya adalah Anda harus berurusan dengan kesalahan yang agak samar seperti mengurangi-shift dan (mengurangi yang ditakuti) mengurangi-mengurangi. Ini adalah kesalahan yang ditangkap Bison saat membuat parser, sehingga tidak memengaruhi pengalaman pengguna akhir, tetapi ini dapat membuat proses pengembangan menjadi sedikit lebih menarik. ANTLR umumnya dianggap lebih mudah digunakan daripada YACC / Bison karena alasan ini.
Perbedaan paling signifikan antara YACC / Bison dan ANTLR adalah jenis tata bahasa yang dapat diproses oleh alat ini. YACC / Bison menangani tata bahasa LALR, ANTLR menangani tata bahasa LL.
Seringkali, orang yang telah bekerja dengan tata bahasa LALR untuk waktu yang lama, akan merasa bekerja dengan tata bahasa LL lebih sulit dan sebaliknya. Itu tidak berarti bahwa tata bahasa atau alat secara inheren lebih sulit untuk dikerjakan. Alat mana yang Anda temukan lebih mudah digunakan sebagian besar akan terbiasa dengan jenis tata bahasa.
Sejauh keuntungan pergi, ada aspek di mana tata bahasa LALR memiliki keunggulan dibandingkan tata bahasa LL dan ada aspek lain di mana tata bahasa LL memiliki keunggulan dibandingkan tata bahasa LALR.
YACC / Bison menghasilkan parser yang digerakkan oleh tabel, yang berarti "logika pemrosesan" terkandung dalam data program parser, tidak begitu banyak dalam kode parser. Bayarannya adalah bahwa bahkan parser untuk bahasa yang sangat kompleks memiliki jejak kode yang relatif kecil. Ini lebih penting pada 1960-an dan 1970-an ketika perangkat keras sangat terbatas. Generator parser yang digerakkan oleh tabel kembali ke era ini dan jejak kode kecil adalah persyaratan utama saat itu.
ANTLR menghasilkan parser keturunan rekursif, yang berarti "logika pemrosesan" terkandung dalam kode parser, karena setiap aturan produksi tata bahasa diwakili oleh fungsi dalam kode parser. Hasilnya adalah bahwa lebih mudah untuk memahami apa yang dilakukan parser dengan membaca kodenya. Juga, parser keturunan rekursif biasanya lebih cepat daripada yang digerakkan oleh tabel. Namun, untuk bahasa yang sangat kompleks, jejak kode akan lebih besar. Ini adalah masalah di tahun 1960-an dan 1970-an. Saat itu, hanya bahasa yang relatif kecil seperti Pascal misalnya yang diimplementasikan dengan cara ini karena keterbatasan perangkat keras.
Parser yang dihasilkan ANTLR biasanya di sekitar 10.000 baris kode dan banyak lagi. Pengurai keturunan rekursif tulisan tangan sering berada di stadion baseball yang sama. Kompiler Oberon milik Wirth mungkin adalah yang paling ringkas dengan sekitar 4000 baris kode termasuk pembuatan kode, tetapi Oberon adalah bahasa yang sangat kompak dengan hanya sekitar 40 aturan produksi.
Seperti yang telah ditunjukkan oleh seseorang, nilai tambah besar untuk ANTLR adalah alat IDE grafis, yang disebut ANTLRworks. Ini adalah laboratorium desain tata bahasa dan bahasa yang lengkap. Ini memvisualisasikan aturan tata bahasa Anda saat Anda mengetiknya dan jika menemukan konflik, itu akan menunjukkan kepada Anda secara grafis apa konflik itu dan apa yang menyebabkannya. Ia bahkan dapat secara otomatis memperbaiki dan menyelesaikan konflik seperti rekursi kiri. Setelah Anda memiliki tata bahasa bebas konflik, Anda dapat membiarkan ANTLRworks mengurai file input bahasa Anda dan membangun parse tree dan AST untuk Anda dan memperlihatkan pohon tersebut secara grafis dalam IDE. Ini adalah keuntungan yang sangat besar karena dapat menghemat banyak waktu kerja: Anda akan menemukan kesalahan konseptual dalam desain bahasa Anda sebelum Anda mulai membuat kode! Saya belum menemukan alat semacam itu untuk tata bahasa LALR, sepertinya tidak ada alat seperti itu.
Bahkan untuk orang-orang yang tidak ingin membuat parser mereka tetapi memberikan kode mereka, ANTLRworks adalah alat yang hebat untuk desain / prototipe bahasa. Sangat mungkin alat terbaik yang tersedia. Sayangnya, itu tidak membantu Anda jika Anda ingin membuat parser LALR. Beralih dari LALR ke LL hanya untuk memanfaatkan ANTLRwork mungkin bermanfaat, tetapi bagi sebagian orang, beralih jenis tata bahasa bisa menjadi pengalaman yang sangat menyakitkan. Dengan kata lain: YMMV.
sumber
Beberapa keuntungan untuk ANTLR:
$ 0,02 saya
sumber
Keuntungan lain dari ANTRL adalah Anda dapat menggunakan ANTLRWORKS , meskipun saya tidak dapat mengatakan bahwa ini adalah keuntungan yang ketat, karena mungkin ada alat serupa untuk generator lain juga.
sumber
Penggunaan memori Bison / Flex biasanya sekitar satu mbyte atau lebih. Bandingkan dengan antlr - dengan asumsi ia menggunakan memori 512 byte untuk setiap token dalam file yang ingin Anda parse. 4 juta token dan Anda kehabisan memori virtual pada sistem 32-bit.
Jika file yang ingin Anda parse besar, antlr mungkin kehabisan memori, jadi jika Anda hanya ingin mem-parsing file konfigurasi, itu akan menjadi solusi yang layak. Kalau tidak, jika Anda ingin mem-parsing file dengan banyak data, coba Bison.
sumber