Skip to content

Commit 09890d7

Browse files
committed
added interpreter sample
1 parent 0785bcc commit 09890d7

File tree

8 files changed

+188
-0
lines changed

8 files changed

+188
-0
lines changed

interpreter/pom.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0"?>
2+
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>com.iluwatar</groupId>
7+
<artifactId>java-design-patterns</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<groupId>com.iluwatar</groupId>
11+
<artifactId>interpreter</artifactId>
12+
<version>1.0-SNAPSHOT</version>
13+
<name>interpreter</name>
14+
<url>http://maven.apache.org</url>
15+
<dependencies>
16+
<dependency>
17+
<groupId>junit</groupId>
18+
<artifactId>junit</artifactId>
19+
<version>3.8.1</version>
20+
<scope>test</scope>
21+
</dependency>
22+
</dependencies>
23+
</project>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.iluwatar;
2+
3+
import java.util.Stack;
4+
5+
public class App
6+
{
7+
8+
/**
9+
*
10+
* Expressions can be evaluated using prefix, infix or postfix notations
11+
* This sample uses postfix, where operator comes after the operands
12+
*
13+
*/
14+
public static void main( String[] args )
15+
{
16+
String tokenString = "4 3 2 - 1 + *";
17+
Stack<Expression> stack = new Stack<>();
18+
19+
String[] tokenList = tokenString.split(" ");
20+
for (String s : tokenList) {
21+
if (isOperator(s)) {
22+
Expression rightExpression = stack.pop();
23+
Expression leftExpression = stack.pop();
24+
System.out.println(String.format("popped from stack left: %d right: %d",
25+
leftExpression.interpret(), rightExpression.interpret()));
26+
Expression operator = getOperatorInstance(s, leftExpression,
27+
rightExpression);
28+
System.out.println(String.format("operator: %s", operator));
29+
int result = operator.interpret();
30+
NumberExpression resultExpression = new NumberExpression(result);
31+
stack.push(resultExpression);
32+
System.out.println(String.format("push result to stack: %d", resultExpression.interpret()));
33+
} else {
34+
Expression i = new NumberExpression(s);
35+
stack.push(i);
36+
System.out.println(String.format("push to stack: %d", i.interpret()));
37+
}
38+
}
39+
System.out.println(String.format("result: %d", stack.pop().interpret()));
40+
}
41+
42+
public static boolean isOperator(String s) {
43+
if (s.equals("+") || s.equals("-") || s.equals("*"))
44+
return true;
45+
else
46+
return false;
47+
}
48+
49+
public static Expression getOperatorInstance(String s, Expression left,
50+
Expression right) {
51+
switch (s) {
52+
case "+":
53+
return new PlusExpression(left, right);
54+
case "-":
55+
return new MinusExpression(left, right);
56+
case "*":
57+
return new MultiplyExpression(left, right);
58+
}
59+
return null;
60+
}
61+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.iluwatar;
2+
3+
public abstract class Expression {
4+
5+
public abstract int interpret();
6+
7+
@Override
8+
public abstract String toString();
9+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.iluwatar;
2+
3+
public class MinusExpression extends Expression {
4+
5+
private Expression leftExpression;
6+
private Expression rightExpression;
7+
8+
public MinusExpression(Expression leftExpression, Expression rightExpression) {
9+
this.leftExpression = leftExpression;
10+
this.rightExpression = rightExpression;
11+
}
12+
13+
@Override
14+
public int interpret() {
15+
return leftExpression.interpret() - rightExpression.interpret();
16+
}
17+
18+
@Override
19+
public String toString() {
20+
return "-";
21+
}
22+
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.iluwatar;
2+
3+
public class MultiplyExpression extends Expression {
4+
5+
private Expression leftExpression;
6+
private Expression rightExpression;
7+
8+
public MultiplyExpression(Expression leftExpression, Expression rightExpression) {
9+
this.leftExpression = leftExpression;
10+
this.rightExpression = rightExpression;
11+
}
12+
13+
@Override
14+
public int interpret() {
15+
return leftExpression.interpret() * rightExpression.interpret();
16+
}
17+
18+
@Override
19+
public String toString() {
20+
return "*";
21+
}
22+
23+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.iluwatar;
2+
3+
public class NumberExpression extends Expression {
4+
5+
private int number;
6+
7+
public NumberExpression(int number) {
8+
this.number = number;
9+
}
10+
11+
public NumberExpression(String s) {
12+
this.number = Integer.parseInt(s);
13+
}
14+
15+
@Override
16+
public int interpret() {
17+
return number;
18+
}
19+
20+
@Override
21+
public String toString() {
22+
return "number";
23+
}
24+
25+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.iluwatar;
2+
3+
public class PlusExpression extends Expression {
4+
5+
private Expression leftExpression;
6+
private Expression rightExpression;
7+
8+
public PlusExpression(Expression leftExpression, Expression rightExpression) {
9+
this.leftExpression = leftExpression;
10+
this.rightExpression = rightExpression;
11+
}
12+
13+
@Override
14+
public int interpret() {
15+
return leftExpression.interpret() + rightExpression.interpret();
16+
}
17+
18+
@Override
19+
public String toString() {
20+
return "+";
21+
}
22+
23+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<module>proxy</module>
3333
<module>chain</module>
3434
<module>command</module>
35+
<module>interpreter</module>
3536
</modules>
3637

3738
<build>

0 commit comments

Comments
 (0)