summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Parser.java
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-07 01:23:19 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-07 01:23:19 +0000
commitf8b888716211b78900db62ede497fa4ac2100c00 (patch)
tree3ea66c732de6abb95b10e708d0ab33651cb6b327 /src/Compiler/Parser.java
parentd3046e3b1481cf6d190b8fcb814985e29852b5eb (diff)
downloadesotericFORTRAN-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.java47
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)) {