authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-10 23:02:45-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-10 23:02:45-05:00
logf951bcf01b54d0cf16251d14fd3dee92b2dd9a10
tree170ac5c59cbcc10b81152d64ab66b7a53e7b31c3
parent53d58684a6cb09f6c8463b162e5c059a45ca56eb

self-hosted: parse variable declarations with types


1 files changed, 39 insertions(+), 11 deletions(-)

src-self-hosted/main.zig+39-11
...@@ -914,12 +914,19 @@ const Parser = struct {...@@ -914,12 +914,19 @@ const Parser = struct {
914 continue;914 continue;
915 },915 },
916 State.VarDeclEq => |var_decl| {916 State.VarDeclEq => |var_decl| {
917 var_decl.eq_token = %return self.eatToken(Token.Id.Equal);917 const token = self.getNextToken();
918 stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable;918 if (token.id == Token.Id.Equal) {
919 %return stack.append(State {919 var_decl.eq_token = token;
920 .Expression = removeNullCast(&var_decl.init_node),920 stack.append(State { .ExpectToken = Token.Id.Semicolon }) %% unreachable;
921 });921 %return stack.append(State {
922 continue;922 .Expression = removeNullCast(&var_decl.init_node),
923 });
924 continue;
925 }
926 if (token.id == Token.Id.Semicolon) {
927 continue;
928 }
929 return self.parseError(token, "expected '=' or ';', found {}", @tagName(token.id));
923 },930 },
924 State.ExpectToken => |token_id| {931 State.ExpectToken => |token_id| {
925 _ = %return self.eatToken(token_id);932 _ = %return self.eatToken(token_id);
...@@ -1345,6 +1352,7 @@ const Parser = struct {...@@ -1345,6 +1352,7 @@ const Parser = struct {
1345 Text: []const u8,1352 Text: []const u8,
1346 Expression: &AstNode,1353 Expression: &AstNode,
1347 AddrOfExprBit: &AstNodeAddrOfExpr,1354 AddrOfExprBit: &AstNodeAddrOfExpr,
1355 VarDeclAlign: &AstNodeVarDecl,
1348 };1356 };
13491357
1350 pub fn renderSource(self: &Parser, stream: &std.io.OutStream, root_node: &AstNodeRoot) -> %void {1358 pub fn renderSource(self: &Parser, stream: &std.io.OutStream, root_node: &AstNodeRoot) -> %void {
...@@ -1417,16 +1425,27 @@ const Parser = struct {...@@ -1417,16 +1425,27 @@ const Parser = struct {
1417 %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));1425 %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));
1418 %return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));1426 %return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));
14191427
1420 %return stream.print(" = ");1428 %return stack.append(RenderState { .VarDeclAlign = var_decl });
14211429 if (var_decl.type_node) |type_node| {
1422 %return stack.append(RenderState { .Text = ";\n" });1430 %return stream.print(": ");
1423 if (var_decl.init_node) |init_node| {1431 %return stack.append(RenderState { .Expression = type_node });
1424 %return stack.append(RenderState { .Expression = init_node });
1425 }1432 }
1426 },1433 },
1427 else => unreachable,1434 else => unreachable,
1428 }1435 }
1429 },1436 },
1437
1438 RenderState.VarDeclAlign => |var_decl| {
1439 if (var_decl.align_node != null) {
1440 @panic("TODO");
1441 }
1442 %return stack.append(RenderState { .Text = ";\n" });
1443 if (var_decl.init_node) |init_node| {
1444 %return stream.print(" = ");
1445 %return stack.append(RenderState { .Expression = init_node });
1446 }
1447 },
1448
1430 RenderState.ParamDecl => |base| {1449 RenderState.ParamDecl => |base| {
1431 const param_decl = @fieldParentPtr(AstNodeParamDecl, "base", base);1450 const param_decl = @fieldParentPtr(AstNodeParamDecl, "base", base);
1432 if (param_decl.comptime_token) |comptime_token| {1451 if (param_decl.comptime_token) |comptime_token| {
...@@ -1597,6 +1616,15 @@ test "zig fmt" {...@@ -1597,6 +1616,15 @@ test "zig fmt" {
1597 \\pub const a = b;1616 \\pub const a = b;
1598 \\var a = b;1617 \\var a = b;
1599 \\pub var a = b;1618 \\pub var a = b;
1619 \\const a: i32 = b;
1620 \\pub const a: i32 = b;
1621 \\var a: i32 = b;
1622 \\pub var a: i32 = b;
1623 \\
1624 );
1625
1626 testCanonical(
1627 \\extern var foo: c_int;
1600 \\1628 \\
1601 );1629 );
1602}1630}