mod jurubahasa


Pola Jurubahasa menyediakan cara untuk menilai tatabahasa atau ungkapan sesuatu bahasa. Ia adalah pola tingkah laku. Corak ini melaksanakan antara muka ekspresi yang mentafsir konteks tertentu. Mod ini digunakan dalam penghuraian SQL, enjin pemprosesan simbol, dsb.

Pengenalan

Niat: Memandangkan bahasa, takrifkan perwakilan tatabahasanya dan takrifkan jurubahasa yang menggunakan perwakilan itu untuk mentafsir ayat dalam bahasa .

Penyelesaian utama: Bina jurubahasa yang mentafsir ayat untuk beberapa tatabahasa tetap.

Bila hendak digunakan: Jika jenis masalah tertentu berlaku cukup kerap, mungkin berbaloi untuk merumuskan kejadian individu bagi masalah itu sebagai ayat dalam bahasa mudah. Ini memungkinkan untuk membina jurubahasa yang menyelesaikan masalah dengan mentafsir ayat-ayat ini.

Cara menyelesaikan: Bina pepohon sintaks dan tentukan simbol terminal dan simbol bukan terminal.

Kod utama: Kelas persekitaran komponen, yang mengandungi beberapa maklumat global di luar penterjemah, biasanya HashMap.

Contoh aplikasi: Pengkompil, pengiraan ungkapan operasi.

Kelebihan: 1. 2. Menambah cara baharu untuk mentafsir ungkapan. 3. Mudah untuk melaksanakan tatabahasa yang mudah.

Kelemahan: 1. Terdapat sedikit senario yang tersedia. 2. Sukar untuk mengekalkan tatabahasa yang kompleks. 3. Mod penterjemah akan menyebabkan perluasan kelas. 4. Mod penterjemah menggunakan kaedah panggilan rekursif.

Senario penggunaan: 1. Ayat dalam bahasa yang perlu ditafsir dan dilaksanakan boleh diwakili sebagai pokok sintaksis. 2. Beberapa masalah yang berulang boleh diungkapkan dalam bahasa yang mudah. 3. Senario di mana tatabahasa mudah memerlukan penjelasan.

Nota: Terdapat sedikit senario yang tersedia Jika anda menemuinya dalam JAVA, anda boleh menggunakan expression4J.

Pelaksanaan

Kami akan mencipta antara muka Ekspresi dan kelas entiti yang melaksanakan antara muka Ekspresi. Mentakrifkan kelas TerminalExpression yang berfungsi sebagai penterjemah utama dalam konteks. Kelas lain OrExpression dan AndExpression digunakan untuk mencipta ungkapan gabungan.

InterpreterPatternDemo, kelas demo kami menggunakan kelas Ekspresi untuk membuat peraturan dan menunjukkan penghuraian ungkapan.

interpreter_pattern_uml_diagram.jpg

Langkah 1

Buat antara muka ekspresi.

Expression.java

public interface Expression {
   public boolean interpret(String context);
}

Langkah 2

Buat kelas entiti yang melaksanakan antara muka di atas.

TerminalExpression.java

public class TerminalExpression implements Expression {
	
   private String data;

   public TerminalExpression(String data){
      this.data = data; 
   }

   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

OrExpression.java

public class OrExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

AndExpression.java

public class AndExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

Langkah 3

InterpreterPatternDemo Gunakan kelas Expression untuk mencipta peraturan dan menghuraikannya.

InterpreterPatternDemo.java

public class InterpreterPatternDemo {

   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);		
   }

   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);		
   }

   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();

      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

Langkah 4

Sahkan output.

rreeee