summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Parser.java
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-07 22:35:33 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-07 22:35:33 +0000
commit975fb6f000918085d1f5ba4ac6eb95c60411dae9 (patch)
tree8dab2d0447e9e2dca9dc1b06d42d5331d55c4547 /src/Compiler/Parser.java
parentf8b888716211b78900db62ede497fa4ac2100c00 (diff)
downloadesotericFORTRAN-975fb6f000918085d1f5ba4ac6eb95c60411dae9.tar.gz
esotericFORTRAN-975fb6f000918085d1f5ba4ac6eb95c60411dae9.zip
Added support for strings and improved print statement syntax
Diffstat (limited to 'src/Compiler/Parser.java')
-rw-r--r--src/Compiler/Parser.java60
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)) {