Skip to content

Commit

Permalink
std.zig.parser now parses call expr
Browse files Browse the repository at this point in the history
  • Loading branch information
Hejsil committed Mar 29, 2018
1 parent 8ada030 commit edca173
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 0 deletions.
31 changes: 31 additions & 0 deletions std/zig/ast.zig
Expand Up @@ -22,6 +22,7 @@ pub const Node = struct {
StringLiteral,
UndefinedLiteral,
BuiltinCall,
Call,
LineComment,
TestDecl,
};
Expand All @@ -41,6 +42,7 @@ pub const Node = struct {
Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).iterate(index),
Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
Id.Call => @fieldParentPtr(NodeCall, "base", base).iterate(index),
Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),
Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index),
};
Expand All @@ -61,6 +63,7 @@ pub const Node = struct {
Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(),
Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).firstToken(),
Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
Id.Call => @fieldParentPtr(NodeCall, "base", base).firstToken(),
Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),
Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(),
};
Expand All @@ -81,6 +84,7 @@ pub const Node = struct {
Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(),
Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).lastToken(),
Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
Id.Call => @fieldParentPtr(NodeCall, "base", base).lastToken(),
Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),
Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(),
};
Expand Down Expand Up @@ -527,6 +531,33 @@ pub const NodeBuiltinCall = struct {
}
};

pub const NodeCall = struct {
base: Node,
callee: &Node,
params: ArrayList(&Node),
rparen_token: Token,

pub fn iterate(self: &NodeCall, index: usize) ?&Node {
var i = index;

if (i < 1) return self.callee;
i -= 1;

if (i < self.params.len) return self.params.at(i);
i -= self.params.len;

return null;
}

pub fn firstToken(self: &NodeCall) Token {
return self.callee.firstToken();
}

pub fn lastToken(self: &NodeCall) Token {
return self.rparen_token;
}
};

pub const NodeStringLiteral = struct {
base: Node,
token: Token,
Expand Down
48 changes: 48 additions & 0 deletions std/zig/parser.zig
Expand Up @@ -428,6 +428,29 @@ pub const Parser = struct {
try stack.append(State.ExpectOperand);
continue;

} else if (token.id == Token.Id.LParen) {
self.putBackToken(token);

const node = try arena.create(ast.NodeCall);
*node = ast.NodeCall {
.base = self.initNode(ast.Node.Id.Call),
.callee = stack.pop().Operand,
.params = ArrayList(&ast.Node).init(arena),
.rparen_token = undefined,
};
try stack.append(State {
.Operand = &node.base
});
try stack.append(State.AfterOperand);
try stack.append(State {.ExprListItemOrEnd = &node.params });
try stack.append(State {
.ExpectTokenSave = ExpectTokenSave {
.id = Token.Id.LParen,
.ptr = &node.rparen_token,
},
});
continue;

// TODO: Parse postfix operator
} else {
// no postfix/infix operator after this operand.
Expand Down Expand Up @@ -1325,6 +1348,21 @@ pub const Parser = struct {
}
}
},
ast.Node.Id.Call => {
const call = @fieldParentPtr(ast.NodeCall, "base", base);
try stack.append(RenderState { .Text = ")"});
var i = call.params.len;
while (i != 0) {
i -= 1;
const param_node = call.params.at(i);
try stack.append(RenderState { .Expression = param_node});
if (i != 0) {
try stack.append(RenderState { .Text = ", " });
}
}
try stack.append(RenderState { .Text = "("});
try stack.append(RenderState { .Expression = call.callee });
},
ast.Node.Id.FnProto => @panic("TODO fn proto in an expression"),
ast.Node.Id.LineComment => @panic("TODO render line comment in an expression"),

Expand Down Expand Up @@ -1610,4 +1648,14 @@ test "zig fmt" {
\\}
\\
);

try testCanonical(
\\test "test calls" {
\\ a();
\\ a(1);
\\ a(1, 2);
\\ a(1, 2) + a(1, 2);
\\}
\\
);
}

0 comments on commit edca173

Please sign in to comment.