Skip to content

Commit d040c57

Browse files
author
Viktor Reichert
committed
Interpreter
1 parent 3e8a29e commit d040c57

File tree

11 files changed

+260
-0
lines changed

11 files changed

+260
-0
lines changed

src/interpreter/Add.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package interpreter;
2+
3+
public class Add implements Expression{
4+
Expression a;
5+
Expression b;
6+
7+
public Add(Expression a, Expression b) {
8+
this.a = a;
9+
this.b = b;
10+
}
11+
12+
public Expression getA() {
13+
return a;
14+
}
15+
16+
public Expression getB() {
17+
return b;
18+
}
19+
20+
@Override
21+
public <R> R inteprete(Interpreter<R> interpreter) {
22+
return interpreter.interprete(this);
23+
}
24+
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package interpreter;
2+
3+
import java.util.Map;
4+
5+
public class BooleanInterpreter implements Interpreter<Boolean>{
6+
Map<String, Boolean> variables;
7+
8+
public BooleanInterpreter(Map<String, Boolean> variables) {
9+
this.variables = variables;
10+
}
11+
12+
@Override
13+
public Boolean interprete(Node node) {
14+
return variables.get(node.getValue());
15+
}
16+
17+
@Override
18+
public Boolean interprete(Add add) {
19+
return add.getA().inteprete(this) || add.getB().inteprete(this);
20+
}
21+
22+
@Override
23+
public Boolean interprete(Multiply multiply) {
24+
return multiply.getA().inteprete(this) && multiply.getB().inteprete(this);
25+
}
26+
27+
@Override
28+
public Boolean interprete(Minus minus) {
29+
return !minus.getA().inteprete(this);
30+
}
31+
}

src/interpreter/Demo.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package interpreter;
2+
3+
import java.util.Map;
4+
5+
public class Demo {
6+
public static void main(String[] args) {
7+
Node a = new Node("a");
8+
Node b = new Node("b");
9+
Node c = new Node("c");
10+
Expression expr = new Add(new Multiply(new Minus(a), b), c);
11+
12+
Map<String, Boolean> variables = Map.ofEntries(
13+
Map.entry("a", true),
14+
Map.entry("b", false),
15+
Map.entry("c", true)
16+
);
17+
18+
Interpreter<Boolean> interpreter = new BooleanInterpreter(variables);
19+
20+
System.out.println(expr.inteprete(interpreter));
21+
22+
Map<String, Integer> variablesInteger = Map.ofEntries(
23+
Map.entry("a", 3),
24+
Map.entry("b", 4),
25+
Map.entry("c", 5)
26+
);
27+
28+
System.out.println(expr.inteprete(new IntegerIntepreter(variablesInteger)));
29+
30+
System.out.println(expr.inteprete(new ReadableIntepreter()));
31+
32+
String input = "4 2 3 + * a - +";
33+
34+
Expression expression = PolishParser.parse(input);
35+
System.out.println(expression.inteprete(new ReadableIntepreter()));
36+
37+
}
38+
}

src/interpreter/Expression.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package interpreter;
2+
3+
public interface Expression {
4+
<R> R inteprete(Interpreter<R> interpreter);
5+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package interpreter;
2+
3+
import java.util.Map;
4+
5+
public class IntegerIntepreter implements Interpreter<Integer>{
6+
Map<String, Integer> variables;
7+
8+
public IntegerIntepreter(Map<String, Integer> variables) {
9+
this.variables = variables;
10+
}
11+
12+
@Override
13+
public Integer interprete(Node node) {
14+
return variables.get(node.getValue());
15+
}
16+
17+
@Override
18+
public Integer interprete(Add add) {
19+
return add.getA().inteprete(this) + add.getB().inteprete(this);
20+
}
21+
22+
@Override
23+
public Integer interprete(Multiply multiply) {
24+
return multiply.getA().inteprete(this) * multiply.getB().inteprete(this);
25+
}
26+
27+
@Override
28+
public Integer interprete(Minus minus) {
29+
return -minus.getA().inteprete(this);
30+
}
31+
}

src/interpreter/Interpreter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package interpreter;
2+
3+
public interface Interpreter<R> {
4+
R interprete(Node node);
5+
6+
R interprete(Add add);
7+
8+
R interprete(Multiply multiply);
9+
10+
R interprete(Minus minus);
11+
}

src/interpreter/Minus.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package interpreter;
2+
3+
public class Minus implements Expression {
4+
private Expression a;
5+
6+
public Minus(Expression a) {
7+
this.a = a;
8+
}
9+
10+
public Expression getA() {
11+
return a;
12+
}
13+
14+
@Override
15+
public <R> R inteprete(Interpreter<R> interpreter) {
16+
return interpreter.interprete(this);
17+
}
18+
19+
}

src/interpreter/Multiply.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package interpreter;
2+
3+
public class Multiply implements Expression{
4+
Expression a;
5+
Expression b;
6+
7+
public Multiply(Expression a, Expression b) {
8+
this.a = a;
9+
this.b = b;
10+
}
11+
12+
public Expression getA() {
13+
return a;
14+
}
15+
16+
public Expression getB() {
17+
return b;
18+
}
19+
20+
@Override
21+
public <R> R inteprete(Interpreter<R> interpreter) {
22+
return interpreter.interprete(this);
23+
}
24+
25+
}

src/interpreter/Node.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package interpreter;
2+
3+
public class Node implements Expression{
4+
private String value;
5+
6+
public Node(String value) {
7+
this.value = value;
8+
}
9+
10+
@Override
11+
public <R> R inteprete(Interpreter<R> interpreter) {
12+
return interpreter.interprete(this);
13+
}
14+
15+
public String getValue() {
16+
return value;
17+
}
18+
19+
@Override
20+
public String toString() {
21+
return "Node{" +
22+
"value='" + value + '\'' +
23+
'}';
24+
}
25+
}

src/interpreter/PolishParser.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package interpreter;
2+
3+
import java.util.Stack;
4+
5+
public class PolishParser {
6+
public static Expression parse(String input) {
7+
Stack<Expression> stack = new Stack<>();
8+
String[] parts = input.split(" ");
9+
10+
for (String part : parts) {
11+
Expression expression = switch (part) {
12+
case "+" -> new Add(stack.pop(), stack.pop());
13+
case "-" -> new Minus(stack.pop());
14+
case "*" -> new Multiply(stack.pop(), stack.pop());
15+
default -> new Node(part);
16+
};
17+
stack.add(expression);
18+
}
19+
return stack.pop();
20+
}
21+
}

0 commit comments

Comments
 (0)