diff options
author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-07 01:23:19 +0000 |
---|---|---|
committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-07 01:23:19 +0000 |
commit | f8b888716211b78900db62ede497fa4ac2100c00 (patch) | |
tree | 3ea66c732de6abb95b10e708d0ab33651cb6b327 /src/Compiler/Parser.java | |
parent | d3046e3b1481cf6d190b8fcb814985e29852b5eb (diff) | |
download | esotericFORTRAN-f8b888716211b78900db62ede497fa4ac2100c00.tar.gz esotericFORTRAN-f8b888716211b78900db62ede497fa4ac2100c00.zip |
Basic floating point support and small improvements to error handing
Diffstat (limited to 'src/Compiler/Parser.java')
-rw-r--r-- | src/Compiler/Parser.java | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java index 412289a..68851bf 100644 --- a/src/Compiler/Parser.java +++ b/src/Compiler/Parser.java @@ -13,28 +13,37 @@ public class Parser { List<Statement> parse(){ List<Statement> statements = new ArrayList<>(); - while (!checkEOF()){ - statements.add(declaration()); + try{ + while (!checkEOF()){ + statements.add(declaration()); + } + }catch (Error e){ + return null; } return statements; } + + //Clean up and reduce code mess private Statement declaration(){ - try{ - if (matchAndAdvance(TokenType.VAR)){ - if (matchOrError(TokenType.DEFINE, ":: Required for variable definition")){ - if (matchOrError(TokenType.IDENTIFIER,"Expected variable name.")){ - Token varName = getPreviousToken(); - return new Statement.VariableDeclaration(varName); - } - } + if (matchAndAdvance(TokenType.INT)){ + if (matchOrError(TokenType.DEFINE, ":: Required for variable definition")){ + if (matchOrError(TokenType.IDENTIFIER,"Expected variable name.")){ + Token varName = getPreviousToken(); + return new Statement.VariableDeclaration(varName,"int"); + } + } + } else if (matchAndAdvance(TokenType.REAL)){ + if (matchOrError(TokenType.DEFINE, ":: Required for variable definition")){ + if (matchOrError(TokenType.IDENTIFIER,"Expected variable name.")){ + Token varName = getPreviousToken(); + return new Statement.VariableDeclaration(varName,"real"); + } } - return statement(); - } catch (Error e){ - currentToken++; - return null; } + + return statement(); } private Statement statement(){ @@ -55,14 +64,14 @@ public class Parser { List<Statement> statements = new ArrayList<>(); List<Statement> elseStatements = new ArrayList<>(); while(!matchAndAdvance(TokenType.ENDIF)&&!checkToken(TokenType.ELSE)){ - if(matchAndAdvance(TokenType.EOF)){ + if(checkEOF()){ throw error("endif missing"); } statements.add(declaration()); } if(matchAndAdvance(TokenType.ELSE)){ while(!matchAndAdvance(TokenType.ENDIF)){ - if(matchAndAdvance(TokenType.EOF)){ + if(checkEOF()){ throw error("endif missing"); } elseStatements.add(declaration()); @@ -140,7 +149,11 @@ public class Parser { private Expression primary(){ if (matchAndAdvance(TokenType.NUMBER)){ - return new Expression.Literal(getPreviousToken()); + if(getPreviousToken().value instanceof Integer){ + return new Expression.Literal(getPreviousToken(),"int"); + } else if(getPreviousToken().value instanceof Double){ + return new Expression.Literal(getPreviousToken(),"double"); + } } if (matchAndAdvance(TokenType.IDENTIFIER)) { |