Skip to content

Commit 644ea2d

Browse files
committed
remove test and try expressions in favor of if expressions
See #357
1 parent 0940d46 commit 644ea2d

19 files changed

+148
-226
lines changed

doc/langref.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ Defer(body) = option("%") "defer" body
9191
9292
IfExpression(body) = "if" "(" Expression ")" body option("else" BlockExpression(body))
9393
94-
TryExpression(body) = "try" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" option("|" Symbol "|") BlockExpression(body))
94+
TryExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body "else" "|" Symbol "|" BlockExpression(body)
9595
96-
TestExpression(body) = "test" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" option("|" Symbol "|") BlockExpression(body))
96+
TestExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" BlockExpression(body))
9797
9898
BoolAndExpression = ComparisonExpression "and" BoolAndExpression | ComparisonExpression
9999

src/ast_render.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
763763
}
764764
case NodeTypeTryExpr:
765765
{
766-
fprintf(ar->f, "try (");
766+
fprintf(ar->f, "if (");
767767
render_node_grouped(ar, node->data.try_expr.target_node);
768768
fprintf(ar->f, ") ");
769769
if (node->data.try_expr.var_symbol) {
@@ -783,7 +783,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
783783
}
784784
case NodeTypeTestExpr:
785785
{
786-
fprintf(ar->f, "test (");
786+
fprintf(ar->f, "if (");
787787
render_node_grouped(ar, node->data.test_expr.target_node);
788788
fprintf(ar->f, ") ");
789789
if (node->data.test_expr.var_symbol) {

src/parser.cpp

Lines changed: 66 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ static AstNode *ast_parse_block_or_expression(ParseContext *pc, size_t *token_in
215215
static AstNode *ast_parse_block_expr_or_expression(ParseContext *pc, size_t *token_index, bool mandatory);
216216
static AstNode *ast_parse_expression(ParseContext *pc, size_t *token_index, bool mandatory);
217217
static AstNode *ast_parse_block(ParseContext *pc, size_t *token_index, bool mandatory);
218-
static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool mandatory);
218+
static AstNode *ast_parse_if_try_test_expr(ParseContext *pc, size_t *token_index, bool mandatory);
219219
static AstNode *ast_parse_block_expr(ParseContext *pc, size_t *token_index, bool mandatory);
220220
static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, bool mandatory);
221221
static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, size_t *token_index, bool mandatory);
@@ -639,110 +639,6 @@ static AstNode *ast_parse_comptime_expr(ParseContext *pc, size_t *token_index, b
639639
return node;
640640
}
641641

642-
/*
643-
TryExpression(body) = "try" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" option("|" Symbol "|") BlockExpression(body))
644-
*/
645-
static AstNode *ast_parse_try_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
646-
Token *try_token = &pc->tokens->at(*token_index);
647-
if (try_token->id == TokenIdKeywordTry) {
648-
*token_index += 1;
649-
} else if (mandatory) {
650-
ast_expect_token(pc, try_token, TokenIdKeywordTry);
651-
zig_unreachable();
652-
} else {
653-
return nullptr;
654-
}
655-
656-
AstNode *node = ast_create_node(pc, NodeTypeTryExpr, try_token);
657-
658-
ast_eat_token(pc, token_index, TokenIdLParen);
659-
node->data.try_expr.target_node = ast_parse_expression(pc, token_index, true);
660-
ast_eat_token(pc, token_index, TokenIdRParen);
661-
662-
Token *open_bar_tok = &pc->tokens->at(*token_index);
663-
if (open_bar_tok->id == TokenIdBinOr) {
664-
*token_index += 1;
665-
666-
Token *star_tok = &pc->tokens->at(*token_index);
667-
if (star_tok->id == TokenIdStar) {
668-
*token_index += 1;
669-
node->data.try_expr.var_is_ptr = true;
670-
}
671-
672-
Token *var_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
673-
node->data.try_expr.var_symbol = token_buf(var_name_tok);
674-
675-
ast_eat_token(pc, token_index, TokenIdBinOr);
676-
}
677-
678-
node->data.try_expr.then_node = ast_parse_block_or_expression(pc, token_index, true);
679-
680-
Token *else_token = &pc->tokens->at(*token_index);
681-
if (else_token->id == TokenIdKeywordElse) {
682-
*token_index += 1;
683-
Token *open_bar_tok = &pc->tokens->at(*token_index);
684-
if (open_bar_tok->id == TokenIdBinOr) {
685-
*token_index += 1;
686-
687-
Token *err_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
688-
node->data.try_expr.err_symbol = token_buf(err_name_tok);
689-
690-
ast_eat_token(pc, token_index, TokenIdBinOr);
691-
}
692-
693-
node->data.try_expr.else_node = ast_parse_block_expr_or_expression(pc, token_index, true);
694-
}
695-
696-
return node;
697-
}
698-
699-
/*
700-
TestExpression(body) = "test" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" BlockExpression(body))
701-
*/
702-
static AstNode *ast_parse_test_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
703-
Token *test_token = &pc->tokens->at(*token_index);
704-
if (test_token->id == TokenIdKeywordTest) {
705-
*token_index += 1;
706-
} else if (mandatory) {
707-
ast_expect_token(pc, test_token, TokenIdKeywordTest);
708-
zig_unreachable();
709-
} else {
710-
return nullptr;
711-
}
712-
713-
AstNode *node = ast_create_node(pc, NodeTypeTestExpr, test_token);
714-
715-
ast_eat_token(pc, token_index, TokenIdLParen);
716-
node->data.test_expr.target_node = ast_parse_expression(pc, token_index, true);
717-
ast_eat_token(pc, token_index, TokenIdRParen);
718-
719-
Token *open_bar_tok = &pc->tokens->at(*token_index);
720-
if (open_bar_tok->id == TokenIdBinOr) {
721-
*token_index += 1;
722-
723-
Token *star_tok = &pc->tokens->at(*token_index);
724-
if (star_tok->id == TokenIdStar) {
725-
*token_index += 1;
726-
node->data.test_expr.var_is_ptr = true;
727-
}
728-
729-
Token *var_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
730-
node->data.test_expr.var_symbol = token_buf(var_name_tok);
731-
732-
ast_eat_token(pc, token_index, TokenIdBinOr);
733-
}
734-
735-
node->data.test_expr.then_node = ast_parse_block_or_expression(pc, token_index, true);
736-
737-
Token *else_token = &pc->tokens->at(*token_index);
738-
if (else_token->id == TokenIdKeywordElse) {
739-
*token_index += 1;
740-
node->data.test_expr.else_node = ast_parse_block_expr_or_expression(pc, token_index, true);
741-
}
742-
743-
return node;
744-
}
745-
746642
/*
747643
PrimaryExpression = Number | String | CharLiteral | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression(BlockOrExpression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | (option("extern") FnProto) | AsmExpression | ("error" "." Symbol) | ContainerDecl
748644
KeywordLiteral = "true" | "false" | "null" | "break" | "continue" | "undefined" | "error" | "this" | "unreachable"
@@ -1434,8 +1330,10 @@ static AstNode *ast_parse_bool_and_expr(ParseContext *pc, size_t *token_index, b
14341330

14351331
/*
14361332
IfExpression(body) = "if" "(" Expression ")" body option("else" BlockExpression(body))
1333+
TryExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body "else" "|" Symbol "|" BlockExpression(body)
1334+
TestExpression(body) = "if" "(" Expression ")" "|" option("*") Symbol "|" body option("else" BlockExpression(body))
14371335
*/
1438-
static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
1336+
static AstNode *ast_parse_if_try_test_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
14391337
Token *if_token = &pc->tokens->at(*token_index);
14401338

