authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-29 23:40:46+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-29 23:40:46+02:00
logedca1739975f69a695d1ee12ba88ebca1778fefb
tree1b783e5311fd5bec4a079270e1090392ed32cb9f
parent8ada03097117cd70800f9e5e7cce97226107f79e

std.zig.parser now parses call expr


2 files changed, 79 insertions(+), 0 deletions(-)

std/zig/ast.zig+31
......@@ -22,6 +22,7 @@ pub const Node = struct {
2222 StringLiteral,
2323 UndefinedLiteral,
2424 BuiltinCall,
25 Call,
2526 LineComment,
2627 TestDecl,
2728 };
......@@ -41,6 +42,7 @@ pub const Node = struct {
4142 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
4243 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).iterate(index),
4344 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
45 Id.Call => @fieldParentPtr(NodeCall, "base", base).iterate(index),
4446 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),
4547 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index),
4648 };
......@@ -61,6 +63,7 @@ pub const Node = struct {
6163 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(),
6264 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).firstToken(),
6365 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
66 Id.Call => @fieldParentPtr(NodeCall, "base", base).firstToken(),
6467 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),
6568 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(),
6669 };
......@@ -81,6 +84,7 @@ pub const Node = struct {
8184 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(),
8285 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).lastToken(),
8386 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
87 Id.Call => @fieldParentPtr(NodeCall, "base", base).lastToken(),
8488 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),
8589 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(),
8690 };
......@@ -527,6 +531,33 @@ pub const NodeBuiltinCall = struct {
527531 }
528532};
529533
534pub const NodeCall = struct {
535 base: Node,
536 callee: &Node,
537 params: ArrayList(&Node),
538 rparen_token: Token,
539
540 pub fn iterate(self: &NodeCall, index: usize) ?&Node {
541 var i = index;
542
543 if (i < 1) return self.callee;
544 i -= 1;
545
546 if (i < self.params.len) return self.params.at(i);
547 i -= self.params.len;
548
549 return null;
550 }
551
552 pub fn firstToken(self: &NodeCall) Token {
553 return self.callee.firstToken();
554 }
555
556 pub fn lastToken(self: &NodeCall) Token {
557 return self.rparen_token;
558 }
559};
560
530561pub const NodeStringLiteral = struct {
531562 base: Node,
532563 token: Token,
std/zig/parser.zig+48
......@@ -428,6 +428,29 @@ pub const Parser = struct {
428428 try stack.append(State.ExpectOperand);
429429 continue;
430430
431 } else if (token.id == Token.Id.LParen) {
432 self.putBackToken(token);
433
434 const node = try arena.create(ast.NodeCall);
435 *node = ast.NodeCall {
436 .base = self.initNode(ast.Node.Id.Call),
437 .callee = stack.pop().Operand,
438 .params = ArrayList(&ast.Node).init(arena),
439 .rparen_token = undefined,
440 };
441 try stack.append(State {
442 .Operand = &node.base
443 });
444 try stack.append(State.AfterOperand);
445 try stack.append(State {.ExprListItemOrEnd = &node.params });
446 try stack.append(State {
447 .ExpectTokenSave = ExpectTokenSave {
448 .id = Token.Id.LParen,
449 .ptr = &node.rparen_token,
450 },
451 });
452 continue;
453
431454 // TODO: Parse postfix operator
432455 } else {
433456 // no postfix/infix operator after this operand.
......@@ -1325,6 +1348,21 @@ pub const Parser = struct {
13251348 }
13261349 }
13271350 },
1351 ast.Node.Id.Call => {
1352 const call = @fieldParentPtr(ast.NodeCall, "base", base);
1353 try stack.append(RenderState { .Text = ")"});
1354 var i = call.params.len;
1355 while (i != 0) {
1356 i -= 1;
1357 const param_node = call.params.at(i);
1358 try stack.append(RenderState { .Expression = param_node});
1359 if (i != 0) {
1360 try stack.append(RenderState { .Text = ", " });
1361 }
1362 }
1363 try stack.append(RenderState { .Text = "("});
1364 try stack.append(RenderState { .Expression = call.callee });
1365 },
13281366 ast.Node.Id.FnProto => @panic("TODO fn proto in an expression"),
13291367 ast.Node.Id.LineComment => @panic("TODO render line comment in an expression"),
13301368
......@@ -1610,4 +1648,14 @@ test "zig fmt" {
16101648 \\}
16111649 \\
16121650 );
1651
1652 try testCanonical(
1653 \\test "test calls" {
1654 \\ a();
1655 \\ a(1);
1656 \\ a(1, 2);
1657 \\ a(1, 2) + a(1, 2);
1658 \\}
1659 \\
1660 );
16131661}