authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-30 21:45:42+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-30 21:45:42+02:00
log24071c6803ccc0f11b2c4d7c8f22fa8933a98a7c
tree13edab6f73fbe2daec573244440b02bd43a1b18b
parent1dfa927a67566a043e0c1d2982333904d18c3b3a

std.zig.parser parses all prefix operators


3 files changed, 73 insertions(+), 10 deletions(-)

std/zig/ast.zig+15-3
......@@ -432,9 +432,15 @@ pub const NodePrefixOp = struct {
432432 rhs: &Node,
433433
434434 const PrefixOp = union(enum) {
435 AddrOf: AddrOfInfo,
436 BitNot,
437 BoolNot,
438 Deref,
439 Negation,
440 NegationWrap,
435441 Return,
436442 Try,
437 AddrOf: AddrOfInfo,
443 UnwrapMaybe,
438444 };
439445 const AddrOfInfo = struct {
440446 align_expr: ?&Node,
......@@ -448,14 +454,20 @@ pub const NodePrefixOp = struct {
448454 var i = index;
449455
450456 switch (self.op) {
451 PrefixOp.Return,
452 PrefixOp.Try => {},
453457 PrefixOp.AddrOf => |addr_of_info| {
454458 if (addr_of_info.align_expr) |align_expr| {
455459 if (i < 1) return align_expr;
456460 i -= 1;
457461 }
458462 },
463 PrefixOp.BitNot,
464 PrefixOp.BoolNot,
465 PrefixOp.Deref,
466 PrefixOp.Negation,
467 PrefixOp.NegationWrap,
468 PrefixOp.Return,
469 PrefixOp.Try,
470 PrefixOp.UnwrapMaybe => {},
459471 }
460472
461473 if (i < 1) return self.rhs;
std/zig/parser.zig+52-7
......@@ -336,6 +336,42 @@ pub const Parser = struct {
336336 try stack.append(State.ExpectOperand);
337337 continue;
338338 },
339 Token.Id.Minus => {
340 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
341 ast.NodePrefixOp.PrefixOp.Negation) });
342 try stack.append(State.ExpectOperand);
343 continue;
344 },
345 Token.Id.MinusPercent => {
346 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
347 ast.NodePrefixOp.PrefixOp.NegationWrap) });
348 try stack.append(State.ExpectOperand);
349 continue;
350 },
351 Token.Id.Tilde => {
352 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
353 ast.NodePrefixOp.PrefixOp.BitNot) });
354 try stack.append(State.ExpectOperand);
355 continue;
356 },
357 Token.Id.QuestionMarkQuestionMark => {
358 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
359 ast.NodePrefixOp.PrefixOp.UnwrapMaybe) });
360 try stack.append(State.ExpectOperand);
361 continue;
362 },
363 Token.Id.Bang => {
364 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
365 ast.NodePrefixOp.PrefixOp.BoolNot) });
366 try stack.append(State.ExpectOperand);
367 continue;
368 },
369 Token.Id.Asterisk => {
370 try stack.append(State { .PrefixOp = try self.createPrefixOp(arena, token,
371 ast.NodePrefixOp.PrefixOp.Deref) });
372 try stack.append(State.ExpectOperand);
373 continue;
374 },
339375 Token.Id.Ampersand => {
340376 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
341377 .AddrOf = ast.NodePrefixOp.AddrOfInfo {
......@@ -1323,12 +1359,6 @@ pub const Parser = struct {
13231359 const prefix_op_node = @fieldParentPtr(ast.NodePrefixOp, "base", base);
13241360 try stack.append(RenderState { .Expression = prefix_op_node.rhs });
13251361 switch (prefix_op_node.op) {
1326 ast.NodePrefixOp.PrefixOp.Return => {
1327 try stream.write("return ");
1328 },
1329 ast.NodePrefixOp.PrefixOp.Try => {
1330 try stream.write("try ");
1331 },
13321362 ast.NodePrefixOp.PrefixOp.AddrOf => |addr_of_info| {
13331363 try stream.write("&");
13341364 if (addr_of_info.volatile_token != null) {
......@@ -1343,6 +1373,14 @@ pub const Parser = struct {
13431373 try stack.append(RenderState { .Expression = align_expr});
13441374 }
13451375 },
1376 ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"),
1377 ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),
1378 ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"),
1379 ast.NodePrefixOp.PrefixOp.Negation => try stream.write("-"),
1380 ast.NodePrefixOp.PrefixOp.NegationWrap => try stream.write("-%"),
1381 ast.NodePrefixOp.PrefixOp.Return => try stream.write("return "),
1382 ast.NodePrefixOp.PrefixOp.Try => try stream.write("try "),
1383 ast.NodePrefixOp.PrefixOp.UnwrapMaybe => try stream.write("??"),
13461384 }
13471385 },
13481386 ast.Node.Id.IntegerLiteral => {
......@@ -1627,7 +1665,7 @@ test "zig fmt" {
16271665 );
16281666
16291667 try testCanonical(
1630 \\test "operators" {
1668 \\test "infix operators" {
16311669 \\ var i = undefined;
16321670 \\ i = 2;
16331671 \\ i *= 2;
......@@ -1676,6 +1714,13 @@ test "zig fmt" {
16761714 \\
16771715 );
16781716
1717 try testCanonical(
1718 \\test "prefix operators" {
1719 \\ --%~??!*&0;
1720 \\}
1721 \\
1722 );
1723
16791724 try testCanonical(
16801725 \\test "test calls" {
16811726 \\ a();
std/zig/tokenizer.zig+6
......@@ -125,6 +125,7 @@ pub const Token = struct {
125125 AngleBracketRightEqual,
126126 AngleBracketAngleBracketRight,
127127 AngleBracketAngleBracketRightEqual,
128 Tilde,
128129 IntegerLiteral,
129130 FloatLiteral,
130131 LineComment,
......@@ -361,6 +362,11 @@ pub const Tokenizer = struct {
361362 self.index += 1;
362363 break;
363364 },
365 '~' => {
366 result.id = Token.Id.Tilde;
367 self.index += 1;
368 break;
369 },
364370 '.' => {
365371 state = State.Period;
366372 },