diff --git a/Task_C/.classpath b/Task_C/_classpath.xml old mode 100755 new mode 100644 similarity index 100% rename from Task_C/.classpath rename to Task_C/_classpath.xml diff --git a/Task_C/.project b/Task_C/_project.xml old mode 100755 new mode 100644 similarity index 100% rename from Task_C/.project rename to Task_C/_project.xml diff --git a/Task_C/src/interpreter/lisp/Case.java b/Task_C/src/interpreter/lisp/Case.java new file mode 100644 index 0000000000000000000000000000000000000000..fd67e0703333f05ffc268e82b4dc44cf17db92b6 --- /dev/null +++ b/Task_C/src/interpreter/lisp/Case.java @@ -0,0 +1,35 @@ +package interpreter.lisp; + +import java.util.ArrayList; +import java.util.List; + +public class Case extends CompoundExpression { + + private Expr condition; + private List<Expr> elements = new ArrayList<Expr>(); + + public Case(Expr cond, List<Expr> expr) { + this.condition = cond; + this.elements = expr; + } + + public Expr getCondition() { + return condition; + } + + public List<Expr> getElements() { + return elements; + } + + @Override + public Expr evaluate(Context context) { + for(int i = 0; i < elements.size(); i++){ + CompoundExpression compE = (CompoundExpression)elements.get(i); + List<Expr> list = compE.getElements(); + + if(list.get(0).evaluate(context).equals(condition.evaluate(context))) + return list.get(1).evaluate(context); + } + return Constants.FALSE; + } +} diff --git a/Task_C/src/interpreter/lisp/CompoundExpression.java b/Task_C/src/interpreter/lisp/CompoundExpression.java index 705a11cabb1e78e25814d013b6c35bb8dcf332f3..5dea6c172af1ea0403dd087d79fa179a276740d5 100755 --- a/Task_C/src/interpreter/lisp/CompoundExpression.java +++ b/Task_C/src/interpreter/lisp/CompoundExpression.java @@ -27,6 +27,8 @@ public class CompoundExpression implements Expr { } else if (keyword.equals("if")) { return new Conditional(elements.get(1), elements.get(2), elements.get(3)).evaluate(context); + } else if (keyword.equals("case")) { + return new Case(elements.get(1), elements.subList(2,elements.size())).evaluate(context); } } return new FunctionCall((Symbol) elements.get(0),elements.subList(1,elements.size())).evaluate(context); diff --git a/Task_C/src/interpreter/lisp/Context.java b/Task_C/src/interpreter/lisp/Context.java index 5d8ebee1206d5ee9601761844c92a55963b6c19a..7a83385dbd0d446486184fe3277ead55755bffa4 100755 --- a/Task_C/src/interpreter/lisp/Context.java +++ b/Task_C/src/interpreter/lisp/Context.java @@ -13,6 +13,7 @@ public class Context { private Context() { bindings.put(new Symbol("="), new Eq()); bindings.put(new Symbol("*"), new Mult()); + bindings.put(new Symbol("+"), new Sum()); bindings.put(new Symbol("-"), new Sub()); // Add new top level bindings here } diff --git a/Task_C/src/interpreter/lisp/InterpreterTest.java b/Task_C/src/interpreter/lisp/InterpreterTest.java index ee5121a621058dbfb07f5252a37f0f98d5ac960c..88af932653e8023b8410152aed4679c41cc16710 100755 --- a/Task_C/src/interpreter/lisp/InterpreterTest.java +++ b/Task_C/src/interpreter/lisp/InterpreterTest.java @@ -3,8 +3,13 @@ package interpreter.lisp; public class InterpreterTest { public static void main(String[] args) { - Expr expr = Reader - .read("(def fac (x) (if (= x 0) 1 (* x (fac (- x 1)))))"); +// Expr expr = Reader +// .read("(def fac (x) (if (= x 0) 1 (* x (fac (- x 1)))))"); + + +// Expr expr = Reader.read("(def fac (x) (case x(3 0)))"); + Expr expr = Reader.read("(case 1 (0 0) (1 0))"); + /* * The expression above is a function definition of the function 'fac' * with parameter 'x', that calculates the factorial of x. @@ -25,8 +30,8 @@ public class InterpreterTest { */ Expr result = expr.evaluate(Context.getTopLevelContext()); - Expr expr2 = Reader.read("(fac 5)"); // fac(5) in Python - result = expr2.evaluate(Context.getTopLevelContext()); +// Expr expr2 = Reader.read("(fac 3)"); +// result = expr2.evaluate(Context.getTopLevelContext()); System.out.println(result); } diff --git a/Task_C/src/interpreter/lisp/Sum.java b/Task_C/src/interpreter/lisp/Sum.java new file mode 100644 index 0000000000000000000000000000000000000000..3124fd75e172e8a09a259a49bc175f25b841f923 --- /dev/null +++ b/Task_C/src/interpreter/lisp/Sum.java @@ -0,0 +1,16 @@ +package interpreter.lisp; + +public class Sum extends BinaryExpression<Num> { + + /** + * + * We assume that the operands have been evaluated to Num objects + * + * @see interpreter.lisp.BinaryExpression#evalBinaryExpression(interpreter.lisp.Expr, interpreter.lisp.Expr) + */ + @Override + Expr evalBinaryExpression(Num value1, Num value2) { + return new Num(value1.getValue()+value2.getValue()); + } + +} diff --git a/Task_C/src/polymorphism/PolymorphismTest.java b/Task_C/src/polymorphism/PolymorphismTest.java index b44832dbb43269fd73a4c62df934f0bc82275a29..1658a8abf61be57903355451cb74a17f3916f366 100755 --- a/Task_C/src/polymorphism/PolymorphismTest.java +++ b/Task_C/src/polymorphism/PolymorphismTest.java @@ -7,14 +7,14 @@ public class PolymorphismTest { ASubClass sub = new ASubClass(); ABaseClass subAsBase = new ASubClass(); // base.aMethod(sub); - base.aMethod(subAsBase); // The runtime type of subAsBase does not matter here ... +// base.aMethod(subAsBase); // The runtime type of subAsBase does not matter here ... // base.aMethod(base); // sub.aMethod(sub); - sub.aMethod(subAsBase); +// sub.aMethod(subAsBase); // sub.aMethod(base); subAsBase.aMethod(sub); // but it matters here. Why? -// subAsBase.aMethod(subAsBase); -// subAsBase.aMethod(base); + subAsBase.aMethod(subAsBase); + subAsBase.aMethod(base); } diff --git a/Task_C/src/visitor/Minus.java b/Task_C/src/visitor/Minus.java index 87866410ec7f4bc99ab7ef12fd85d00ff15d28a9..a4d8c45683e4c90b7e2c52d678b35a719a7e4ff3 100755 --- a/Task_C/src/visitor/Minus.java +++ b/Task_C/src/visitor/Minus.java @@ -13,9 +13,11 @@ public class Minus extends CompoundExpression { @Override public void accept(Visitor v) { - v.visit(leftOperand); - v.visit(rightOperand); +// v.visit(leftOperand); +// v.visit(rightOperand); + leftOperand.accept(v); v.visit(this); + rightOperand.accept(v); } } diff --git a/Task_C/src/visitor/PrintVisitor.java b/Task_C/src/visitor/PrintVisitor.java index af613f8d1b34638b4d10dfae449f202bdd9c8ee5..0d6ae43ef7fd973ceeda835e36bb734018f11f06 100755 --- a/Task_C/src/visitor/PrintVisitor.java +++ b/Task_C/src/visitor/PrintVisitor.java @@ -6,12 +6,12 @@ public class PrintVisitor extends Visitor { @Override public void visit(Number exp) { - System.out.print(MessageFormat.format("{0} ", exp.getValue())); + System.out.print(MessageFormat.format("({0} ", exp.getValue())); } @Override public void visit(Variable exp) { - System.out.print(MessageFormat.format("{0} ", exp.getName())); + System.out.print(MessageFormat.format("{0}) ", exp.getName())); } @Override @@ -24,5 +24,5 @@ public class PrintVisitor extends Visitor { System.out.print("- "); } - + } diff --git a/Task_C/src/visitor/SimpleExpression.java b/Task_C/src/visitor/SimpleExpression.java index f754b5229df30096919c7ce8cf0c8c297a1e93dd..0def29678c39b5d937f602e7aed1276d0d4e309b 100755 --- a/Task_C/src/visitor/SimpleExpression.java +++ b/Task_C/src/visitor/SimpleExpression.java @@ -2,5 +2,5 @@ package visitor; public abstract class SimpleExpression extends AbstractExpression { - + } diff --git a/Task_C/src/visitor/Sum.java b/Task_C/src/visitor/Sum.java index 8a4902c76d12be026119664bfab1807b715c5edb..8f188a1a26db583eff847ee98889375c3c8a31b0 100755 --- a/Task_C/src/visitor/Sum.java +++ b/Task_C/src/visitor/Sum.java @@ -13,9 +13,11 @@ public class Sum extends CompoundExpression { @Override public void accept(Visitor v) { +// v.visit(leftOperand); +// v.visit(rightOperand); leftOperand.accept(v); - rightOperand.accept(v); v.visit(this); + rightOperand.accept(v); } diff --git a/Task_C/src/visitor/VisitorTest.java b/Task_C/src/visitor/VisitorTest.java index e9e3aa559529194d9549a226dc9aa347e2beb0b2..ddcc22e946baf0284db512a1ea6b84f9e6637bc9 100755 --- a/Task_C/src/visitor/VisitorTest.java +++ b/Task_C/src/visitor/VisitorTest.java @@ -1,16 +1,17 @@ package visitor; +import java.text.MessageFormat; public class VisitorTest { public static void main(String[] args) { -// CountingVariablesVisitor v = new CountingVariablesVisitor(); + CountingVariablesVisitor v = new CountingVariablesVisitor(); AbstractExpression expression = new Sum(new Minus(new Number(1), new Variable("x", 3)), new Sum(new Number(5), new Variable("y", 7))); System.out.println(expression.toString()); -// expression.accept(v); -// System.out.println(MessageFormat.format( -// "There were {0} variables in the expression", v.getCount())); + expression.accept(v); + System.out.println(MessageFormat.format( + "There were {0} variables in the expression", v.getCount())); expression.accept(new PrintVisitor()); } }