From 561e0c9ced15af17bc3e6d2369c7c156ac6e3e92 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 7 Jun 2023 19:37:18 +0100 Subject: Parse expression statements --- .../compiler/ast/UntypedExpressionStatementNode.java | 9 +++++++++ .../compiler/ast/UntypedFunctionStatementNode.java | 4 ++++ src/main/java/org/shedlang/compiler/parser/Parser.java | 16 ++++++++++++++++ .../java/org/shedlang/compiler/parser/TokenType.java | 1 + .../java/org/shedlang/compiler/parser/Tokeniser.java | 1 + 5 files changed, 31 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/ast/UntypedExpressionStatementNode.java create mode 100644 src/main/java/org/shedlang/compiler/ast/UntypedFunctionStatementNode.java (limited to 'src/main/java') 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 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 tokens) { + return parseExpressionStatement(tokens); + } + private static List parseMany( BooleanSupplier stop, Supplier 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]|\\\\.)*\""), -- cgit v1.2.3