summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Parser.java
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 /src/Compiler/Parser.java
parentb51dfd0763e27b01e73803b07c7994a6fd835bef (diff)
downloadesotericFORTRAN-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.java52
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);
}