Try try and or_else built-in procedures with operators try and try else

This commit is contained in:
gingerBill
2021-07-04 12:37:21 +01:00
parent a01d6dcea7
commit 4b831dbddd
11 changed files with 335 additions and 307 deletions

View File

@@ -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: