diff options
| author | Mel <mel@rnrd.eu> | 2025-07-05 20:27:08 +0200 |
|---|---|---|
| committer | Mel <mel@rnrd.eu> | 2025-07-05 20:27:08 +0200 |
| commit | b71f85a7c3ee9e36b6eab9f113436fa990f6e561 (patch) | |
| tree | de0dac0dff1802106c97478fce84452224233b36 /boot/parse.c | |
| parent | cfbb769306fea6433c1d3e568a4f9742883a0cc9 (diff) | |
| download | catskill-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.c | 33 |
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:; } |
