X Tutup
Skip to content

Commit 5831d32

Browse files
committed
iluwatar#107 Interpreter example JavaDoc
1 parent 0d8b3c9 commit 5831d32

File tree

7 files changed

+220
-186
lines changed

7 files changed

+220
-186
lines changed
Lines changed: 72 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,72 @@
1-
package com.iluwatar.interpreter;
2-
3-
import java.util.Stack;
4-
5-
/**
6-
*
7-
* Interpreter pattern breaks sentences into expressions (Expression) that can
8-
* be evaluated and as a whole form the result.
9-
*
10-
*/
11-
public class App {
12-
13-
/**
14-
*
15-
* Expressions can be evaluated using prefix, infix or postfix notations
16-
* This sample uses postfix, where operator comes after the operands
17-
*
18-
*/
19-
public static void main(String[] args) {
20-
String tokenString = "4 3 2 - 1 + *";
21-
Stack<Expression> stack = new Stack<>();
22-
23-
String[] tokenList = tokenString.split(" ");
24-
for (String s : tokenList) {
25-
if (isOperator(s)) {
26-
Expression rightExpression = stack.pop();
27-
Expression leftExpression = stack.pop();
28-
System.out
29-
.println(String.format(
30-
"popped from stack left: %d right: %d",
31-
leftExpression.interpret(),
32-
rightExpression.interpret()));
33-
Expression operator = getOperatorInstance(s, leftExpression,
34-
rightExpression);
35-
System.out.println(String.format("operator: %s", operator));
36-
int result = operator.interpret();
37-
NumberExpression resultExpression = new NumberExpression(result);
38-
stack.push(resultExpression);
39-
System.out.println(String.format("push result to stack: %d",
40-
resultExpression.interpret()));
41-
} else {
42-
Expression i = new NumberExpression(s);
43-
stack.push(i);
44-
System.out.println(String.format("push to stack: %d",
45-
i.interpret()));
46-
}
47-
}
48-
System.out
49-
.println(String.format("result: %d", stack.pop().interpret()));
50-
}
51-
52-
public static boolean isOperator(String s) {
53-
return s.equals("+") || s.equals("-") || s.equals("*");
54-
}
55-
56-
public static Expression getOperatorInstance(String s, Expression left,
57-
Expression right) {
58-
switch (s) {
59-
case "+":
60-
return new PlusExpression(left, right);
61-
case "-":
62-
return new MinusExpression(left, right);
63-
case "*":
64-
return new MultiplyExpression(left, right);
65-
}
66-
return null;
67-
}
68-
}
1+
package com.iluwatar.interpreter;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
*
7+
* Interpreter pattern breaks sentences into expressions ({@link Expression}) that can
8+
* be evaluated and as a whole form the result.
9+
*
10+
*/
11+
public class App {
12+
13+
/**
14+
*
15+
* Program entry point.
16+
* <p>
17+
* Expressions can be evaluated using prefix, infix or postfix notations
18+
* This sample uses postfix, where operator comes after the operands
19+
*
20+
* @param args command line args
21+
*
22+
*/
23+
public static void main(String[] args) {
24+
String tokenString = "4 3 2 - 1 + *";
25+
Stack<Expression> stack = new Stack<>();
26+
27+
String[] tokenList = tokenString.split(" ");
28+
for (String s : tokenList) {
29+
if (isOperator(s)) {
30+
Expression rightExpression = stack.pop();
31+
Expression leftExpression = stack.pop();
32+
System.out
33+
.println(String.format(
34+
"popped from stack left: %d right: %d",
35+
leftExpression.interpret(),
36+
rightExpression.interpret()));
37+
Expression operator = getOperatorInstance(s, leftExpression,
38+
rightExpression);
39+
System.out.println(String.format("operator: %s", operator));
40+
int result = operator.interpret();
41+
NumberExpression resultExpression = new NumberExpression(result);
42+
stack.push(resultExpression);
43+
System.out.println(String.format("push result to stack: %d",
44+
resultExpression.interpret()));
45+
} else {
46+
Expression i = new NumberExpression(s);
47+
stack.push(i);
48+
System.out.println(String.format("push to stack: %d",
49+
i.interpret()));
50+
}
51+
}
52+
System.out
53+
.println(String.format("result: %d", stack.pop().interpret()));
54+
}
55+
56+
public static boolean isOperator(String s) {
57+
return s.equals("+") || s.equals("-") || s.equals("*");
58+
}
59+
60+
public static Expression getOperatorInstance(String s, Expression left,
61+
Expression right) {
62+
switch (s) {
63+
case "+":
64+
return new PlusExpression(left, right);
65+
case "-":
66+
return new MinusExpression(left, right);
67+
case "*":
68+
return new MultiplyExpression(left, right);
69+
}
70+
return null;
71+
}
72+
}
Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
package com.iluwatar.interpreter;
2-
3-
public abstract class Expression {
4-
5-
public abstract int interpret();
6-
7-
@Override
8-
public abstract String toString();
9-
}
1+
package com.iluwatar.interpreter;
2+
3+
/**
4+
*
5+
* Expression
6+
*
7+
*/
8+
public abstract class Expression {
9+
10+
public abstract int interpret();
11+
12+
@Override
13+
public abstract String toString();
14+
}
Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
package com.iluwatar.interpreter;
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-
}
1+
package com.iluwatar.interpreter;
2+
3+
/**
4+
*
5+
* MinusExpression
6+
*
7+
*/
8+
public class MinusExpression extends Expression {
9+
10+
private Expression leftExpression;
11+
private Expression rightExpression;
12+
13+
public MinusExpression(Expression leftExpression, Expression rightExpression) {
14+
this.leftExpression = leftExpression;
15+
this.rightExpression = rightExpression;
16+
}
17+
18+
@Override
19+
public int interpret() {
20+
return leftExpression.interpret() - rightExpression.interpret();
21+
}
22+
23+
@Override
24+
public String toString() {
25+
return "-";
26+
}
27+
28+
}
Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
1-
package com.iluwatar.interpreter;
2-
3-
public class MultiplyExpression extends Expression {
4-
5-
private Expression leftExpression;
6-
private Expression rightExpression;
7-
8-
public MultiplyExpression(Expression leftExpression,
9-
Expression rightExpression) {
10-
this.leftExpression = leftExpression;
11-
this.rightExpression = rightExpression;
12-
}
13-
14-
@Override
15-
public int interpret() {
16-
return leftExpression.interpret() * rightExpression.interpret();
17-
}
18-
19-
@Override
20-
public String toString() {
21-
return "*";
22-
}
23-
24-
}
1+
package com.iluwatar.interpreter;
2+
3+
/**
4+
*
5+
* MultiplyExpression
6+
*
7+
*/
8+
public class MultiplyExpression extends Expression {
9+
10+
private Expression leftExpression;
11+
private Expression rightExpression;
12+
13+
public MultiplyExpression(Expression leftExpression,
14+
Expression rightExpression) {
15+
this.leftExpression = leftExpression;
16+
this.rightExpression = rightExpression;
17+
}
18+
19+
@Override
20+
public int interpret() {
21+
return leftExpression.interpret() * rightExpression.interpret();
22+
}
23+
24+
@Override
25+
public String toString() {
26+
return "*";
27+
}
28+
29+
}
Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
1-
package com.iluwatar.interpreter;
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-
}
1+
package com.iluwatar.interpreter;
2+
3+
/**
4+
*
5+
* NumberExpression
6+
*
7+
*/
8+
public class NumberExpression extends Expression {
9+
10+
private int number;
11+
12+
public NumberExpression(int number) {
13+
this.number = number;
14+
}
15+
16+
public NumberExpression(String s) {
17+
this.number = Integer.parseInt(s);
18+
}
19+
20+
@Override
21+
public int interpret() {
22+
return number;
23+
}
24+
25+
@Override
26+
public String toString() {
27+
return "number";
28+
}
29+
30+
}
Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
package com.iluwatar.interpreter;
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-
}
1+
package com.iluwatar.interpreter;
2+
3+
/**
4+
*
5+
* PlusExpression
6+
*
7+
*/
8+
public class PlusExpression extends Expression {
9+
10+
private Expression leftExpression;
11+
private Expression rightExpression;
12+
13+
public PlusExpression(Expression leftExpression, Expression rightExpression) {
14+
this.leftExpression = leftExpression;
15+
this.rightExpression = rightExpression;
16+
}
17+
18+
@Override
19+
public int interpret() {
20+
return leftExpression.interpret() + rightExpression.interpret();
21+
}
22+
23+
@Override
24+
public String toString() {
25+
return "+";
26+
}
27+
28+
}

0 commit comments

Comments
 (0)
X Tutup