diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-07 20:03:39 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-07 20:03:39 +0100 |
| commit | 244cc7ad6855696891cd8c72bfedb68c91fd1aaa (patch) | |
| tree | be447af55270b4a24bff3d685a1694dbeba0d9c6 /src/main/java | |
| parent | 8258a15b00687f6d619722ba04843e5f0aaebe73 (diff) | |
Add parser for minimal functions
Diffstat (limited to 'src/main/java')
3 files changed, 56 insertions, 0 deletions
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<TokenType> 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.<UntypedFunctionStatementNode>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<TokenType> tokens) { return parseExpressionStatement(tokens); } @@ -102,6 +133,24 @@ public class Parser { return values; } + static UntypedNamespaceStatementNode parseNamespaceStatement(TokenIterator<TokenType> tokens) { + return switch (tokens.peek().tokenType()) { + case KEYWORD_FUN -> parseFunctionDefinition(tokens); + + default -> + throw new UnexpectedTokenException("namespace statement", tokens.peek()); + }; + } + + private static UntypedParamsNode parseParams(TokenIterator<TokenType> 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<TokenType> 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<TokenType> 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, "="), |
