Lexer DFA menghasilkan kesalahan "kode terlalu besar".
Saya mencoba mengurai Halaman Server Java menggunakan ANTLR 3.
Java memiliki batas 64k untuk kode byte dari satu metode, dan saya terus mengalami kesalahan "kode terlalu besar" saat mengkompilasi sumber Java yang dihasilkan oleh ANTLR.
Dalam beberapa kasus, saya dapat memperbaikinya dengan mengkompromikan lexer saya. Misalnya, JSP menggunakan token XML "Nama", yang dapat menyertakan berbagai macam karakter. Saya memutuskan untuk hanya menerima karakter ASCII di token "Nama" saya, yang secara drastis menyederhanakan beberapa pengujian di dan lexer mengizinkannya untuk dikompilasi.
Namun, saya sudah sampai pada titik di mana saya tidak dapat mengambil jalan pintas lagi, namun DFA masih terlalu rumit.
Apa yang harus saya lakukan?
Apakah ada kesalahan umum yang mengakibatkan DFA kompleks?
Apakah ada cara untuk menghambat pembuatan DFA, mungkin dengan mengandalkan predikat semantik atau pandangan ke depan untuk membantu prediksi?
Menulis lexer ini dengan tangan akan mudah, tapi sebelum saya menyerah pada ANTLR, saya ingin memastikan saya tidak melewatkan sesuatu yang sudah jelas.
Latar belakang
Lexer ANTLR 3 menggunakan DFA untuk memutuskan cara memberi token pada input. Di DFA yang dihasilkan, ada metode yang disebut specialStateTransition()
. Metode ini berisi pernyataan switch
dengan kasus untuk setiap negara bagian di DFA. Dalam setiap kasus, terdapat serangkaian if
pernyataan, satu untuk setiap transisi dari keadaan. Kondisi setiap pernyataan if
menguji karakter masukan untuk melihat apakah cocok dengan transisi.
Kondisi pengujian karakter ini bisa sangat kompleks. Mereka biasanya memiliki bentuk berikut:
int ch = … ; /* "ch" is the next character in the input stream. */
switch(s) { /* "s" is the current state. */
…
case 13 :
if ((('a' <= ch) && (ch <= 'z')) || (('A' <= ch) && (ch <= 'Z')) || … )
s = 24; /* If the character matches, move to the next state. */
else if …
Perubahan kecil pada lexer saya dapat menghasilkan lusinan perbandingan untuk satu transisi, beberapa transisi untuk setiap negara bagian, dan sejumlah negara bagian. Saya pikir beberapa negara bagian yang sedang dipertimbangkan tidak mungkin dijangkau karena predikat semantik saya, tetapi sepertinya predikat semantik diabaikan oleh DFA. (Saya mungkin salah membaca karena mengira kodenya jelas bukan yang bisa saya tulis dengan tangan!)
Saya menemukan tata bahasa ANTLR 2 di alat Jsp2x, tetapi saya tidak puas dengan pohon parsingnya, dan saya ingin menyegarkan kembali keterampilan ANTLR saya, jadi saya pikir saya akan mencoba menulis sendiri. Saya menggunakan ANTLRWorks, dan saya mencoba membuat grafik untuk DFA, tetapi tampaknya ada bug di ANTLRWorks yang mencegahnya.
specialStateTransition
sepenuhnya. - person Gunther   schedule 22.09.2011