Skip to content

Commit 24071c6

Browse files
committedMar 30, 2018
std.zig.parser parses all prefix operators
1 parent 1dfa927 commit 24071c6

File tree

3 files changed

+73
-10
lines changed

3 files changed

+73
-10
lines changed
 

‎std/zig/ast.zig

+15-3
Original file line numberDiff line numberDiff line change
@@ -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
Original file line numberDiff line numberDiff line change
@@ -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
Original file line numberDiff line numberDiff line change
@@ -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
},

0 commit comments

Comments
 (0)
Please sign in to comment.