summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-12-05 20:52:33 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-12-05 20:52:33 +0000
commit1709cb30fbdecff9cb78ad65b06792f1b6cee3fa (patch)
treef99efb0bb9b101e21b1f365f61e26b4d3510d91f /src
parent9e6c89f1fa93287104381e02f0bbbdd6060a9382 (diff)
downloadesotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.tar.gz
esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.zip
Updated report grammar
Diffstat (limited to 'src')
-rw-r--r--src/Compiler/Parser.java15
-rw-r--r--src/Compiler/TokenScanner.java20
-rw-r--r--src/Compiler/TokenType.java3
-rw-r--r--src/Compiler/Translator.java5
-rw-r--r--src/examples/example.ft3
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