Definisi: Diberi bahasa, tentukan representasi tata bahasanya, dan tentukan seorang penerjemah yang menggunakan representasi untuk menafsirkan kalimat dalam bahasa.
Jenis: Pola perilaku
Diagram kelas:
Mode interpreter adalah mode yang relatif jarang digunakan, dan saya belum pernah menggunakan mode ini sebelumnya. Mari kita lihat mode interpreter.
Struktur Mode Penerjemah
Interpreter Abstrak: Deklarasikan antarmuka abstrak (atau kelas abstrak) yang harus diimplementasikan oleh semua ekspresi konkret. Antarmuka terutama metode interpret (), disebut operasi penjelasan. Tugas interpretasi spesifik diselesaikan oleh berbagai kelas implementasinya, dan penerjemah spesifik diselesaikan oleh terminalexpression Interpreter Terminator dan masing-masing nonterspresi nonteralexpression nonterpreter non-terminal.
Ekspresi Terminator: Mengimplementasikan operasi interpretasi yang terkait dengan elemen dalam tata bahasa. Biasanya, hanya ada satu ekspresi terminator dalam pola interpreter, tetapi ada banyak contoh, sesuai dengan terminator yang berbeda. Setengah dari Terminator adalah unit operasi dalam tata bahasa. Misalnya, ada rumus sederhana R = R1+R2, di mana R1 dan R2 adalah terminator, dan penerjemah yang sesuai yang mengurai R1 dan R2 adalah terminator.
Ekspresi non-terminal: Setiap aturan dalam tata bahasa sesuai dengan ekspresi non-terminal. Ekspresi non-terminal umumnya operator atau kata kunci lain dalam tata bahasa. Misalnya, dalam rumus R = R1 + R2, + adalah karakter non-terminal, dan penerjemah parsing + adalah karakter non-terminal. Ekspresi nonterminal meningkat sesuai dengan kompleksitas logika, dan pada prinsipnya setiap aturan tata bahasa sesuai dengan ekspresi nonterminal.
Peran Lingkungan: Tugas peran ini umumnya digunakan untuk menyimpan nilai -nilai spesifik yang sesuai dengan masing -masing terminator dalam tata bahasa, seperti R = R1+R2. Kami menetapkan 100 hingga R1 dan 200 hingga R2. Informasi ini perlu disimpan dalam peran lingkungan. Dalam banyak kasus, kami menggunakan peta untuk bertindak karena peran lingkungan sudah cukup.
contoh
Mari kita berikan contoh penambahan, pengurangan, perkalian dan divisi. Gagasan implementasi berasal dari contoh dalam "Java and Pattern". Fungsi setiap peran diimplementasikan sesuai dengan spesifikasi yang disebutkan di atas.
// Peran Konteks (Lingkungan), Gunakan HashMap untuk menyimpan nilai -nilai numerik yang sesuai dengan konteks kelas variabel {private Map valueMap = new HashMap (); public void addValue (variabel x, int y) {integer yi = integer baru (y); valueMap.put (x, yi); } public int lookupValue (variabel x) {int i = ((integer) valueMap.get (x)). intvalue (); Kembalikan i; }} // Peran ekspresi abstrak, Anda juga dapat menggunakan antarmuka untuk mengimplementasikan ekspresi kelas abstrak {interpretasi int abstrak publik (konteks con); } // Kelas Peran Ekspresi Terminator Konstanta memperluas ekspresi {private int i; Public Constant (int i) {this.i = i; } public int interpret (Context con) {return i; }} kelas variabel memperluas ekspresi {public int interpret (context con) {// Ini adalah objek variabel yang menyebut metode interpretal return con.lookupValue (this); }} // kelas peran ekspresi nonterterator menambahkan ekspresi {private ekspresi kiri, kanan; alamat publik (ekspresi kiri, ekspresi kanan) {this.left = kiri; this.right = benar; } interpretasi int interpretasi (konteks con) {return left.interpret (con) + right.interpret (con); }} Class Curies Extends Expression {Private Expression Left, Right; Kurangi publik (ekspresi kiri, ekspresi kanan) {this.left = kiri; this.right = benar; } public int interpret (Context con) {return left.interpret (con) - right.interpret (con); }} class Multiply memperluas ekspresi {private Expression kiri, kanan; multiply publik (ekspresi kiri, ekspresi kanan) {this.left = kiri; this.right = benar; } public int interpret (Context con) {return left.interpret (con) * right.interpret (con); }} divisi kelas memperluas ekspresi {private ekspresi kiri, kanan; Divisi publik (ekspresi kiri, ekspresi kanan) {this.left = kiri; this.right = benar; } public int interpret (context con) {coba {return left.interpret (con) / right.interpret (con); } catch (arithMeticException ae) {System.out.println ("perceraian adalah 0!"); return -11111; }}} // Uji program, Hitung (A*B)/(A-B+2) Tes Kelas Publik {Private Static Expression Ex; konteks statis pribadi con; public static void main (string [] args) {con = new context (); // atur variabel dan konstanta variabel a = variabel baru (); Variabel b = variabel baru (); Konstanta c = konstanta baru (2); // Tetapkan variabel con.addvalue (a, 5); con.addvalue (b, 7); // Operasi, kami menganalisis struktur kalimat sendiri, membangun ex = divisi baru (multiply baru (a, b), add baru (kurangi baru (a, b), c)); System.out.println ("Hasil operasi adalah:"+ex.interpret (con)); }} Keuntungan dan Kekurangan Mode Interpreter
Interpreter adalah alat analisis sintaks sederhana. Keuntungan yang paling signifikan adalah ekstensibilitasnya. Memodifikasi aturan sintaks hanya perlu memodifikasi karakter non-terminal yang sesuai. Jika Anda memperluas sintaks, Anda hanya perlu menambahkan karakter non-terminal.
Namun, pola interpreter akan menyebabkan kelas berkembang, dan setiap sintaks perlu menghasilkan ekspresi non-terminal. Ketika aturan sintaks relatif kompleks, sejumlah besar file kelas dapat dihasilkan, yang membawa banyak masalah untuk pemeliharaan. Pada saat yang sama, karena metode panggilan rekursif diadopsi, setiap ekspresi non-terminal hanya peduli dengan ekspresi yang terkait dengan dirinya sendiri. Setiap ekspresi perlu mengetahui hasil akhir dan harus bersifat rekursif. Apakah itu bahasa yang berorientasi objek atau bahasa yang berorientasi pada proses, rekursi adalah cara yang tidak direkomendasikan. Karena penggunaan banyak loop dan rekursi, efisiensi adalah masalah yang tidak dapat diabaikan. Terutama ketika digunakan untuk menafsirkan kompleks penguraian, sintaksis yang panjang, efisiensi tidak tertahankan.
Skenario yang berlaku untuk mode juru bahasa
Mode interpreter dapat digunakan dalam kasus berikut:
Ada aturan sintaksis sederhana, seperti pernyataan SQL. Jika kita perlu melakukan konversi RM berdasarkan pernyataan SQL, kita dapat menggunakan pola interpreter untuk menafsirkan pernyataan.
Beberapa masalah berulang, seperti empat operasi penambahan, pengurangan, perkalian dan pembagian, tetapi formulas berbeda setiap saat. Kadang-kadang itu adalah A+BC*D, kadang-kadang itu adalah*B+CD, dll. Rumus selalu berubah, tetapi semuanya dihubungkan oleh empat karakter non-terminal dari penambahan, pengurangan, perkalian dan pembagian. Saat ini, kita dapat menggunakan mode interpreter.
Hal -hal yang perlu diperhatikan
Mode interpreter benar -benar merupakan mode yang relatif jarang digunakan karena terlalu merepotkan untuk mempertahankannya. Bayangkan bahwa jika sekelompok penerjemah non-terminal tidak terbiasa dengan aturan tata bahasa sebelumnya, atau tata bahasa sangat sederhana, akan sulit untuk memahami logikanya. Mode interpreter jarang digunakan dalam pengembangan sistem aktual karena dapat menyebabkan masalah seperti efisiensi, kinerja, dan pemeliharaan.