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 | |
parent | 9e6c89f1fa93287104381e02f0bbbdd6060a9382 (diff) | |
download | esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.tar.gz esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.zip |
Updated report grammar
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/examples/example.ft | 3 |
5 files changed, 40 insertions, 6 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; diff --git a/src/examples/example.ft b/src/examples/example.ft index ab5143d..3d6f5f2 100644 --- a/src/examples/example.ft +++ b/src/examples/example.ft @@ -4,8 +4,9 @@ int::b int::c a=2+3 b=3 -c=power(a,b) +c=a**b print*,c + end program example |