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