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/Parser.java | |
parent | b51dfd0763e27b01e73803b07c7994a6fd835bef (diff) | |
download | esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.tar.gz esotericFORTRAN-286e177e603d57d445393a0f4899bf7a17a4c31d.zip |
Added Do statements and code blocks
Diffstat (limited to 'src/Compiler/Parser.java')
-rw-r--r-- | src/Compiler/Parser.java | 52 |
1 files changed, 37 insertions, 15 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); } |