about summary refs log tree commit diff
path: root/boot/parse.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-07-05 20:27:08 +0200
committerMel <mel@rnrd.eu>2025-07-05 20:27:08 +0200
commitb71f85a7c3ee9e36b6eab9f113436fa990f6e561 (patch)
treede0dac0dff1802106c97478fce84452224233b36 /boot/parse.c
parentcfbb769306fea6433c1d3e568a4f9742883a0cc9 (diff)
downloadcatskill-b71f85a7c3ee9e36b6eab9f113436fa990f6e561.tar.zst
catskill-b71f85a7c3ee9e36b6eab9f113436fa990f6e561.zip
Try (?) & must (!) expressions
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/parse.c')
-rw-r--r--boot/parse.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/boot/parse.c b/boot/parse.c
index 7b40fb1..c08d247 100644
--- a/boot/parse.c
+++ b/boot/parse.c
@@ -896,6 +896,34 @@ parser_expression_postfix_subscript(
 }
 
 struct Expression*
+parser_expression_postfix_try(
+    struct Parser* p, struct Expression* subject, struct Parser_Error* error)
+{
+    while (parser_probe(p, TOKEN_QUESTION)) {
+        struct Token question_token = parser_next(p);
+
+        struct Span span = span_merge(subject->span, question_token.span);
+        union Expression_Value value = { .try = { subject } };
+        subject = expression_new(EXPRESSION_TRY, value, span, subject->location);
+    }
+    return subject;
+}
+
+struct Expression*
+parser_expression_postfix_must(
+    struct Parser* p, struct Expression* subject, struct Parser_Error* error)
+{
+    while (parser_probe(p, TOKEN_BANG)) {
+        struct Token bang_token = parser_next(p);
+
+        struct Span span = span_merge(subject->span, bang_token.span);
+        union Expression_Value value = { .try = { subject } };
+        subject = expression_new(EXPRESSION_MUST, value, span, subject->location);
+    }
+    return subject;
+}
+
+struct Expression*
 parser_expression_postfix(struct Parser* p, struct Parser_Error* error)
 {
     struct Expression* expression = CHECK(parser_expression_member(p, error));
@@ -906,6 +934,11 @@ parser_expression_postfix(struct Parser* p, struct Parser_Error* error)
         return parser_expression_postfix_call_or_construct(p, expression, error);
     case TOKEN_SQUARE_OPEN:
         return parser_expression_postfix_subscript(p, expression, error);
+
+    case TOKEN_QUESTION:
+        return parser_expression_postfix_try(p, expression, error);
+    case TOKEN_BANG:
+        return parser_expression_postfix_must(p, expression, error);
     default:;
     }