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/Compiler | |
| parent | b51dfd0763e27b01e73803b07c7994a6fd835bef (diff) | |
| download | esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.tar.gz esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.zip | |
Added Do statements and code blocks
Diffstat (limited to 'src/Compiler')
| -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 | 
5 files changed, 109 insertions, 29 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)+";"); | 
