summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-17 03:03:00 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-17 03:03:00 +0000
commit286e177e603d57d445393a0f4899bf7a17a4c31d (patch)
treef140d65931ee648a77c806380be1e39e27440caf
parentb51dfd0763e27b01e73803b07c7994a6fd835bef (diff)
downloadesotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.tar.gz
esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.zip
Added Do statements and code blocks
-rw-r--r--src/Compiler/Parser.java52
-rw-r--r--src/Compiler/Statement.java46
-rw-r--r--src/Compiler/TokenScanner.java3
-rw-r--r--src/Compiler/TokenType.java2
-rw-r--r--src/Compiler/Translator.java35
-rw-r--r--src/example.txt19
6 files changed, 122 insertions, 35 deletions
diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java
index 7eb22df..5288c67 100644
--- a/src/Compiler/Parser.java
+++ b/src/Compiler/Parser.java
@@ -3,6 +3,8 @@ package Compiler;
import java.util.ArrayList;
import java.util.List;
+import Compiler.Statement.BlockStatement;
+
public class Parser {
private final List<Token> tokens;
private int currentToken = 0;
@@ -70,10 +72,24 @@ public class Parser {
}else if (matchAndAdvance(TokenType.IF)){
Statement statement = ifStatement();
return statement;
+ }else if (matchAndAdvance(TokenType.DO)){
+ Statement statement = doStatement();
+ return statement;
}
return expressionStatement();
}
+ private BlockStatement blockStatement(){
+ List<Statement> statements = new ArrayList<>();
+ while(!matchAndAdvance(TokenType.END)&&!checkToken(TokenType.ELSE)){
+ if(checkEOF()){
+ throw error("end missing from block");
+ }
+ statements.add(declaration());
+ }
+ return new Statement.BlockStatement(statements);
+ }
+
private Statement printStatement(){
matchOrError(TokenType.STAR, "Syntax, print *, item1, item2...");
List<Expression> exprList = new ArrayList<>();
@@ -92,26 +108,32 @@ public class Parser {
private Statement ifStatement(){
Expression condition = expression();
if(matchOrError(TokenType.THEN, "then expected after if statement")){
- List<Statement> statements = new ArrayList<>();
- List<Statement> elseStatements = new ArrayList<>();
- while(!matchAndAdvance(TokenType.ENDIF)&&!checkToken(TokenType.ELSE)){
- if(checkEOF()){
- throw error("endif missing");
- }
- statements.add(declaration());
- }
+ Statement.BlockStatement ifBlock = blockStatement();
+ Statement.BlockStatement elseBlock=null;
+
if(matchAndAdvance(TokenType.ELSE)){
- while(!matchAndAdvance(TokenType.ENDIF)){
- if(checkEOF()){
- throw error("endif missing");
- }
- elseStatements.add(declaration());
- }
+ elseBlock=blockStatement();
}
- Statement ifstatement = new Statement.IfStatement(condition, statements,elseStatements);
+ matchOrError(TokenType.IF, "If statements end with if");
+ Statement ifstatement = new Statement.IfStatement(condition, ifBlock,elseBlock);
return ifstatement;
}
return null;
+ }
+
+ private Statement doStatement(){
+ Expression variable =expression();
+ matchOrError(TokenType.EQUALS, "'=' missing");
+ Expression start = expression();
+ matchOrError(TokenType.COMMA, " use ',' between values");
+ Expression stop = expression();
+ Expression step = null;
+ if(matchAndAdvance(TokenType.COMMA)){
+ step = expression();
+ }
+ Statement.BlockStatement codeBlock = blockStatement();
+ matchOrError(TokenType.DO, "Do statements end with do");
+ return new Statement.DoStatement(variable, start, stop, step,codeBlock);
}
diff --git a/src/Compiler/Statement.java b/src/Compiler/Statement.java
index b8916aa..10ed878 100644
--- a/src/Compiler/Statement.java
+++ b/src/Compiler/Statement.java
@@ -18,16 +18,30 @@ abstract class Statement {
}
}
+ static class BlockStatement extends Statement{
+ BlockStatement(List<Statement> statements){
+ this.statements=statements;
+ }
+
+ final List<Statement> statements;
+
+ @Override
+ public String getStatmentType() {
+ return "block";
+ }
+
+ }
+
static class IfStatement extends Statement{
- IfStatement(Expression condition, List<Statement> statements,List<Statement> elseStatements){
+ IfStatement(Expression condition, BlockStatement ifBlock,BlockStatement elseBlock){
this.condition=condition;
- this.statements=statements;
- this.elseStatements=elseStatements;
+ this.ifBlock=ifBlock;
+ this.elseBlock=elseBlock;
}
final Expression condition;
- final List<Statement> statements;
- final List<Statement> elseStatements;
+ final BlockStatement ifBlock;
+ final BlockStatement elseBlock;
@Override
public String getStatmentType() {
@@ -35,6 +49,28 @@ abstract class Statement {
}
}
+ static class DoStatement extends Statement{
+ DoStatement(Expression variable, Expression start,Expression stop,Expression step,BlockStatement codeBlock){
+ this.variable=variable;
+ this.start=start;
+ this.stop=stop;
+ this.step=step;
+ this.codeBlock=codeBlock;
+
+ }
+
+ final Expression variable;
+ final Expression start;
+ final Expression stop;
+ final Expression step;
+ final BlockStatement codeBlock;
+
+ @Override
+ public String getStatmentType() {
+ return "doStmt";
+ }
+ }
+
static class VariableDeclaration extends Statement{
VariableDeclaration(Token name,String type){
diff --git a/src/Compiler/TokenScanner.java b/src/Compiler/TokenScanner.java
index f2fcab3..07994d0 100644
--- a/src/Compiler/TokenScanner.java
+++ b/src/Compiler/TokenScanner.java
@@ -199,7 +199,8 @@ public class TokenScanner {
keywords.put("endprint", TokenType.ENDPRINT);
keywords.put("if", TokenType.IF);
keywords.put("then", TokenType.THEN);
- keywords.put("endif", TokenType.ENDIF);
+ keywords.put("end", TokenType.END);
keywords.put("else", TokenType.ELSE);
+ keywords.put("do", TokenType.DO);
}
}
diff --git a/src/Compiler/TokenType.java b/src/Compiler/TokenType.java
index f597d2f..403cfe6 100644
--- a/src/Compiler/TokenType.java
+++ b/src/Compiler/TokenType.java
@@ -12,7 +12,7 @@ public enum TokenType {
NUMBER,IDENTIFIER,STRING,
- INT,REAL,PRINT,ENDPRINT,IF,THEN,ENDIF,ELSE,LEN,
+ INT,REAL,PRINT,ENDPRINT,IF,THEN,END,ELSE,LEN,DO,
EOF
}
diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java
index d343b80..4c5da89 100644
--- a/src/Compiler/Translator.java
+++ b/src/Compiler/Translator.java
@@ -44,12 +44,18 @@ public class Translator{
case "stringDec":
evalStringDeclaration((StringDeclaration)statement);
break;
+ case "block":
+ evalBlockStatement((BlockStatement)statement);
+ break;
case "print":
evalPrintStatement((PrintStatement)statement);
break;
case "ifStmt":
evalIfStatement((IfStatement)statement);
break;
+ case "doStmt":
+ evalDoStatement((DoStatement)statement);
+ break;
}
}
private void evalExpressionStatement(ExpressionStatement stmt){
@@ -72,6 +78,12 @@ public class Translator{
}
}
+ private void evalBlockStatement(BlockStatement block){
+ for(Statement stmt:block.statements){
+ evaluateStatement(stmt);
+ }
+ }
+
private void evalPrintStatement(PrintStatement print){
String types="";
String values="";
@@ -104,16 +116,24 @@ public class Translator{
private void evalIfStatement(IfStatement ifstatement){
CCode.add("if("+evaluateExpression(ifstatement.condition)+"){");
- for(Statement s:ifstatement.statements) {
- evaluateStatement(s);
- }
- if(ifstatement.elseStatements.size()>0){
+ evaluateStatement(ifstatement.ifBlock);
+ if(!(ifstatement.elseBlock==null)){
CCode.add("}");
CCode.add("else {");
- for(Statement s:ifstatement.elseStatements) {
- evaluateStatement(s);
- }
+ evaluateStatement(ifstatement.elseBlock);
+ }
+ CCode.add("}");
+ }
+
+ private void evalDoStatement(DoStatement dostatement){
+ String start = evaluateExpression(dostatement.variable)+"="+evaluateExpression(dostatement.start);
+ String stop = evaluateExpression(dostatement.variable)+"<="+evaluateExpression(dostatement.stop);
+ String step = evaluateExpression(dostatement.variable)+"++";
+ if(!(dostatement.step==null)){
+ step = evaluateExpression(dostatement.variable)+"+="+evaluateExpression(dostatement.step);
}
+ CCode.add("for("+start+";"+stop+";"+step+"){");
+ evaluateStatement(dostatement.codeBlock);
CCode.add("}");
}
@@ -171,6 +191,7 @@ public class Translator{
if(((Expression.Literal)expr.value).type.equals("string")){
CCode.add("strcpy("+expr.name.text+","+evaluateExpression(expr.value)+");");
}
+ CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";");
}
else{
CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";");
diff --git a/src/example.txt b/src/example.txt
index 8e10c72..eb453b2 100644
--- a/src/example.txt
+++ b/src/example.txt
@@ -1,6 +1,13 @@
-character (len=10)::hello
-hello="hello"
-if 5==5 then
-hello="goodbye "
-endif
-print *,hello,6," test" endprint \ No newline at end of file
+int ::temp
+int::a
+int::b
+int::i
+a=1
+b=1
+i=0
+do i=0,10
+print*,a," " endprint
+temp =a+b
+a=b
+b=temp
+end do \ No newline at end of file