diff options
| author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-12-05 20:52:33 +0000 | 
|---|---|---|
| committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-12-05 20:52:33 +0000 | 
| commit | 1709cb30fbdecff9cb78ad65b06792f1b6cee3fa (patch) | |
| tree | f99efb0bb9b101e21b1f365f61e26b4d3510d91f /src/Compiler | |
| parent | 9e6c89f1fa93287104381e02f0bbbdd6060a9382 (diff) | |
| download | esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.tar.gz esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.zip | |
Updated report grammar
Diffstat (limited to 'src/Compiler')
| -rw-r--r-- | src/Compiler/Parser.java | 15 | ||||
| -rw-r--r-- | src/Compiler/TokenScanner.java | 20 | ||||
| -rw-r--r-- | src/Compiler/TokenType.java | 3 | ||||
| -rw-r--r-- | src/Compiler/Translator.java | 5 | 
4 files changed, 38 insertions, 5 deletions
| diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java index 433035c..9f5e68d 100644 --- a/src/Compiler/Parser.java +++ b/src/Compiler/Parser.java @@ -408,7 +408,7 @@ public class Parser {       */      private Expression equality(){          Expression createdExpression = logical(); -        while (matchAndAdvance(TokenType.EQUALITY)){ +        while (matchAndAdvance(TokenType.EQUALITY)||matchAndAdvance(TokenType.NOT_EQUAL)){              Token op = getPreviousToken();              Expression right = logical();              createdExpression = new Expression.Binary(createdExpression, op, right); @@ -471,10 +471,21 @@ public class Parser {       * @return an expression of rank factor or lower        */      private Expression factor(){ -        Expression createdExpression = primary(); +        Expression createdExpression = exponent();          //Check for multiplication or division expressions          while (matchAndAdvance(TokenType.STAR)||matchAndAdvance(TokenType.SLASH)){              Token op = getPreviousToken(); +            Expression right = exponent(); +            createdExpression = new Expression.Binary(createdExpression, op, right); +        } +        return createdExpression; +    } + +    private Expression exponent(){ +        Expression createdExpression = primary(); +        //Check for multiplication or division expressions +        while (matchAndAdvance(TokenType.EXPONENT)){ +            Token op = getPreviousToken();              Expression right = primary();              createdExpression = new Expression.Binary(createdExpression, op, right);          } diff --git a/src/Compiler/TokenScanner.java b/src/Compiler/TokenScanner.java index ecb5ad3..e1f5fff 100644 --- a/src/Compiler/TokenScanner.java +++ b/src/Compiler/TokenScanner.java @@ -53,13 +53,29 @@ public class TokenScanner {              case ')': createTokenNull(TokenType.RIGHT_PAREN); break;              case '+': createTokenNull(TokenType.PLUS); break;              case '-': createTokenNull(TokenType.MINUS); break; -            case '*': createTokenNull(TokenType.STAR); break; -            case '/': createTokenNull(TokenType.SLASH); break;              case ';': createTokenNull(TokenType.SEMI_COLON); break;              case ',': createTokenNull(TokenType.COMMA); break;              //Some tokens are multiple characters long              //so need to check next char as well +            case '*':  +                if (checkNextChar('*')){ +                    createTokenNull(TokenType.EXPONENT); +                    break; +                } +                else{ +                    createTokenNull(TokenType.STAR);  +                    break;   +                } +            case '/':  +                if (checkNextChar('=')){ +                    createTokenNull(TokenType.NOT_EQUAL); +                    break; +                } +                else{ +                    createTokenNull(TokenType.SLASH);  +                    break;   +                }              case '=':                   if (checkNextChar('=')){                      createTokenNull(TokenType.EQUALITY); diff --git a/src/Compiler/TokenType.java b/src/Compiler/TokenType.java index d3df02e..09bd053 100644 --- a/src/Compiler/TokenType.java +++ b/src/Compiler/TokenType.java @@ -8,12 +8,13 @@ public enum TokenType {      EQUALITY, GREATER, LESS,      GREATER_EQUAL, LESS_EQUAL, -    DEFINE, +    DEFINE,NOT_EQUAL,      NUMBER,IDENTIFIER,STRING,      INT,REAL,PRINT,ENDPRINT,IF,THEN,END,ELSE,LEN,DO,WHILE,      AND,OR,NOT,DIMENSION,PROGRAM,FUNCTION,RETURN,SUBROUTINE, +    EXPONENT,      EOF  } diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java index d520b67..e6eda23 100644 --- a/src/Compiler/Translator.java +++ b/src/Compiler/Translator.java @@ -24,6 +24,7 @@ public class Translator{          //Write basic include header files          CCode.add("#include <stdio.h>");          CCode.add("#include <string.h>"); +        CCode.add("#include <math.h>");          //Try and write each statement, with a space between each          try{              for (Statement statement: statements){ @@ -409,6 +410,10 @@ public class Translator{                  return evaluateExpression(expr.left)+"&&"+evaluateExpression(expr.right);              case OR:                  return evaluateExpression(expr.left)+"||"+evaluateExpression(expr.right); +            case EXPONENT: +                return "pow("+evaluateExpression(expr.left)+","+evaluateExpression(expr.right)+")"; +            case NOT_EQUAL: +                return evaluateExpression(expr.left)+"!="+evaluateExpression(expr.right);              default:                  break; | 
