summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java47
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/parsing/Type.java2
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/Assignment.java2
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/IdentifierDeclaration.java11
4 files changed, 47 insertions, 15 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java
index 7f9b6c9..356a6d7 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java
@@ -86,9 +86,12 @@ public class Parser {
// each statement must either start with a keyword or an identifier
Token token = tokens.get(current);
- // only keyword implemented is "skriv", so calling parseExpression right away
+ // implemented keywords:
+ // skriv()
+ // set
+ // mut
if (token.type() == KEYWORD) {
- return parseExpressionStatement();
+ return parseKeyword();
}
// must be identifier declaration or an assignment
@@ -102,12 +105,26 @@ public class Parser {
}
}
+ private Statement parseKeyword() throws ParserException {
+ Token token = tokens.get(current);
+ if (token.value().contentEquals("set")) {
+ return parseIdentifierStatement();
+ } else if (token.value().contentEquals("mut")) {
+ return parseIdentifierStatement();
+ } else if (token.value().contentEquals("skriv")) {
+ return parseExpressionStatement();
+ } else {
+ throw new ParserException(token.line(), token.column(), "unknown keyword: " + token.value());
+ }
+ }
+
private ExpressionStatement parseExpressionStatement() throws ParserException {
// this can be any expression used as a statement
// print(x);
// 5 + 6;
// "hello";
+
Expression expression = parseExpression();
expectSemicolon();
return new ExpressionStatement(expression);
@@ -122,11 +139,20 @@ public class Parser {
// - reassigning an existing variable
/*
- x: string?; IDENTIFIER, COLON, TYPE, SEMICOLON
- x: string = "string"; IDENTIFIER, COLON, TYPE, ASSIGN, STRING, SEMICOLON
+ mut x: string?; IDENTIFIER, COLON, TYPE, SEMICOLON
+ set x: string = "string"; IDENTIFIER, COLON, TYPE, ASSIGN, STRING, SEMICOLON
x = "string"; IDENTIFIER, ASSIGN, STRING, SEMICOLON
*/
+ boolean mutable = false;
+
+ if (tokens.get(current).value().contentEquals("mut")) {
+ mutable = true;
+ current++;
+ } else if (tokens.get(current).value().contentEquals("set")) {
+ current++;
+ }
+
String identifier = tokens.get(current).value();
current++;
@@ -134,16 +160,16 @@ public class Parser {
if (next.type() == COLON) {
// x: string = "hello";
- return parseDeclaration(identifier);
+ return parseDeclaration(identifier, mutable);
} else if (next.type() == ASSIGN) {
// x = "hello";
return parseAssignment(identifier);
} else {
- throw new ParserException(next.line(), next.column(), "Expected : or = after identifier");
+ throw new ParserException(next.line(), next.column(), "Expected : or = after: " + identifier);
}
}
- private Statement parseDeclaration(String identifier) throws ParserException {
+ private Statement parseDeclaration(String identifier, boolean mutable) throws ParserException {
// x: type;
current++; // skip colon
@@ -157,7 +183,7 @@ public class Parser {
}
expectSemicolon();
- return new IdentifierDeclaration(identifier, type, initializer);
+ return new IdentifierDeclaration(identifier, type, initializer, mutable);
}
private Statement parseAssignment(String identifier) throws ParserException {
@@ -247,8 +273,11 @@ public class Parser {
}
private void expectSemicolon() throws ParserException {
- if (current >= tokens.size() || tokens.get(current).type() != SEMICOLON) {
+ if (current >= tokens.size()) {
throw new ParserException(-1, -1, "Expected ;");
+ } else if (tokens.get(current).type() != SEMICOLON) {
+ throw new ParserException(tokens.get(current).line(), tokens.get(current).column(),
+ "Expected: ;");
}
current++;
}
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Type.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Type.java
index 64305da..d707696 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Type.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Type.java
@@ -2,7 +2,7 @@ package no.eliashaugsbakk.kompilator.parsing;
public class Type {
final String type;
- final boolean nullable;
+ public final boolean nullable;
public Type(String type, boolean nullable) {
this.type = type;
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/Assignment.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/Assignment.java
index a54a891..bca16df 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/Assignment.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/Assignment.java
@@ -3,7 +3,7 @@ package no.eliashaugsbakk.kompilator.parsing.node.statement;
import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression;
public class Assignment extends Statement {
- final String identifier;
+ public final String identifier;
final Expression expression;
public Assignment(String identifier, Expression expression) {
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/IdentifierDeclaration.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/IdentifierDeclaration.java
index e7db477..d3c5474 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/IdentifierDeclaration.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/node/statement/IdentifierDeclaration.java
@@ -5,18 +5,21 @@ import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression;
public class IdentifierDeclaration extends Statement {
// identifier name: [my_var]: type = 4;
- final String identifier;
+ public final String identifier;
// identifier type: my_var: [type] = 4;
- final Type type;
+ public final Type type;
// identifier initialization: my_var: type [4];
// may be null: my_var: type?;
- final Expression expression; // may be null: x: int?;
+ public final Expression expression; // may be null: x: int?;
- public IdentifierDeclaration(String identifier, Type type, Expression expression) {
+ public final boolean mutable;
+
+ public IdentifierDeclaration(String identifier, Type type, Expression expression, boolean mutable) {
this.identifier = identifier;
this.type = type;
this.expression = expression;
+ this.mutable = mutable;
}
}