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 {...@@ -432,9 +432,15 @@ pub const NodePrefixOp = struct {
432 rhs: &Node,432 rhs: &Node,
433433
434 const PrefixOp = union(enum) {434 const PrefixOp = union(enum) {
435 AddrOf: AddrOfInfo,
436 BitNot,
437 BoolNot,
438 Deref,
439 Negation,
440 NegationWrap,
435 Return,441 Return,
436 Try,442 Try,
437 AddrOf: AddrOfInfo,443 UnwrapMaybe,
438 };444 };
439 const AddrOfInfo = struct {445 const AddrOfInfo = struct {
440 align_expr: ?&Node,446 align_expr: ?&Node,
...@@ -448,14 +454,20 @@ pub const NodePrefixOp = struct {...@@ -448,14 +454,20 @@ pub const NodePrefixOp = struct {
448 var i = index;454 var i = index;
449455
450 switch (self.op) {456 switch (self.op) {
451 PrefixOp.Return,
452 PrefixOp.Try => {},
453 PrefixOp.AddrOf => |addr_of_info| {457 PrefixOp.AddrOf => |addr_of_info| {
454 if (addr_of_info.align_expr) |align_expr| {458 if (addr_of_info.align_expr) |align_expr| {
455 if (i < 1) return align_expr;459 if (i < 1) return align_expr;
456 i -= 1;460 i -= 1;
457 }461 }
458 },462 },
463 PrefixOp.BitNot,
464 PrefixOp.BoolNot,
465 PrefixOp.Deref,
466 PrefixOp.Negation,
467 PrefixOp.NegationWrap,
468 PrefixOp.Return,
469 PrefixOp.Try,
470 PrefixOp.UnwrapMaybe => {},
459 }471 }
460472
461 if (i < 1) return self.rhs;473 if (i < 1) return self.rhs;
std/zig/parser.zig+52-7
...@@ -336,6 +336,42 @@ pub const Parser = struct {...@@ -336,6 +336,42 @@ pub const Parser = struct {
336 try stack.append(State.ExpectOperand);336 try stack.append(State.ExpectOperand);
337 continue;337 continue;
338 },338 },
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 },
339 Token.Id.Ampersand => {375 Token.Id.Ampersand => {
340 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{376 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
341 .AddrOf = ast.NodePrefixOp.AddrOfInfo {377 .AddrOf = ast.NodePrefixOp.AddrOfInfo {
...@@ -1323,12 +1359,6 @@ pub const Parser = struct {...@@ -1323,12 +1359,6 @@ pub const Parser = struct {
1323 const prefix_op_node = @fieldParentPtr(ast.NodePrefixOp, "base", base);1359 const prefix_op_node = @fieldParentPtr(ast.NodePrefixOp, "base", base);
1324 try stack.append(RenderState { .Expression = prefix_op_node.rhs });1360 try stack.append(RenderState { .Expression = prefix_op_node.rhs });
1325 switch (prefix_op_node.op) {1361 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 },
1332 ast.NodePrefixOp.PrefixOp.AddrOf => |addr_of_info| {1362 ast.NodePrefixOp.PrefixOp.AddrOf => |addr_of_info| {
1333 try stream.write("&");1363 try stream.write("&");
1334 if (addr_of_info.volatile_token != null) {1364 if (addr_of_info.volatile_token != null) {
...@@ -1343,6 +1373,14 @@ pub const Parser = struct {...@@ -1343,6 +1373,14 @@ pub const Parser = struct {
1343 try stack.append(RenderState { .Expression = align_expr});1373 try stack.append(RenderState { .Expression = align_expr});
1344 }1374 }
1345 },1375 },
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("??"),
1346 }1384 }
1347 },1385 },
1348 ast.Node.Id.IntegerLiteral => {1386 ast.Node.Id.IntegerLiteral => {
...@@ -1627,7 +1665,7 @@ test "zig fmt" {...@@ -1627,7 +1665,7 @@ test "zig fmt" {
1627 );1665 );
16281666
1629 try testCanonical(1667 try testCanonical(
1630 \\test "operators" {1668 \\test "infix operators" {
1631 \\ var i = undefined;1669 \\ var i = undefined;
1632 \\ i = 2;1670 \\ i = 2;
1633 \\ i *= 2;1671 \\ i *= 2;
...@@ -1676,6 +1714,13 @@ test "zig fmt" {...@@ -1676,6 +1714,13 @@ test "zig fmt" {
1676 \\1714 \\
1677 );1715 );
16781716
1717 try testCanonical(
1718 \\test "prefix operators" {
1719 \\ --%~??!*&0;
1720 \\}
1721 \\
1722 );
1723
1679 try testCanonical(1724 try testCanonical(
1680 \\test "test calls" {1725 \\test "test calls" {
1681 \\ a();1726 \\ a();
std/zig/tokenizer.zig+6
...@@ -125,6 +125,7 @@ pub const Token = struct {...@@ -125,6 +125,7 @@ pub const Token = struct {
125 AngleBracketRightEqual,125 AngleBracketRightEqual,
126 AngleBracketAngleBracketRight,126 AngleBracketAngleBracketRight,
127 AngleBracketAngleBracketRightEqual,127 AngleBracketAngleBracketRightEqual,
128 Tilde,
128 IntegerLiteral,129 IntegerLiteral,
129 FloatLiteral,130 FloatLiteral,
130 LineComment,131 LineComment,
...@@ -361,6 +362,11 @@ pub const Tokenizer = struct {...@@ -361,6 +362,11 @@ pub const Tokenizer = struct {
361 self.index += 1;362 self.index += 1;
362 break;363 break;
363 },364 },
365 '~' => {
366 result.id = Token.Id.Tilde;
367 self.index += 1;
368 break;
369 },
364 '.' => {370 '.' => {
365 state = State.Period;371 state = State.Period;
366 },372 },