aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/parser
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-01-12 21:25:32 +0000
committerMichael Williamson <mike@zwobble.org>2025-01-12 21:25:32 +0000
commit6f554d8e265ad2664c97d9d8d6efef2f53e9eb5f (patch)
tree8d2453bd70ce1143be425448a16c4a93d8767461 /src/main/java/org/shedlang/compiler/parser
parenteef0470389d88de6169a6962f14a9d422175e4c2 (diff)
Parse native function declarations
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java32
-rw-r--r--src/main/java/org/shedlang/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Tokeniser.java1
3 files changed, 34 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 cda360e3..45533683 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -776,6 +776,9 @@ public class Parser {
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
+ case KEYWORD_NATIVE ->
+ parseNativeFunctionDeclaration(tokens);
+
case KEYWORD_PUB ->
switch (tokens.peek(1).tokenType()) {
case KEYWORD_EFFECT ->
@@ -784,6 +787,9 @@ public class Parser {
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
+ case KEYWORD_NATIVE ->
+ parseNativeFunctionDeclaration(tokens);
+
case KEYWORD_STRUCT ->
parseStructDefinition(tokens);
@@ -811,6 +817,32 @@ public class Parser {
};
}
+ private static UntypedNativeFunctionDeclarationNode parseNativeFunctionDeclaration(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.startPosition();
+
+ var visibility = parseVisibility(tokens);
+
+ tokens.skip(TokenType.KEYWORD_NATIVE);
+ tokens.skip(TokenType.KEYWORD_FUN);
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
+
+ var signature = parseFunctionSignature(tokens);
+
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.endPosition();
+ var source = new FileFragmentSource(start.to(end));
+
+ return new UntypedNativeFunctionDeclarationNode(
+ name,
+ visibility,
+ signature,
+ source
+ );
+ }
+
private static UntypedParamsNode parseParams(TokenIterator<TokenType> tokens) {
var paramsStart = tokens.startPosition();
diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java
index dbe32b0d..5eee208c 100644
--- a/src/main/java/org/shedlang/compiler/parser/TokenType.java
+++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java
@@ -21,6 +21,7 @@ public enum TokenType {
KEYWORD_IF,
KEYWORD_IMPORT,
KEYWORD_IS,
+ KEYWORD_NATIVE,
KEYWORD_PUB,
KEYWORD_RESUME,
KEYWORD_RETURN,
diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
index dfac78a0..6e5bed3f 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 {
Map.entry("if", TokenType.KEYWORD_IF),
Map.entry("import", TokenType.KEYWORD_IMPORT),
Map.entry("is", TokenType.KEYWORD_IS),
+ Map.entry("native", TokenType.KEYWORD_NATIVE),
Map.entry("pub", TokenType.KEYWORD_PUB),
Map.entry("resume", TokenType.KEYWORD_RESUME),
Map.entry("return", TokenType.KEYWORD_RETURN),