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 | |
parent | 9e6c89f1fa93287104381e02f0bbbdd6060a9382 (diff) | |
download | esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.tar.gz esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.zip |
Updated report grammar
-rw-r--r-- | report/esoteric_project_report.pdf | bin | 298285 -> 299547 bytes | |||
-rw-r--r-- | report/esoteric_project_report.tex | 58 | ||||
-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 |
7 files changed, 86 insertions, 18 deletions
diff --git a/report/esoteric_project_report.pdf b/report/esoteric_project_report.pdf Binary files differindex 5c33d8a..b01ca3c 100644 --- a/report/esoteric_project_report.pdf +++ b/report/esoteric_project_report.pdf diff --git a/report/esoteric_project_report.tex b/report/esoteric_project_report.tex index 3da6800..fd144b0 100644 --- a/report/esoteric_project_report.tex +++ b/report/esoteric_project_report.tex @@ -162,25 +162,36 @@ asdf \begin{table}[h!] \begin{center} - \begin{tabular}{|l|r|} \hline \textbf{Abbreviation} & \textbf{Term}\\ \hline - $<$program$>$ ::= & $<$statement$>$* \\ + $<$program$>$ ::= & $<$function-call$>$* \\ + \hline + $<$function-call$>$ ::= & $<$main-function$> |$ \\ + & $<$function$> |$ \\ + & $<$subroutine$>$\\ + \hline + $<$main-function$>$ ::= & "program" $<$identifier$>$ $<$block$>$ "program "$<$identifier$>$\\ + \hline + $<$function$>$::=&$<$type$>$$<$identifier$>$"("$<$expression$>$","*")"$<$block$>$\\ + \hline + $<$subroutine$>$::=&$<$identifier$>$"("$<$expression$>$","*")"$<$block$>$\\ + \hline + $<$block$>$::=& $<$statement$>$* "end" $|$\\ + & $<$statement$>$* $<$return$>$ "end" $|$\\ \hline $<$statement$>$ ::= & $<$declaration$>$ $|$ \\ & $<$expr-Statement$>$ $|$\\ & $<$print-Statement$>$ $|$ \\ - & $<$if-Statement$>$ \\ - & $<$do-Statement$>$ \\ + & $<$if-Statement$>$ $|$\\ + & $<$do-Statement$>$ $|$\\ & $<$do-while-Statement$>$ \\ \hline - $<$block$>$::=& $<$statement$>$* "end"\\ - \hline $<$declaration$>$ ::= & "character (len = "$<$number$>$")::"$<$identifier$>$ $|$ \\ - & "int::"$<$identifier$>$ \\ + & "int::"$<$identifier$>$ $|$\\ & "real::"$<$identifier$>$ \\ + & $<$type$>$ "dimension("$<$expression$>$*")"::$<$identifier$>$\\ \hline $<$print-Statement$>$ ::= & "print *" (","$<$expression$>$)* \\ \hline @@ -196,14 +207,32 @@ asdf & $<$block$>$ \\ & "do"\\ \hline + $<$return$>$ ::= & "return" $<$expression$>$\\ + \hline $<$expr-statement$>$ ::= & $<$expression$>$\\ \hline + \end{tabular} + \label{tab:table1} + \caption{Grammar table for EsotericFortran Statements} +\end{center} +\end{table} +\begin{table}[h!] + \begin{center} + \begin{tabular}{|l|r|} + \hline + \textbf{Abbreviation} & \textbf{Term}\\ + \hline + \hline $<$expression$>$ ::= & $<$assignment$>$\\ \hline $<$assignment$>$ ::= & $<$identifier$>$"="$<$equality$>$$|$\\ & $<$equality$>$$|$\\ \hline - $<$equality$>$ ::= & $<$comparison$>$"=="$<$comparison$>$$|$\\ + $<$equality$>$ ::= & $<$logical$>$("=="$|$"/=")$<$logical$>$$|$\\ + & $<$logical$>$$|$\\ + \hline + $<$logical$>$ ::= & $<$comparison$>$(".and."$|$".or.")$<$comparison$>$$|$\\ + & $<$".not."$>$$<$comparison$>$$|$\\ & $<$comparison$>$$|$\\ \hline $<$comparison$>$ ::= & $<$term$>$("$>$"$|$"$<$"$|$"$>=$"$|$"$>=$")$<$term$>$$|$\\ @@ -212,12 +241,16 @@ asdf $<$term$>$ ::= & $<$factor$>$("+"$|$"-")$<$factor$>$$|$\\ & $<$factor$>$$|$\\ \hline - $<$comparison$>$ ::= & $<$primary$>$("*"$|$"/")$<$primary$>$$|$\\ + $<$factor$>$ ::= & $<$exponent$>$("*"$|$"/")$<$exponent$>$$|$\\ + & $<$exponent$>$$|$\\ + \hline + $<$exponent$>$ ::= & $<$primary$>$"**"$<$primary$>$$|$\\ & $<$primary$>$$|$\\ \hline $<$primary$>$ ::= & $<$number$>$$|$\\ & $<$identifier$>$$|$\\ - & $<$string$>$\\ + & $<$string$>$$|$\\ + & $<$identifier$>$"("$<$expression$>$","*")"\\ \hline $<$number$>$ ::= & $<$digit$>$*("."$<$digit$>$*)?\\ @@ -233,13 +266,14 @@ asdf $<$alpha$>$::=&"a"..."z"$|$"A"..."Z"\\ \hline + $<$type$>$::=&"int"$|$"real"$|$"string"\\ + \hline \end{tabular} \label{tab:table1} - \caption{Grammar table for Fortran} + \caption{Grammar table for EsotericFortran Expressions} \end{center} \end{table} - \chapter{Documentation}\label{MethLab} We decided it would be a good idea to note down and record our application stage by stage while developing our Esolang so that we may refer back to previous parts for reference. It will also help track our progress throughout the project to ensure we stay on track. 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 |