14411339
if (if_token->id == TokenIdKeywordIf) {
@@ -1448,19 +1346,72 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool ma
14481346
}
14491347

14501348
ast_eat_token(pc, token_index, TokenIdLParen);
1451-
1452-
AstNode *node = ast_create_node(pc, NodeTypeIfBoolExpr, if_token);
1453-
node->data.if_bool_expr.condition = ast_parse_expression(pc, token_index, true);
1349+
AstNode *condition = ast_parse_expression(pc, token_index, true);
14541350
ast_eat_token(pc, token_index, TokenIdRParen);
1455-
node->data.if_bool_expr.then_block = ast_parse_block_or_expression(pc, token_index, true);
14561351

1457-
Token *else_token = &pc->tokens->at(*token_index);
1458-
if (else_token->id == TokenIdKeywordElse) {
1352+
Token *open_bar_tok = &pc->tokens->at(*token_index);
1353+
Token *var_name_tok = nullptr;
1354+
bool var_is_ptr = false;
1355+
if (open_bar_tok->id == TokenIdBinOr) {
1356+
*token_index += 1;
1357+
1358+
Token *star_tok = &pc->tokens->at(*token_index);
1359+
if (star_tok->id == TokenIdStar) {
1360+
*token_index += 1;
1361+
var_is_ptr = true;
1362+
}
1363+
1364+
var_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
1365+
1366+
ast_eat_token(pc, token_index, TokenIdBinOr);
1367+
}
1368+
1369+
AstNode *body_node = ast_parse_block_or_expression(pc, token_index, true);
1370+
1371+
Token *else_tok = &pc->tokens->at(*token_index);
1372+
AstNode *else_node = nullptr;
1373+
Token *err_name_tok = nullptr;
1374+
if (else_tok->id == TokenIdKeywordElse) {
14591375
*token_index += 1;
1460-
node->data.if_bool_expr.else_node = ast_parse_block_expr_or_expression(pc, token_index, true);
1376+
1377+
Token *else_bar_tok = &pc->tokens->at(*token_index);
1378+
if (else_bar_tok->id == TokenIdBinOr) {
1379+
*token_index += 1;
1380+
1381+
err_name_tok = ast_eat_token(pc, token_index, TokenIdSymbol);
1382+
1383+
ast_eat_token(pc, token_index, TokenIdBinOr);
1384+
}
1385+
1386+
else_node = ast_parse_block_expr_or_expression(pc, token_index, true);
14611387
}
14621388

1463-
return node;
1389+
if (err_name_tok != nullptr) {
1390+
AstNode *node = ast_create_node(pc, NodeTypeTryExpr, if_token);
1391+
node->data.try_expr.target_node = condition;
1392+
node->data.try_expr.var_is_ptr = var_is_ptr;
1393+
if (var_name_tok != nullptr) {
1394+
node->data.try_expr.var_symbol = token_buf(var_name_tok);
1395+
}
1396+
node->data.try_expr.then_node = body_node;
1397+
node->data.try_expr.err_symbol = token_buf(err_name_tok);
1398+
node->data.try_expr.else_node = else_node;
1399+
return node;
1400+
} else if (var_name_tok != nullptr) {
1401+
AstNode *node = ast_create_node(pc, NodeTypeTestExpr, if_token);
1402+
node->data.test_expr.target_node = condition;
1403+
node->data.test_expr.var_is_ptr = var_is_ptr;
1404+
node->data.test_expr.var_symbol = token_buf(var_name_tok);
1405+
node->data.test_expr.then_node = body_node;
1406+
node->data.test_expr.else_node = else_node;
1407+
return node;
1408+
} else {
1409+
AstNode *node = ast_create_node(pc, NodeTypeIfBoolExpr, if_token);
1410+
node->data.if_bool_expr.condition = condition;
1411+
node->data.if_bool_expr.then_block = body_node;
1412+
node->data.if_bool_expr.else_node = else_node;
1413+
return node;
1414+
}
14641415
}
14651416

