Interpreter Pattern

Pros

  • e

Cons

  • e

Example Explanation

[UML]

import java.util.Stack;

class Main {
  public static void main(String[] args) {

    String context = "5 2 3 7 20 8 + - / * %";

    Stack<IExpression> stack = new Stack<IExpression>();

    String [] splitContext = context.split(" ");
    for(String exp : splitContext){
      if( !SymbolParser.isSymbol(exp) ){
        stack.push( new NumberExpression(exp) );
      }
      else{
        IExpression left = stack.pop();
        IExpression right = stack.pop();
        IExpression symbol = SymbolParser.getExpression(left, right, exp);
        stack.push( new NumberExpression( symbol.interpret() ) );

      }
    }

    int finalValue = stack.pop().interpret();
    System.out.println( finalValue );

    //8 + 20
    //28 - 7
    //21 / 3
    //7 * 2
    //14 % 5
    //4
  }
}

interface IExpression{
  public int interpret();
}

class NumberExpression implements IExpression{

  private int number;

  public NumberExpression(String n){
    this.number = Integer.parseInt(n);
  }
  public NumberExpression(int n){
    this.number = n;
  }

  @Override
  public int interpret(){ return number; }
}

abstract class SymbolExpression{
  IExpression left;
  IExpression right;
  public SymbolExpression(IExpression left, IExpression right){
    this.left = left;
    this.right = right;
  }
}

class MultiplyExpression extends SymbolExpression implements IExpression{
  public MultiplyExpression(IExpression left, IExpression right){
    super(left, right);
  }
  @Override
  public int interpret(){
    System.out.println(left.interpret()+" * "+right.interpret());
    return left.interpret() * right.interpret();
  }
}

class AddExpression extends SymbolExpression implements IExpression{
  public AddExpression(IExpression left, IExpression right){
    super(left, right);
  }
  @Override
  public int interpret(){
    System.out.println(left.interpret()+" + "+right.interpret());
    return left.interpret() + right.interpret();
  }
}

class SubtractExpression extends SymbolExpression implements IExpression{
  public SubtractExpression(IExpression left, IExpression right){
    super(left, right);
  }
  @Override
  public int interpret(){
    System.out.println(left.interpret()+" - "+right.interpret());
    return left.interpret() - right.interpret();
  }
}

class ModulusExpression extends SymbolExpression implements IExpression{
  public ModulusExpression(IExpression left, IExpression right){
    super(left, right);
  }
  @Override
  public int interpret(){
    if(left.interpret() == 0 || right.interpret() == 0){
      return 0;
    }
    System.out.println(left.interpret()+" % "+right.interpret());
    return (int) left.interpret() % right.interpret();
  }
}

class DivisionExpression extends SymbolExpression implements IExpression{
  public DivisionExpression(IExpression left, IExpression right){
    super(left, right);
  }
  @Override
  public int interpret(){
    if(left.interpret() == 0 || right.interpret() == 0){
      return 0;
    }
    System.out.println(left.interpret()+" / "+right.interpret());
    return (int) left.interpret() / right.interpret();
  }
}

class SymbolParser{
  public static boolean isSymbol(String symbol){
    return symbol.equals("/") ||
           symbol.equals("%") ||
           symbol.equals("*") ||
           symbol.equals("-") ||
           symbol.equals("+");
  }
  public static IExpression getExpression(IExpression left, IExpression right, String symbol){

    if(symbol.equals("/")){
      return new DivisionExpression(left, right);
    }
    else if(symbol.equals("%")){
      return new ModulusExpression(left, right);
    }
    else if(symbol.equals("*")){
      return new MultiplyExpression(left, right);
    }
    else if(symbol.equals("-")){
      return new SubtractExpression(left, right);
    }
    else{
      return new AddExpression(left, right);
    }
  }
}

Extra Resources

https://springframework.guru/gang-of-four-design-patterns/interpreter-pattern/

results matching ""

    No results matching ""