From 561d9e45bff6c36d2580259c8fe05a2f4ec756dd Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Sat, 19 Sep 2026 22:29:58 +0200 Subject: add set and mut as keywords to Parser --- .../eliashaugsbakk/kompilator/parsing/Parser.java | 47 +++++++++++++++++----- .../no/eliashaugsbakk/kompilator/parsing/Type.java | 2 +- .../parsing/node/statement/Assignment.java | 2 +- .../node/statement/IdentifierDeclaration.java | 11 +++-- 4 files changed, 47 insertions(+), 15 deletions(-) (limited to 'src') 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; } } -- cgit v1.2.3