From 4b831dbdddb92c4dbe32dc7b2a6a647febddf5dc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 4 Jul 2021 12:37:21 +0100 Subject: Try `try` and `or_else` built-in procedures with operators `try` and `try else` --- src/parser.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/parser.cpp') 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 const ¶m_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: -- cgit v1.2.3