diff options
author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-17 03:03:00 +0000 |
---|---|---|
committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-17 03:03:00 +0000 |
commit | 286e177e603d57d445393a0f4899bf7a17a4c31d (patch) | |
tree | f140d65931ee648a77c806380be1e39e27440caf /src | |
parent | b51dfd0763e27b01e73803b07c7994a6fd835bef (diff) | |
download | esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.tar.gz esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.zip |
Added Do statements and code blocks
Diffstat (limited to 'src')
-rw-r--r-- | src/Compiler/Parser.java | 52 | ||||
-rw-r--r-- | src/Compiler/Statement.java | 46 | ||||
-rw-r--r-- | src/Compiler/TokenScanner.java | 3 | ||||
-rw-r--r-- | src/Compiler/TokenType.java | 2 | ||||
-rw-r--r-- | src/Compiler/Translator.java | 35 | ||||
-rw-r--r-- | src/example.txt | 19 |
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 |