diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-16 16:35:38 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-16 16:35:38 +0100 |
| commit | 02bd64dfdbfa8134cb93165ee606817b2e6737b5 (patch) | |
| tree | 9a2e463a79150fc90a1481b768c89b2158481dfc /src/main/java/org/shedlang/compiler/parser | |
| parent | 904f02af5e2965f73b037e4b3c5d97f57af81987 (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.java | 71 |
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( |
