From 0afb650d149a0ff9dcc9777c0ec041c533b136b4 Mon Sep 17 00:00:00 2001 From: Maƫl Gassmann Date: Sat, 12 Jun 2021 14:25:57 +0200 Subject: [~] First working version of the JavaCC calculator --- calculator-javacc/Calculator.jj | 136 +++++++++++++++++++++++++++++++--------- 1 file changed, 106 insertions(+), 30 deletions(-) diff --git a/calculator-javacc/Calculator.jj b/calculator-javacc/Calculator.jj index 9222654..cc22b0a 100644 --- a/calculator-javacc/Calculator.jj +++ b/calculator-javacc/Calculator.jj @@ -1,48 +1,40 @@ options{ //DEBUG_PARSER = true; DEBUG_TOKEN_MANAGER = true; - STATIC=false; } PARSER_BEGIN(Calculator) -import java.util.Scanner; -import java.io.StringReader; +import java.util.HashMap; public class Calculator { - private static double currentNumber; - - public static double fromString(String stringToParse) throws ParseException{ - currentNumber = 0.0; - - Calculator parser = new Calculator(new StringReader(stringToParse)); - parser.parse(); - return currentNumber; - } + private static HashMap variables = new HashMap(); public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); + Calculator parser = new Calculator(System.in); while (true){ System.out.print("Type your expression: "); - String expression = scanner.nextLine(); try{ - System.out.println("Returned: " + fromString(expression)); - }catch (Throwable t){ - System.out.println(t); + double value = parser.evaluateNextLine(); + System.out.println("Returned: " + value); + }catch (ParseException e){ + System.out.println(e.getMessage()); + try{ + parser.passStatement(); // wiping the tokens of the malformed expression + }catch (ParseException ex){ + System.out.println(ex.getMessage()); + } } } } } PARSER_END(Calculator) -/** -* For now only using the Hello World grammar -*/ - SKIP : { - " "|"\t"|"\n"|"\r" + " "|"\t" } TOKEN : { + | | | | @@ -56,24 +48,108 @@ TOKEN : { } +double statement() : +{ + Token id; + double i = 0.0; +} +{ + { System.exit(0); }| + i=expression() { return i; }| + id= i=expression() + { + variables.put(id.image,i); //Storing the variable + return i; + } +} + +double expression() : +{ + Token op = null; + double l = 0.0; + double r = 0.0; +} +{ + l=term() ((op= | op=) r=term() + { // folding everything in the l variable + if (op != null){ + if (op.image.equals("+")) + l += r; + else + l -= r; + } + + } + )* + { //returning the parsed value + return l; + } +} + +double term() : +{ + Token op = null; + double l = 0.0; + double r = 0.0; +} +{ + l=factor() ((op=
| op=) r=factor() + { // folding everything in the l variable + if (op != null){ + if (op.image.equals("/")) + l /= r; + else + l *= r; + } + } + )* + { //returning the parsed value + return l; + } +} double factor() : { - Token t; - double i; + Token t = null; + Token id = null; + double i = 0.0; } { - t = + (t= | id= | (i=expression())? ) { - i = Double.parseDouble(t.image); - currentNumber += i; + if(id != null){ + Object var = variables.get(id.image); + if (var != null) + i = (double) var; + else + throw new ParseException("'" + id.image + "' is not yet defined."); + }else if(t != null) + i = Double.parseDouble(t.image); return i; - } + }| + (t= | id= | (i=expression())? ) + { + if(id != null){ + i = (double)variables.get(id.image); + }else if(t != null) + i = Double.parseDouble(t.image); + return i*(-1); + } } -void parse() : { +double evaluateNextLine() : +{ + double result = 0.0; +} +{ + (result=statement())? {return result;}| + {System.out.println("\nBuffer was closed. Exiting."); System.exit(0);} } + +void passStatement() : +{} { - (factor())* + | + {System.out.println("\nBuffer was closed. Exiting."); System.exit(0);} } \ No newline at end of file -- cgit v1.2.3