Latest web development tutorials

نمط مترجم

نمط مترجم (مترجم نمط) يوفر وسيلة لتقييم التعبير اللغوي أو اللغة، الذي ينتمي إلى نوع من نموذج. هذا الوضع تنفذ واجهة التعبير التي تشرح سياق معين. ويستخدم هذا النموذج في إعراب SQL، محركات معالجة رمز.

مقدمة

القصد: نظرا لغة، وتحديد تمثيل قواعدها، وتحديد مترجم، يستخدم مترجم شعار لتفسير الجمل في اللغة.

الحل الرئيسي: بالنسبة لبعض القواعد الثابتة بناء الجملة لشرح مترجم.

متى تستخدم: إذا كان تردد من نوع معين من المشكلة مرتفع بما فيه الكفاية، فإنه قد يكون من المفيد وأعرب كل حالة من هذه المشكلة باعتبارها جمل بسيطة في اللغة.بحيث يمكنك بناء مترجم، مترجم إلى حل المشكلة عن طريق تفسير هذه الأحكام.

كيفية إصلاح: شجرة تركيب الأعضاء وتعريف فاصل وnonterminal.

المفتاح كود: البيئة الصفية الأعضاء، بعض المعلومات العالمية الواردة مترجم الخارجي، عادة HashMap.

أمثلة التطبيق: مترجم، تقييم التعبير الحسابي.

المزايا: 1، أفضل التدرجية، والمرونة.2، وأضاف طريقة جديدة لتفسير التعبير. 3، وسهلة لتنفيذ قواعد بسيطة.

العيوب: 1، ويمكن الاستفادة من المشهد صغيرة نسبيا.2. لمجمع قواعد النحو أكثر صعوبة للحفاظ على. 3 شرح ووضع يسبب الطبقة في التوسع. 4 شرح طريقة استخدام استدعاءات الأسلوب العودية.

سيناريوهات الاستخدام: 1 يمكن تفسير يجب أن تكون ممثلة الجمل اللغوية التي كتبها شجرة جملة مجردة.2، وبعض من المشاكل المتكررة يمكن أن تكون لغة بسيطة للتعبير. 3، وقواعد بسيطة لشرح المشهد.

ملاحظة: يمكنك استخدام مشهد صغير نسبيا، JAVA إذا واجهتك يمكن expression4J بدلا من ذلك.

تحقيق

سنقوم إنشاء وتنفيذ واجهة الطبقة كيانالتعبيرواجهةالتعبير.كما هي محددة في سياقTerminalExpressionمترجم الرئيسي. الفئات الأخرىOrExpression،AndExpression لخلق تعبيرات وحدات.

InterpreterPatternDemo،تستخدم الطبقة مظاهرة طبقتناالتعبيرلإنشاء قواعد تحليل وتعبيرات العرض.

نمط مترجم UML الرسم البياني

خطوة 1

إنشاء واجهة التعبير.

Expression.java

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

خطوة 2

إنشاء فئة كيان تنفذ واجهات أعلاه.

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);
   }
}

خطوة 3

InterpreterPatternDemoاستخدام فئةالتعبيرلإنشاء قواعد وحلها.

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"));
   }
}

خطوة 4

تحقق من الانتاج.

جون ذكرا؟ صحيح
جولي هي المرأة المتزوجة؟ صحيح