aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-16 16:35:38 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-16 16:35:38 +0100
commit02bd64dfdbfa8134cb93165ee606817b2e6737b5 (patch)
tree9a2e463a79150fc90a1481b768c89b2158481dfc /src/main/java/org/shedlang/compiler/parser
parent904f02af5e2965f73b037e4b3c5d97f57af81987 (diff)
Combine assign, val and var statements
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java71
1 files changed, 28 insertions, 43 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index a5a48756..c7ab639f 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -107,11 +107,9 @@ public class Parser {
private static UntypedAssignNode parseAssign(TokenIterator<TokenType> tokens) {
var start = tokens.position();
- tokens.skip(TokenType.KEYWORD_ASSIGN);
-
var target = parseTarget(tokens);
- tokens.skip(TokenType.SYMBOL_COLON_EQUALS);
+ tokens.skip(TokenType.SYMBOL_EQUALS);
var expression = parseTopLevelExpression(tokens);
@@ -303,18 +301,12 @@ public class Parser {
static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator<TokenType> tokens) {
return switch (tokens.peek().tokenType()) {
- case KEYWORD_ASSIGN ->
+ case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR ->
parseAssign(tokens);
case KEYWORD_RETURN ->
parseFunctionReturn(tokens);
- case KEYWORD_VAL ->
- parseVal(tokens);
-
- case KEYWORD_VAR ->
- parseVar(tokens);
-
case KEYWORD_WHILE ->
parseWhile(tokens);
@@ -407,7 +399,7 @@ public class Parser {
parseFunctionDefinition(tokens);
case KEYWORD_VAL ->
- parseVal(tokens);
+ parseAssign(tokens);
default ->
throw new UnexpectedTokenException("namespace statement", tokens.peek());
@@ -559,50 +551,43 @@ public class Parser {
private static UntypedTargetNode parseTarget(TokenIterator<TokenType> tokens) {
var start = tokens.position();
- var name = tokens.nextValue(TokenType.IDENTIFIER);
-
- var end = tokens.position();
- var source = start.to(end);
-
- return new UntypedTargetNode.Variable(name, source);
- }
-
- private static UntypedValNode parseVal(TokenIterator<TokenType> tokens) {
- var start = tokens.position();
-
- tokens.skip(TokenType.KEYWORD_VAL);
-
- var target = parseTarget(tokens);
-
- tokens.skip(TokenType.SYMBOL_EQUALS);
+ return switch (tokens.peek().tokenType()) {
+ case KEYWORD_ASSIGN -> {
+ tokens.skip(TokenType.KEYWORD_ASSIGN);
- var expression = parseTopLevelExpression(tokens);
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
- tokens.skip(TokenType.SYMBOL_SEMICOLON);
+ var end = tokens.position();
+ var source = start.to(end);
- var end = tokens.position();
- var source = start.to(end);
+ yield new UntypedTargetNode.Reassign(name, source);
+ }
- return new UntypedValNode(target, expression, source);
- }
+ case KEYWORD_VAL -> {
+ tokens.skip(TokenType.KEYWORD_VAL);
- private static UntypedVarNode parseVar(TokenIterator<TokenType> tokens) {
- var start = tokens.position();
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
- tokens.skip(TokenType.KEYWORD_VAR);
+ var end = tokens.position();
+ var source = start.to(end);
- var target = parseTarget(tokens);
+ yield new UntypedTargetNode.Val(name, source);
+ }
- tokens.skip(TokenType.SYMBOL_EQUALS);
+ case KEYWORD_VAR -> {
+ tokens.skip(TokenType.KEYWORD_VAR);
- var expression = parseTopLevelExpression(tokens);
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
- tokens.skip(TokenType.SYMBOL_SEMICOLON);
+ var end = tokens.position();
+ var source = start.to(end);
- var end = tokens.position();
- var source = start.to(end);
+ yield new UntypedTargetNode.Var(name, source);
+ }
- return new UntypedVarNode(target, expression, source);
+ default ->
+ throw new UnexpectedTokenException("namespace statement", tokens.peek());
+ };
}
private static UntypedFunctionStatementNode parseWhile(