From 244cc7ad6855696891cd8c72bfedb68c91fd1aaa Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 7 Jun 2023 20:03:39 +0100 Subject: Add parser for minimal functions --- .../java/org/shedlang/compiler/parser/Parser.java | 49 ++++++++++++++++++++++ .../org/shedlang/compiler/parser/TokenType.java | 3 ++ .../org/shedlang/compiler/parser/Tokeniser.java | 4 ++ 3 files changed, 56 insertions(+) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 59850dc9..f76dfd78 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.tokeniser.UnexpectedTokenException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.BooleanSupplier; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -80,6 +81,36 @@ public class Parser { return new UntypedExpressionStatementNode(expression, source); } + private static UntypedNamespaceStatementNode parseFunctionDefinition(TokenIterator tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.KEYWORD_FUN); + var name = tokens.nextValue(TokenType.IDENTIFIER); + + tokens.skip(TokenType.SYMBOL_PAREN_OPEN); + var params = parseParams(tokens); + tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); + + tokens.skip(TokenType.SYMBOL_THIN_ARROW); + var returnType = parseTopLevelTypeLevelExpression(tokens); + + tokens.skip(TokenType.SYMBOL_BRACE_OPEN); + var body = List.of(); + tokens.skip(TokenType.SYMBOL_BRACE_CLOSE); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedFunctionDefinitionNode( + name, + params, + Optional.empty(), + returnType, + body, + source + ); + } + static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator tokens) { return parseExpressionStatement(tokens); } @@ -102,6 +133,24 @@ public class Parser { return values; } + static UntypedNamespaceStatementNode parseNamespaceStatement(TokenIterator tokens) { + return switch (tokens.peek().tokenType()) { + case KEYWORD_FUN -> parseFunctionDefinition(tokens); + + default -> + throw new UnexpectedTokenException("namespace statement", tokens.peek()); + }; + } + + private static UntypedParamsNode parseParams(TokenIterator tokens) { + var start = tokens.position(); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedParamsNode(List.of(), List.of(), source); + } + private static UntypedExpressionNode parsePrimaryExpression(TokenIterator tokens) { return switch (tokens.peek().tokenType()) { diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java index 5a54f9a7..6df8e954 100644 --- a/src/main/java/org/shedlang/compiler/parser/TokenType.java +++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java @@ -10,10 +10,13 @@ public enum TokenType { KEYWORD_FUN, SYMBOL_BANG, + SYMBOL_BRACE_OPEN, + SYMBOL_BRACE_CLOSE, SYMBOL_COMMA, SYMBOL_DOT, SYMBOL_EQUALS, SYMBOL_PAREN_OPEN, SYMBOL_PAREN_CLOSE, SYMBOL_SEMICOLON, + SYMBOL_THIN_ARROW, } diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java index 33fe5716..32ddce50 100644 --- a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java +++ b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java @@ -19,7 +19,11 @@ public class Tokeniser { private static final RegexTokeniser tokeniser = new RegexTokeniser<>( TokenType.UNKNOWN, List.of( + RegexTokeniser.rule(TokenType.SYMBOL_THIN_ARROW, "->"), + RegexTokeniser.rule(TokenType.SYMBOL_BANG, "!"), + RegexTokeniser.rule(TokenType.SYMBOL_BRACE_OPEN, "\\{"), + RegexTokeniser.rule(TokenType.SYMBOL_BRACE_CLOSE, "\\}"), RegexTokeniser.rule(TokenType.SYMBOL_COMMA, ","), RegexTokeniser.rule(TokenType.SYMBOL_DOT, "\\."), RegexTokeniser.rule(TokenType.SYMBOL_EQUALS, "="), -- cgit v1.2.3