diff --git a/interpreter/pom.xml b/interpreter/pom.xml new file mode 100644 index 000000000..939e8d864 --- /dev/null +++ b/interpreter/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + com.iluwatar + interpreter + 1.0-SNAPSHOT + interpreter + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + diff --git a/interpreter/src/main/java/com/iluwatar/App.java b/interpreter/src/main/java/com/iluwatar/App.java new file mode 100644 index 000000000..8e5129e2b --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/App.java @@ -0,0 +1,61 @@ +package com.iluwatar; + +import java.util.Stack; + +public class App +{ + + /** + * + * Expressions can be evaluated using prefix, infix or postfix notations + * This sample uses postfix, where operator comes after the operands + * + */ + public static void main( String[] args ) + { + String tokenString = "4 3 2 - 1 + *"; + Stack stack = new Stack<>(); + + String[] tokenList = tokenString.split(" "); + for (String s : tokenList) { + if (isOperator(s)) { + Expression rightExpression = stack.pop(); + Expression leftExpression = stack.pop(); + System.out.println(String.format("popped from stack left: %d right: %d", + leftExpression.interpret(), rightExpression.interpret())); + Expression operator = getOperatorInstance(s, leftExpression, + rightExpression); + System.out.println(String.format("operator: %s", operator)); + int result = operator.interpret(); + NumberExpression resultExpression = new NumberExpression(result); + stack.push(resultExpression); + System.out.println(String.format("push result to stack: %d", resultExpression.interpret())); + } else { + Expression i = new NumberExpression(s); + stack.push(i); + System.out.println(String.format("push to stack: %d", i.interpret())); + } + } + System.out.println(String.format("result: %d", stack.pop().interpret())); + } + + public static boolean isOperator(String s) { + if (s.equals("+") || s.equals("-") || s.equals("*")) + return true; + else + return false; + } + + public static Expression getOperatorInstance(String s, Expression left, + Expression right) { + switch (s) { + case "+": + return new PlusExpression(left, right); + case "-": + return new MinusExpression(left, right); + case "*": + return new MultiplyExpression(left, right); + } + return null; + } +} diff --git a/interpreter/src/main/java/com/iluwatar/Expression.java b/interpreter/src/main/java/com/iluwatar/Expression.java new file mode 100644 index 000000000..28fbce6fd --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/Expression.java @@ -0,0 +1,9 @@ +package com.iluwatar; + +public abstract class Expression { + + public abstract int interpret(); + + @Override + public abstract String toString(); +} diff --git a/interpreter/src/main/java/com/iluwatar/MinusExpression.java b/interpreter/src/main/java/com/iluwatar/MinusExpression.java new file mode 100644 index 000000000..8025020fc --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/MinusExpression.java @@ -0,0 +1,23 @@ +package com.iluwatar; + +public class MinusExpression extends Expression { + + private Expression leftExpression; + private Expression rightExpression; + + public MinusExpression(Expression leftExpression, Expression rightExpression) { + this.leftExpression = leftExpression; + this.rightExpression = rightExpression; + } + + @Override + public int interpret() { + return leftExpression.interpret() - rightExpression.interpret(); + } + + @Override + public String toString() { + return "-"; + } + +} diff --git a/interpreter/src/main/java/com/iluwatar/MultiplyExpression.java b/interpreter/src/main/java/com/iluwatar/MultiplyExpression.java new file mode 100644 index 000000000..15e1a1d9e --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/MultiplyExpression.java @@ -0,0 +1,23 @@ +package com.iluwatar; + +public class MultiplyExpression extends Expression { + + private Expression leftExpression; + private Expression rightExpression; + + public MultiplyExpression(Expression leftExpression, Expression rightExpression) { + this.leftExpression = leftExpression; + this.rightExpression = rightExpression; + } + + @Override + public int interpret() { + return leftExpression.interpret() * rightExpression.interpret(); + } + + @Override + public String toString() { + return "*"; + } + +} diff --git a/interpreter/src/main/java/com/iluwatar/NumberExpression.java b/interpreter/src/main/java/com/iluwatar/NumberExpression.java new file mode 100644 index 000000000..0e818f336 --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/NumberExpression.java @@ -0,0 +1,25 @@ +package com.iluwatar; + +public class NumberExpression extends Expression { + + private int number; + + public NumberExpression(int number) { + this.number = number; + } + + public NumberExpression(String s) { + this.number = Integer.parseInt(s); + } + + @Override + public int interpret() { + return number; + } + + @Override + public String toString() { + return "number"; + } + +} diff --git a/interpreter/src/main/java/com/iluwatar/PlusExpression.java b/interpreter/src/main/java/com/iluwatar/PlusExpression.java new file mode 100644 index 000000000..de090c332 --- /dev/null +++ b/interpreter/src/main/java/com/iluwatar/PlusExpression.java @@ -0,0 +1,23 @@ +package com.iluwatar; + +public class PlusExpression extends Expression { + + private Expression leftExpression; + private Expression rightExpression; + + public PlusExpression(Expression leftExpression, Expression rightExpression) { + this.leftExpression = leftExpression; + this.rightExpression = rightExpression; + } + + @Override + public int interpret() { + return leftExpression.interpret() + rightExpression.interpret(); + } + + @Override + public String toString() { + return "+"; + } + +} diff --git a/pom.xml b/pom.xml index dcb498f7c..e08b5109f 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ proxy chain command + interpreter