diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-01-12 21:25:32 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-01-12 21:25:32 +0000 |
| commit | 6f554d8e265ad2664c97d9d8d6efef2f53e9eb5f (patch) | |
| tree | 8d2453bd70ce1143be425448a16c4a93d8767461 /src/main/java/org/shedlang/compiler/parser | |
| parent | eef0470389d88de6169a6962f14a9d422175e4c2 (diff) | |
Parse native function declarations
Diffstat (limited to 'src/main/java/org/shedlang/compiler/parser')
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), |