14661417
/*
@@ -1848,7 +1799,7 @@ BlockExpression(body) = Block | IfExpression(body) | TryExpression(body) | TestE
18481799
static AstNode *ast_parse_block_expr(ParseContext *pc, size_t *token_index, bool mandatory) {
18491800
Token *token = &pc->tokens->at(*token_index);
18501801

1851-
AstNode *if_expr = ast_parse_if_expr(pc, token_index, false);
1802+
AstNode *if_expr = ast_parse_if_try_test_expr(pc, token_index, false);
18521803
if (if_expr)
18531804
return if_expr;
18541805

@@ -1872,14 +1823,6 @@ static AstNode *ast_parse_block_expr(ParseContext *pc, size_t *token_index, bool
18721823
if (comptime_node)
18731824
return comptime_node;
18741825

1875-
AstNode *try_node = ast_parse_try_expr(pc, token_index, false);
1876-
if (try_node)
1877-
return try_node;
1878-
1879-
AstNode *test_node = ast_parse_test_expr(pc, token_index, false);
1880-
if (test_node)
1881-
return test_node;
1882-
18831826
if (mandatory)
18841827
ast_invalid_token_error(pc, token);
18851828

src/tokenizer.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ static const struct ZigKeyword zig_keywords[] = {
138138
{"test", TokenIdKeywordTest},
139139
{"this", TokenIdKeywordThis},
140140
{"true", TokenIdKeywordTrue},
141-
{"try", TokenIdKeywordTry},
142141
{"undefined", TokenIdKeywordUndefined},
143142
{"union", TokenIdKeywordUnion},
144143
{"unreachable", TokenIdKeywordUnreachable},
@@ -1472,7 +1471,6 @@ const char * token_name(TokenId id) {
14721471
case TokenIdKeywordTest: return "test";
14731472
case TokenIdKeywordThis: return "this";
14741473
case TokenIdKeywordTrue: return "true";
1475-
case TokenIdKeywordTry: return "try";
14761474
case TokenIdKeywordUndefined: return "undefined";
14771475
case TokenIdKeywordUnion: return "union";
14781476
case TokenIdKeywordUnreachable: return "unreachable";

src/tokenizer.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ enum TokenId {
7575
TokenIdKeywordTest,
7676
TokenIdKeywordThis,
7777
TokenIdKeywordTrue,
78-
TokenIdKeywordTry,
7978
TokenIdKeywordUndefined,
8079
TokenIdKeywordUnion,
8180
TokenIdKeywordUnreachable,

std/buf_map.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub const BufMap = struct {
2828
}
2929

3030
pub fn set(self: &BufMap, key: []const u8, value: []const u8) -> %void {
31-
test (self.hash_map.get(key)) |entry| {
31+
if (self.hash_map.get(key)) |entry| {
3232
const value_copy = %return self.copy(value);
3333
%defer self.free(value_copy);
3434
_ = %return self.hash_map.put(key, value_copy);

0 commit comments

Comments
 (0)