diff --git a/doc/langref.md b/doc/langref.md index ab06932562..1aa570b59f 100644 --- a/doc/langref.md +++ b/doc/langref.md @@ -85,7 +85,7 @@ SwitchItem = Expression | (Expression "..." Expression) WhileExpression = "while" "(" Expression ")" Expression -ForExpression = "for" "(" "Symbol" "," Expression option("," "Symbol") ")" Expression +ForExpression = "for" "(" Expression ")" option("|" "Symbol" option("," "Symbol") "|") Expression BoolOrExpression = BoolAndExpression "||" BoolOrExpression | BoolAndExpression diff --git a/src/parser.cpp b/src/parser.cpp index f9880156d8..78481f61f0 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1797,7 +1797,7 @@ static AstNode *ast_parse_symbol(ParseContext *pc, int *token_index) { } /* -ForExpression : token(For) token(LParen) Symbol token(Comma) Expression option(token(Comma) token(Symbol)) token(RParen) Expression +ForExpression = "for" "(" Expression ")" option("|" "Symbol" option("," "Symbol") "|") Expression */ static AstNode *ast_parse_for_expr(ParseContext *pc, int *token_index, bool mandatory) { Token *token = &pc->tokens->at(*token_index); @@ -1814,18 +1814,24 @@ static AstNode *ast_parse_for_expr(ParseContext *pc, int *token_index, bool mand AstNode *node = ast_create_node(pc, NodeTypeForExpr, token); ast_eat_token(pc, token_index, TokenIdLParen); - node->data.for_expr.elem_node = ast_parse_symbol(pc, token_index); - ast_eat_token(pc, token_index, TokenIdComma); node->data.for_expr.array_expr = ast_parse_expression(pc, token_index, true); - - Token *comma = &pc->tokens->at(*token_index); - if (comma->id == TokenIdComma) { - *token_index += 1; - node->data.for_expr.index_node = ast_parse_symbol(pc, token_index); - } - ast_eat_token(pc, token_index, TokenIdRParen); + Token *maybe_bar = &pc->tokens->at(*token_index); + if (maybe_bar->id == TokenIdBinOr) { + *token_index += 1; + node->data.for_expr.elem_node = ast_parse_symbol(pc, token_index); + + Token *maybe_comma = &pc->tokens->at(*token_index); + if (maybe_comma->id == TokenIdComma) { + *token_index += 1; + + node->data.for_expr.index_node = ast_parse_symbol(pc, token_index); + } + + ast_eat_token(pc, token_index, TokenIdBinOr); + } + node->data.for_expr.body = ast_parse_expression(pc, token_index, true); normalize_parent_ptrs(node); diff --git a/std/bootstrap.zig b/std/bootstrap.zig index 60d0641f0e..75edc29482 100644 --- a/std/bootstrap.zig +++ b/std/bootstrap.zig @@ -25,7 +25,7 @@ fn strlen(ptr: &const u8) -> isize { fn call_main() -> unreachable { var args: [argc][]u8 = undefined; - for (arg, args, i) { + for (args) |arg, i| { const ptr = argv[i]; args[i] = ptr[0...strlen(ptr)]; } diff --git a/std/rand.zig b/std/rand.zig index 1bd9c3bccf..f4c9971c45 100644 --- a/std/rand.zig +++ b/std/rand.zig @@ -59,7 +59,7 @@ pub struct Rand { } fn generate_numbers(r: &Rand) { - for (item, r.array, i) { + for (r.array) |item, i| { const y : u32 = (item & 0x80000000) + (r.array[(i + 1) % ARRAY_SIZE] & 0x7fffffff); const untempered : u32 = r.array[(i + 397) % ARRAY_SIZE] ^ (y >> 1); r.array[i] = if ((y % 2) == 0) { diff --git a/std/std.zig b/std/std.zig index 70753c0c82..3fad1bb0ce 100644 --- a/std/std.zig +++ b/std/std.zig @@ -173,7 +173,7 @@ pub error Overflow; pub fn parse_u64(buf: []u8, radix: u8) -> %u64 { var x : u64 = 0; - for (c, buf) { + for (buf) |c| { const digit = char_to_digit(c); if (digit > radix) { diff --git a/std/test_runner.zig b/std/test_runner.zig index da407035fc..625915bb71 100644 --- a/std/test_runner.zig +++ b/std/test_runner.zig @@ -8,7 +8,7 @@ struct TestFn { extern var zig_test_fn_list: []TestFn; pub fn run_tests() -> %void { - for (test_fn, zig_test_fn_list, i) { + for (zig_test_fn_list) |test_fn, i| { %%stderr.print_str("Test "); %%stderr.print_i64(i + 1); %%stderr.print_str("/"); diff --git a/test/run_tests.cpp b/test/run_tests.cpp index f0c3a77871..7c70528d3b 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1120,20 +1120,20 @@ import "std.zig"; pub fn main(args: [][]u8) -> %void { const array = []u8 {9, 8, 7, 6}; - for (item, array) { + for (array) |item| { %%stdout.print_u64(item); %%stdout.printf("\n"); } - for (item, array, index) { + for (array) |item, index| { %%stdout.print_i64(index); %%stdout.printf("\n"); } const unknown_size: []u8 = array; - for (item, unknown_size) { + for (unknown_size) |item| { %%stdout.print_u64(item); %%stdout.printf("\n"); } - for (item, unknown_size, index) { + for (unknown_size) |item, index| { %%stdout.print_i64(index); %%stdout.printf("\n"); } @@ -1145,7 +1145,7 @@ import "std.zig"; pub fn main(args: [][]u8) -> %void { const fns = []@typeof(fn1) { fn1, fn2, fn3, fn4, }; - for (f, fns) { + for (fns) |f| { %%stdout.print_u64(f()); %%stdout.printf("\n"); } @@ -1434,7 +1434,7 @@ export fn main(args: c_int, argv: &&u8) -> c_int { qsort((&c_void)(array.ptr), c_ulong(array.len), @sizeof(i32), compare_fn); - for (item, array, i) { + for (array) |item, i| { if (item != i) { abort(); } diff --git a/test/self_hosted.zig b/test/self_hosted.zig index 873443a0de..9676ecacad 100644 --- a/test/self_hosted.zig +++ b/test/self_hosted.zig @@ -81,7 +81,7 @@ enum AnEnumWithPayload { fn continue_in_for_loop() { const array = []i32 {1, 2, 3, 4, 5}; var sum : i32 = 0; - for (x, array) { + for (array) |x| { sum += x; if (x < 3) { continue;