From b45a8d64302b7a8ebec76cb0cdc7e7be0449202f Mon Sep 17 00:00:00 2001 From: linha255 <linha255@tlhw-4-3.ad.liu.se> Date: Tue, 10 Sep 2019 14:50:46 +0200 Subject: [PATCH] lab 1 task C first commit --- Task_C/src/interpreter/lisp/Add.java | 16 ++++++++++ .../src/interpreter/lisp/CaseConditional.java | 29 +++++++++++++++++++ .../interpreter/lisp/CompoundExpression.java | 3 ++ Task_C/src/interpreter/lisp/Context.java | 2 ++ .../src/interpreter/lisp/InterpreterTest.java | 10 +++++-- Task_C/src/visitor/Minus.java | 6 ++-- 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 Task_C/src/interpreter/lisp/Add.java create mode 100644 Task_C/src/interpreter/lisp/CaseConditional.java diff --git a/Task_C/src/interpreter/lisp/Add.java b/Task_C/src/interpreter/lisp/Add.java new file mode 100644 index 0000000..4ad5f75 --- /dev/null +++ b/Task_C/src/interpreter/lisp/Add.java @@ -0,0 +1,16 @@ +package interpreter.lisp; + +public class Add extends BinaryExpression<Num>{ + + public Add() { + // TODO Auto-generated constructor stub + } + + @Override + Expr evalBinaryExpression(Num value1, Num value2) { + // TODO Auto-generated method stub + return new Num(value1.getValue()+value2.getValue()); + + } + +} diff --git a/Task_C/src/interpreter/lisp/CaseConditional.java b/Task_C/src/interpreter/lisp/CaseConditional.java new file mode 100644 index 0000000..2fb7f4f --- /dev/null +++ b/Task_C/src/interpreter/lisp/CaseConditional.java @@ -0,0 +1,29 @@ +package interpreter.lisp; +import java.util.List; + +public class CaseConditional extends CompoundExpression{ + private Expr cond; + private List<Expr> valsExpr; + + public CaseConditional(Expr cond, List<Expr> valExpr) { + // TODO Auto-generated constructor stub + this.cond = cond; + this.valsExpr = valExpr; + } + + @Override + public Expr evaluate(Context context) { + // TODO Auto-generated method stub + Expr correctExpr; + for (int i = 0; i < valsExpr.size(); i++) { + CompoundExpression expr = (CompoundExpression) valsExpr.get(i); + if (new Eq().evalBinaryExpression(cond.evaluate(context), + expr.getElements().get(0).evaluate(context)) == Constants.TRUE) { + correctExpr =expr.getElements().get(1).evaluate(context); + return correctExpr; + } + } + return Constants.FALSE; + } + +} diff --git a/Task_C/src/interpreter/lisp/CompoundExpression.java b/Task_C/src/interpreter/lisp/CompoundExpression.java index 705a11c..e5a957b 100755 --- a/Task_C/src/interpreter/lisp/CompoundExpression.java +++ b/Task_C/src/interpreter/lisp/CompoundExpression.java @@ -6,6 +6,7 @@ import java.util.List; public class CompoundExpression implements Expr { private List<Expr> elements = new ArrayList<Expr>(); + private Context context; public void add(Expr node) { elements.add(node); @@ -27,6 +28,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 CaseConditional(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 5d8ebee..ec3e3ef 100755 --- a/Task_C/src/interpreter/lisp/Context.java +++ b/Task_C/src/interpreter/lisp/Context.java @@ -14,6 +14,8 @@ public class Context { bindings.put(new Symbol("="), new Eq()); bindings.put(new Symbol("*"), new Mult()); bindings.put(new Symbol("-"), new Sub()); + bindings.put(new Symbol("+"), new Add()); + // 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 ee5121a..60892e6 100755 --- a/Task_C/src/interpreter/lisp/InterpreterTest.java +++ b/Task_C/src/interpreter/lisp/InterpreterTest.java @@ -5,6 +5,9 @@ public class InterpreterTest { public static void main(String[] args) { Expr expr = Reader .read("(def fac (x) (if (= x 0) 1 (* x (fac (- x 1)))))"); + + + /* * The expression above is a function definition of the function 'fac' * with parameter 'x', that calculates the factorial of x. @@ -25,8 +28,11 @@ 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("(case 2 ((* 1 2) (- 1 5)) (1 3)"); + Expr expr3 = Reader.read("(case (* 3 (+ 1 2)) ((+ 6 2) 0) (14 2) ((+ 6 3) (- 2 1))))"); + + //Expr expr2 = Reader.read("(fac 5)"); // fac(5) in Python + result = expr3.evaluate(Context.getTopLevelContext()); System.out.println(result); } diff --git a/Task_C/src/visitor/Minus.java b/Task_C/src/visitor/Minus.java index 8786641..6ed38a6 100755 --- a/Task_C/src/visitor/Minus.java +++ b/Task_C/src/visitor/Minus.java @@ -13,8 +13,10 @@ 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); + rightOperand.accept(v); v.visit(this); } -- GitLab