diff options
Diffstat (limited to 'src/Compiler/Parser.java')
-rw-r--r-- | src/Compiler/Parser.java | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java index 68851bf..7eb22df 100644 --- a/src/Compiler/Parser.java +++ b/src/Compiler/Parser.java @@ -28,19 +28,37 @@ public class Parser { //Clean up and reduce code mess private Statement declaration(){ 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"); - } - } + matchOrError(TokenType.DEFINE, ":: Required for variable definition"); + 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"); - } + matchOrError(TokenType.DEFINE, ":: Required for variable definition"); + matchOrError(TokenType.IDENTIFIER,"Expected variable name."); + Token varName = getPreviousToken(); + return new Statement.VariableDeclaration(varName,"real"); + + //Could be improved significatly when verifiying length is a positive integer + } else if (matchAndAdvance(TokenType.STRING)){ + matchOrError(TokenType.LEFT_PAREN, "Length of string must be defined"); + matchOrError(TokenType.LEN, "Length of string must be defined"); + matchOrError(TokenType.EQUALS, "Length of string must be defined"); + Expression length = expression(); + if(!(length instanceof Expression.Literal)){ + throw error("String length must be a number"); + } + if(!((Expression.Literal)length).type.equals("int")){ + throw error("String length must be a integer"); } + if((int)((Expression.Literal)length).value.value<1){ + throw error("String length must be greater then 0"); + } + matchOrError(TokenType.RIGHT_PAREN, "Length of string must be defined"); + + matchOrError(TokenType.DEFINE, ":: Required for variable definition"); + matchOrError(TokenType.IDENTIFIER,"Expected variable name."); + Token varName = getPreviousToken(); + return new Statement.StringDeclaration(varName,length); } return statement(); @@ -48,8 +66,7 @@ public class Parser { private Statement statement(){ if (matchAndAdvance(TokenType.PRINT)){ - Expression expression = expression(); - return new Statement.PrintStatement(expression); + return printStatement(); }else if (matchAndAdvance(TokenType.IF)){ Statement statement = ifStatement(); return statement; @@ -57,6 +74,20 @@ public class Parser { return expressionStatement(); } + private Statement printStatement(){ + matchOrError(TokenType.STAR, "Syntax, print *, item1, item2..."); + List<Expression> exprList = new ArrayList<>(); + while(!matchAndAdvance(TokenType.ENDPRINT)){ + if(checkEOF()){ + throw error("Missing close parentheses"); + } + matchOrError(TokenType.COMMA, "Print items must be seperated by ,"); + Expression expr = expression(); + exprList.add(expr); + } + return new Statement.PrintStatement(exprList); + } + //Could be cleaned up to handle else statements better private Statement ifStatement(){ Expression condition = expression(); @@ -155,6 +186,9 @@ public class Parser { return new Expression.Literal(getPreviousToken(),"double"); } } + if (matchAndAdvance(TokenType.STRING)){ + return new Expression.Literal(getPreviousToken(), "string"); + } if (matchAndAdvance(TokenType.IDENTIFIER)) { |