File tree Expand file tree Collapse file tree 11 files changed +260
-0
lines changed
Expand file tree Collapse file tree 11 files changed +260
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 1+ package interpreter ;
2+
3+ public interface Expression {
4+ <R > R inteprete (Interpreter <R > interpreter );
5+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments