diff --git a/expressions.txt b/expressions.txt index 55a3a7cdea25a3ba43c49de00c3db8a30cb5d121..956089d3b8d3ba88c9d22f8958713a1d48b6d3a6 100644 --- a/expressions.txt +++ b/expressions.txt @@ -1,4 +1,2 @@ -1 + x*y^2 - (31 * x)-y -1 + x^2 - (3 * x) -2-x + 0.5*x^2 - 1 -(5*2-(5^2)+3*(201.01-15)) \ No newline at end of file +1+(x^2)-(3*x) +2*x+0.5*(x^2)-1 \ No newline at end of file diff --git a/lib/JChart.jar b/lib/JChart.jar new file mode 100644 index 0000000000000000000000000000000000000000..720f3fe02bcb1a5a9abc66553589b150c10770ec Binary files /dev/null and b/lib/JChart.jar differ diff --git a/src/ASTPrinter.java b/src/ASTPrinter.java index a057d9a4f785a696f8f54321a09256f3e8d2ca83..8983653899e5b1c2c6fe66545fb25a77a9a60614 100644 --- a/src/ASTPrinter.java +++ b/src/ASTPrinter.java @@ -5,9 +5,19 @@ public class ASTPrinter implements Visitor<String>{ if(binaryOP.capsuled) { sb.append("("); } - sb.append(binaryOP.leftExpression.accept(this)); - sb.append(binaryOP.operator); - sb.append(binaryOP.rightExpression.accept(this)); + if(binaryOP.operator.contains("^")) { + sb.append("Pow("); + sb.append(binaryOP.leftExpression.accept(this)); + sb.append(","); + sb.append(binaryOP.rightExpression.accept(this)); + sb.append(")"); + } + else { + sb.append(binaryOP.leftExpression.accept(this)); + sb.append(binaryOP.operator); + sb.append(binaryOP.rightExpression.accept(this)); + } + if(binaryOP.capsuled) { sb.append(")"); } diff --git a/src/Application.java b/src/Application.java index f185a6a8f6ba5b39558371e3fefc57df22e5a822..b25cd9ffc6a1585f394ddb33f6508b39db69ceef 100644 --- a/src/Application.java +++ b/src/Application.java @@ -1,14 +1,11 @@ import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class Application { public static void main(String[] args) { - //LinkedList<String> expressions = new LinkedList<>() - //LinkedList<String> expressions = new List<>(); List<String> expressions = new LinkedList<>(); //Reads the file "expressions.txt" and adds its values to a list BufferedReader reader; @@ -41,7 +38,11 @@ public class Application { try { Parser.Expression exp = parser.parse(tokens); ASTPrinter printer = new ASTPrinter(); + Evaluator evaluator = new Evaluator(); System.out.println("Printing: '" + printer.visit(exp) + "'"); + String s = printer.visit(exp); + System.out.println("Evaluating: '" + evaluator.visit(exp) + "'"); + SwingFunctionPlotter.plotFunction(s); } catch (ParserException e) { System.out.println(e.getMessage()); diff --git a/src/Evaluator.java b/src/Evaluator.java index 4599b7036ea36fd5a8825cca321eded9e1a01089..b9979c778266a973dd424cf79e7eea1769dfcd1b 100644 --- a/src/Evaluator.java +++ b/src/Evaluator.java @@ -1,2 +1,63 @@ -public class Evaluator { +public class Evaluator implements Visitor<Double>{ + + @Override + public Double visit(final Parser.BinaryOperation binaryOP) { + double result = binaryOP.leftExpression.accept(this); + Double rOperand = binaryOP.rightExpression.accept(this); + if(rOperand==null) { + + + } + switch (binaryOP.operator.charAt(0)) { + case '+': + result += rOperand; + break; + case '-': + result -= rOperand; + break; + case '*': + result *= rOperand; + break; + case '/': + if (rOperand != 0) { + result /= rOperand; + } + else { + result = result; + //throw new ArithmeticException("Arithmetic Error: division by zero detected"); + } + break; + case '^': + for(int i=1; i<rOperand; i++) { + result = result*result; + } + break; + default: + throw new RuntimeException("SematicError: unknown operand found in AST: " + + binaryOP.operator); + } + return result; + } + + @Override + public Double visit(final Parser.Variable variable) { + return 0.0; + } + + @Override + public Double visit(final Parser.Number number) { + return Double.valueOf(number.digits); + } + + @Override + public Double visit(final Parser.Decimal decimal) { + return Double.valueOf(decimal.afterDot.digits + "." + decimal.beforeDot.digits); + } + + public double visit(final Parser.Expression ast) { + if(ast==null) { + return 0.0; + } + return ast.accept(this); + } } diff --git a/src/SwingFunctionPlotter.java b/src/SwingFunctionPlotter.java new file mode 100644 index 0000000000000000000000000000000000000000..110dc614322009d5b95b85ec38246c21fa8c4aba --- /dev/null +++ b/src/SwingFunctionPlotter.java @@ -0,0 +1,44 @@ +import com.mindfusion.charting.FunctionSeries; +import com.mindfusion.charting.swing.LineChart; + +import javax.swing.*; +import java.awt.*; + +public class SwingFunctionPlotter extends JFrame { + private static final long serialVersionUID = 1L; + + public static void plotFunction(String function) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + try { + new SwingFunctionPlotter(function).setVisible(true); + } + catch(Exception e) { + e.printStackTrace(); + } + } + }); + } + + protected SwingFunctionPlotter(String function) { + setDefaultCloseOperation(EXIT_ON_CLOSE); + setSize(650, 400); + setTitle("Java Swing Library for Charts and Gauges: FunctionSeries"); + + getContentPane().add(initializeChart(function), BorderLayout.CENTER); + } + + private LineChart initializeChart(String function) { + LineChart lineChart = new LineChart(); + FunctionSeries series1; + try { + series1 = new FunctionSeries(function,1000, -20, 20); + series1.setTitle("Current function"); + lineChart.getSeries().add(series1); + } + catch(Exception e) { + e.printStackTrace(); + } + return lineChart; + } +} \ No newline at end of file diff --git a/to-do.txt b/to-do.txt deleted file mode 100644 index de2bf44168c2d6f4afc24050f19d24d651e510e4..0000000000000000000000000000000000000000 --- a/to-do.txt +++ /dev/null @@ -1,9 +0,0 @@ -2. Testklassen - -3. Visitor pattern -4. plot function -5. Überarbeiten --> Dokumentation --> Exceptions --> Kommentare --> Code strukturieren \ No newline at end of file