aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-07 20:03:39 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-07 20:03:39 +0100
commit244cc7ad6855696891cd8c72bfedb68c91fd1aaa (patch)
treebe447af55270b4a24bff3d685a1694dbeba0d9c6 /src/main/java
parent8258a15b00687f6d619722ba04843e5f0aaebe73 (diff)
Add parser for minimal functions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java49
-rw-r--r--src/main/java/org/shedlang/compiler/parser/TokenType.java3
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Tokeniser.java4
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, "="),