aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-07-04 12:37:21 +0100
committergingerBill <bill@gingerbill.org>2021-07-04 12:37:21 +0100
commit4b831dbdddb92c4dbe32dc7b2a6a647febddf5dc (patch)
tree09afd0b98df36a09865da325c7cf7d8efd644b60 /src/parser.cpp
parenta01d6dcea729fd39df306a3f9743a78fe9258cd7 (diff)
Try `try` and `or_else` built-in procedures with operators `try` and `try else`
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 50584eb51..641c4141f 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -199,6 +199,15 @@ Ast *clone_ast(Ast *node) {
n->AutoCast.expr = clone_ast(n->AutoCast.expr);
break;
+ case Ast_TryExpr:
+ n->TryExpr.expr = clone_ast(n->TryExpr.expr);
+ break;
+
+ case Ast_TryElseExpr:
+ n->TryElseExpr.expr = clone_ast(n->TryElseExpr.expr);
+ n->TryElseExpr.else_expr = clone_ast(n->TryElseExpr.else_expr);
+ break;
+
case Ast_InlineAsmExpr:
n->InlineAsmExpr.param_types = clone_ast_array(n->InlineAsmExpr.param_types);
n->InlineAsmExpr.return_type = clone_ast(n->InlineAsmExpr.return_type);
@@ -680,6 +689,22 @@ Ast *ast_auto_cast(AstFile *f, Token token, Ast *expr) {
return result;
}
+Ast *ast_try_expr(AstFile *f, Token token, Ast *expr) {
+ Ast *result = alloc_ast_node(f, Ast_TryExpr);
+ result->TryExpr.token = token;
+ result->TryExpr.expr = expr;
+ return result;
+}
+Ast *ast_try_else_expr(AstFile *f, Token try_token, Ast *expr, Token else_token, Ast *else_expr) {
+ Ast *result = alloc_ast_node(f, Ast_TryElseExpr);
+ result->TryElseExpr.try_token = try_token;
+ result->TryElseExpr.expr = expr;
+ result->TryElseExpr.else_token = else_token;
+ result->TryElseExpr.else_expr = else_expr;
+ return result;
+}
+
+
Ast *ast_inline_asm_expr(AstFile *f, Token token, Token open, Token close,
Array<Ast *> const &param_types,
Ast *return_type,
@@ -2723,6 +2748,16 @@ Ast *parse_unary_expr(AstFile *f, bool lhs) {
return ast_auto_cast(f, token, expr);
}
+ case Token_try: {
+ Token try_token = advance_token(f);
+ Ast *expr = parse_unary_expr(f, lhs);
+ if (f->curr_token.kind == Token_else) {
+ Token else_token = advance_token(f);
+ Ast *else_expr = parse_expr(f, lhs);
+ return ast_try_else_expr(f, try_token, expr, else_token, else_expr);
+ }
+ return ast_try_expr(f, try_token, expr);
+ }
case Token_Add:
case Token_Sub: