📜  解释器设计模式

📅  最后修改于: 2021-09-10 02:52:45             🧑  作者: Mango

解释器设计模式是行为设计模式的一种。解释器模式用于定义语言的语法表示,并提供解释器来处理该语法。

  • 这种模式涉及实现一个表达式接口,它告诉解释特定的上下文。该模式用于 SQL 解析、符号处理引擎等。
  • 此模式在表达式层次结构上执行。这里的每个表达式都是终结符或非终结符。
  • 解释器设计模式的树结构有点类似于复合设计模式定义的树结构,终端表达式是叶对象,非终端表达式是复合的。
  • 该树包含要评估的表达式,通常由解析器生成。解析器本身不是解释器模式的一部分。

例如 :
这是“+ – 9 8 7”的表达式层次结构:

实现解释器模式

UML 图解释器设计模式

设计组件

  • AbstractExpression (Expression):声明一个解释器()操作,AST中的所有节点(终端和非终端)都覆盖。
  • TerminalExpression (NumberExpression):实现对终端表达式的 interpret() 操作。
  • NonterminalExpression (AdditionExpression、SubtractionExpression 和 MultiplicationExpression):为所有非终结符表达式实现 interpret() 操作。
  • 上下文(字符串):包含解释器全局的信息。正是这个带有 Postfix 符号的 String 表达式必须被解释和解析。
  • 客户端(ExpressionParser):构建(或提供)从 TerminalExpression 和 NonTerminalExpression 组装的 AST。客户端调用 interpret() 操作。

让我们看一个解释器设计模式的例子。

// Expression interface used to
// check the interpreter.
interface Expression
{
    boolean interpreter(String con);
}
  
// TerminalExpression class implementing
// the above interface. This interpreter 
// just check if the data is same as the 
// interpreter data.
class TerminalExpression implements Expression 
{
    String data;
  
    public TerminalExpression(String data)
    {
        this.data = data; 
    }
  
    public boolean interpreter(String con) 
    {
        if(con.contains(data))
        {
            return true;
        }
        else
        {
            return false;  
        }
    }
}
// OrExpression class implementing
// the above interface. This interpreter 
// just returns the or condition of the 
// data is same as the interpreter data.
class OrExpression implements Expression 
{
    Expression expr1;
    Expression expr2;
  
    public OrExpression(Expression expr1, Expression expr2) 
    {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    public boolean interpreter(String con) 
    {        
        return expr1.interpreter(con) || expr2.interpreter(con);
    }
}
  
// AndExpression class implementing
// the above interface. This interpreter 
// just returns the And condition of the 
// data is same as the interpreter data.
class AndExpression implements Expression 
{
    Expression expr1;
    Expression expr2;
  
    public AndExpression(Expression expr1, Expression expr2) 
    { 
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    public boolean interpreter(String con) 
    {        
        return expr1.interpreter(con) && expr2.interpreter(con);
    }
}
  
// Driver class
class InterpreterPattern
{
  
    public static void main(String[] args) 
    {
        Expression person1 = new TerminalExpression("Kushagra");
        Expression person2 = new TerminalExpression("Lokesh");
        Expression isSingle = new OrExpression(person1, person2);
          
        Expression vikram = new TerminalExpression("Vikram");
        Expression committed = new TerminalExpression("Committed");
        Expression isCommitted = new AndExpression(vikram, committed);    
  
        System.out.println(isSingle.interpreter("Kushagra"));
        System.out.println(isSingle.interpreter("Lokesh"));
        System.out.println(isSingle.interpreter("Achint"));
          
        System.out.println(isCommitted.interpreter("Committed, Vikram"));
        System.out.println(isCommitted.interpreter("Single, Vikram"));
  
    }
}

输出:

true
true
false
true
false

在上面的代码中,我们正在创建一个接口Expression和实现 Expression 接口的具体类。定义了一个类TerminalExpression作为主解释器,其他类OrExpression , AndExpression用于创建组合表达式。

好处

  • 很容易改变和扩展语法。由于模式使用类来表示语法规则,因此您可以使用继承来更改或扩展语法。现有表达式可以增量修改,新表达式可以定义为旧表达式的变体。
  • 实现语法也很容易。在抽象语法树中定义节点的类具有类似的实现。这些类易于编写,并且通常可以使用编译器或解析器生成器自动生成它们。

缺点

  • 复杂的语法很难维护。解释器模式为文法中的每个规则至少定义一个类。因此,包含许多规则的语法很难管理和维护。