summaryrefslogtreecommitdiffstats
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
parent9e6c89f1fa93287104381e02f0bbbdd6060a9382 (diff)
downloadesotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.tar.gz
esotericFORTRAN-1709cb30fbdecff9cb78ad65b06792f1b6cee3fa.zip
Updated report grammar
-rw-r--r--report/esoteric_project_report.pdfbin298285 -> 299547 bytes
-rw-r--r--report/esoteric_project_report.tex58
-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
7 files changed, 86 insertions, 18 deletions
diff --git a/report/esoteric_project_report.pdf b/report/esoteric_project_report.pdf
index 5c33d8a..b01ca3c 100644
--- a/report/esoteric_project_report.pdf
+++ b/report/esoteric_project_report.pdf
Binary files differ
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