diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-07 19:37:18 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-07 19:37:18 +0100 |
| commit | 561e0c9ced15af17bc3e6d2369c7c156ac6e3e92 (patch) | |
| tree | 33d1073d0eae7946ef38ade55d5cefcc4d58832f /src/main/java | |
| parent | f613e2b150cbe3a0bb7be56c2cc5406f6ef89918 (diff) | |
Parse expression statements
Diffstat (limited to 'src/main/java')
5 files changed, 31 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/UntypedExpressionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/UntypedExpressionStatementNode.java new file mode 100644 index 00000000..548f72c5 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/UntypedExpressionStatementNode.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.ast; + +import org.shedlang.compiler.sources.Source; + +public record UntypedExpressionStatementNode( + UntypedExpressionNode expression, + Source source +) implements UntypedFunctionStatementNode { +} diff --git a/src/main/java/org/shedlang/compiler/ast/UntypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/UntypedFunctionStatementNode.java new file mode 100644 index 00000000..af97a6f2 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/UntypedFunctionStatementNode.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.ast; + +public sealed interface UntypedFunctionStatementNode extends UntypedNode permits UntypedExpressionStatementNode { +} diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 68def52d..59850dc9 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -68,6 +68,22 @@ public class Parser { return new UntypedArgsNode(positional, named, argsSource); } + private static UntypedFunctionStatementNode parseExpressionStatement(TokenIterator<TokenType> tokens) { + var start = tokens.position(); + + var expression = parseTopLevelExpression(tokens); + tokens.skip(TokenType.SYMBOL_SEMICOLON); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedExpressionStatementNode(expression, source); + } + + static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator<TokenType> tokens) { + return parseExpressionStatement(tokens); + } + private static <T> List<T> parseMany( BooleanSupplier stop, Supplier<T> parseOne, diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java index 41f18350..5a54f9a7 100644 --- a/src/main/java/org/shedlang/compiler/parser/TokenType.java +++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java @@ -15,4 +15,5 @@ public enum TokenType { SYMBOL_EQUALS, SYMBOL_PAREN_OPEN, SYMBOL_PAREN_CLOSE, + SYMBOL_SEMICOLON, } diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java index e604609c..33fe5716 100644 --- a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java +++ b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java @@ -25,6 +25,7 @@ public class Tokeniser { RegexTokeniser.rule(TokenType.SYMBOL_EQUALS, "="), RegexTokeniser.rule(TokenType.SYMBOL_PAREN_OPEN, "\\("), RegexTokeniser.rule(TokenType.SYMBOL_PAREN_CLOSE, "\\)"), + RegexTokeniser.rule(TokenType.SYMBOL_SEMICOLON, ";"), RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z][A-Za-z0-9]*"), RegexTokeniser.rule(TokenType.STRING, "\"(?:[^\\\\\"\n\r]|\\\\.)*\""), |
