authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-12-12 19:50:43-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-12-12 19:50:43-07:00
logd295279b16dd21ec5263c4db2f08e182ccb4fad0
tree36b35f998c8550bf66a3d348f59391eeb7792775
parent0003cc81056b5be394b857b717cf64f08f44c0f5

self-hosted: implement var decl align


1 files changed, 40 insertions(+), 135 deletions(-)

src-self-hosted/parser.zig+40-135
......@@ -68,22 +68,7 @@ pub const Parser = struct {
6868 TopLevelExtern: ?Token,
6969 TopLevelDecl: TopLevelDeclCtx,
7070 Expression: DestPtr,
71 GroupedExpression: DestPtr,
72 UnwrapExpression: DestPtr,
73 BoolOrExpression: DestPtr,
74 BoolAndExpression: DestPtr,
75 ComparisonExpression: DestPtr,
76 BinaryOrExpression: DestPtr,
77 BinaryXorExpression: DestPtr,
78 BinaryAndExpression: DestPtr,
79 BitShiftExpression: DestPtr,
80 AdditionExpression: DestPtr,
81 MultiplyExpression: DestPtr,
82 BraceSuffixExpression: DestPtr,
83 PrefixOpExpression: DestPtr,
8471 AddrOfModifiers: &ast.NodeAddrOfExpr,
85 SuffixOpExpression: DestPtr,
86 PrimaryExpression: DestPtr,
8772 TypeExpr: DestPtr,
8873 VarDecl: &ast.NodeVarDecl,
8974 VarDeclAlign: &ast.NodeVarDecl,
......@@ -252,11 +237,9 @@ pub const Parser = struct {
252237
253238 const next_token = self.getNextToken();
254239 if (next_token.id == Token.Id.Keyword_align) {
255 %return stack.append(State {
256 .GroupedExpression = DestPtr {
257 .NullableField = &var_decl.align_node
258 }
259 });
240 _ = %return self.eatToken(Token.Id.LParen);
241 %return stack.append(State { .ExpectToken = Token.Id.RParen });
242 %return stack.append(State { .Expression = DestPtr{.NullableField = &var_decl.align_node} });
260243 continue;
261244 }
262245
......@@ -284,84 +267,30 @@ pub const Parser = struct {
284267 },
285268 State.Expression => |dest_ptr| {
286269 const token = self.getNextToken();
287 if (token.id == Token.Id.Keyword_return) {
288 const return_node = %return self.createAttachReturn(dest_ptr, token);
289 stack.append(State {.UnwrapExpression = DestPtr {.Field = &return_node.expr} }) %% unreachable;
290 continue;
291 }
292 self.putBackToken(token);
293 stack.append(State {.UnwrapExpression = dest_ptr}) %% unreachable;
294 continue;
295 },
296
297 State.UnwrapExpression => |dest_ptr| {
298 stack.append(State {.BoolOrExpression = dest_ptr}) %% unreachable;
299 continue;
300 },
301
302 State.BoolOrExpression => |dest_ptr| {
303 stack.append(State {.BoolAndExpression = dest_ptr}) %% unreachable;
304 continue;
305 },
306
307 State.BoolAndExpression => |dest_ptr| {
308 stack.append(State {.ComparisonExpression = dest_ptr}) %% unreachable;
309 continue;
310 },
311
312 State.ComparisonExpression => |dest_ptr| {
313 stack.append(State {.BinaryOrExpression = dest_ptr}) %% unreachable;
314 continue;
315 },
316
317 State.BinaryOrExpression => |dest_ptr| {
318 stack.append(State {.BinaryXorExpression = dest_ptr}) %% unreachable;
319 continue;
320 },
321
322 State.BinaryXorExpression => |dest_ptr| {
323 stack.append(State {.BinaryAndExpression = dest_ptr}) %% unreachable;
324 continue;
325 },
326
327 State.BinaryAndExpression => |dest_ptr| {
328 stack.append(State {.BitShiftExpression = dest_ptr}) %% unreachable;
329 continue;
330 },
331
332 State.BitShiftExpression => |dest_ptr| {
333 stack.append(State {.AdditionExpression = dest_ptr}) %% unreachable;
334 continue;
335 },
336
337 State.AdditionExpression => |dest_ptr| {
338 stack.append(State {.MultiplyExpression = dest_ptr}) %% unreachable;
339 continue;
340 },
341
342 State.MultiplyExpression => |dest_ptr| {
343 stack.append(State {.BraceSuffixExpression = dest_ptr}) %% unreachable;
344 continue;
345 },
346
347 State.BraceSuffixExpression => |dest_ptr| {
348 stack.append(State {.PrefixOpExpression = dest_ptr}) %% unreachable;
349 continue;
350 },
351
352 State.PrefixOpExpression => |dest_ptr| {
353 const first_token = self.getNextToken();
354 switch (first_token.id) {
355 Token.Id.Ampersand => {
356 const addr_of_expr = %return self.createAttachAddrOfExpr(dest_ptr, first_token);
357 stack.append(State { .AddrOfModifiers = addr_of_expr }) %% unreachable;
270 switch (token.id) {
271 Token.Id.Keyword_return => {
272 const return_node = %return self.createAttachReturn(dest_ptr, token);
273 stack.append(State {.Expression = DestPtr {.Field = &return_node.expr} }) %% unreachable;
358274 continue;
359275 },
360 else => {
361 self.putBackToken(first_token);
362 stack.append(State { .SuffixOpExpression = dest_ptr }) %% unreachable;
276 Token.Id.Identifier => {
277 _ = %return self.createAttachIdentifier(dest_ptr, token);
363278 continue;
364279 },
280 Token.Id.IntegerLiteral => {
281 _ = %return self.createAttachIntegerLiteral(dest_ptr, token);
282 continue;
283 },
284 Token.Id.FloatLiteral => {
285 _ = %return self.createAttachFloatLiteral(dest_ptr, token);
286 continue;
287 },
288 Token.Id.Ampersand => {
289 const addr_of_expr = %return self.createAttachAddrOfExpr(dest_ptr, token);
290 stack.append(State { .AddrOfModifiers = addr_of_expr }) %% unreachable;
291 continue;
292 },
293 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),
365294 }
366295 },
367296
......@@ -391,37 +320,13 @@ pub const Parser = struct {
391320 else => {
392321 self.putBackToken(token);
393322 stack.append(State {
394 .PrefixOpExpression = DestPtr { .Field = &addr_of_expr.op_expr},
323 .Expression = DestPtr { .Field = &addr_of_expr.op_expr},
395324 }) %% unreachable;
396325 continue;
397326 },
398327 }
399328 },
400329
401 State.SuffixOpExpression => |dest_ptr| {
402 stack.append(State { .PrimaryExpression = dest_ptr }) %% unreachable;
403 continue;
404 },
405
406 State.PrimaryExpression => |dest_ptr| {
407 const token = self.getNextToken();
408 switch (token.id) {
409 Token.Id.Identifier => {
410 _ = %return self.createAttachIdentifier(dest_ptr, token);
411 continue;
412 },
413 Token.Id.IntegerLiteral => {
414 _ = %return self.createAttachIntegerLiteral(dest_ptr, token);
415 continue;
416 },
417 Token.Id.FloatLiteral => {
418 _ = %return self.createAttachFloatLiteral(dest_ptr, token);
419 continue;
420 },
421 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),
422 }
423 },
424
425330 State.TypeExpr => |dest_ptr| {
426331 const token = self.getNextToken();
427332 if (token.id == Token.Id.Keyword_var) {
......@@ -429,7 +334,7 @@ pub const Parser = struct {
429334 }
430335 self.putBackToken(token);
431336
432 stack.append(State { .PrefixOpExpression = dest_ptr }) %% unreachable;
337 stack.append(State { .Expression = dest_ptr }) %% unreachable;
433338 continue;
434339 },
435340
......@@ -577,8 +482,6 @@ pub const Parser = struct {
577482 %return stack.append(State { .Expression = DestPtr{.List = &block.statements} });
578483 continue;
579484 },
580
581 State.GroupedExpression => @panic("TODO"),
582485 }
583486 unreachable;
584487 }
......@@ -882,7 +785,6 @@ pub const Parser = struct {
882785 Expression: &ast.Node,
883786 AddrOfExprBit: &ast.NodeAddrOfExpr,
884787 VarDecl: &ast.NodeVarDecl,
885 VarDeclAlign: &ast.NodeVarDecl,
886788 Statement: &ast.Node,
887789 PrintIndent,
888790 Indent: usize,
......@@ -969,21 +871,19 @@ pub const Parser = struct {
969871 %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));
970872 %return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));
971873
972 %return stack.append(RenderState { .VarDeclAlign = var_decl });
973 if (var_decl.type_node) |type_node| {
974 %return stream.print(": ");
975 %return stack.append(RenderState { .Expression = type_node });
976 }
977 },
978
979 RenderState.VarDeclAlign => |var_decl| {
980 if (var_decl.align_node != null) {
981 @panic("TODO");
982 }
983874 %return stack.append(RenderState { .Text = ";" });
984875 if (var_decl.init_node) |init_node| {
985 %return stream.print(" = ");
986876 %return stack.append(RenderState { .Expression = init_node });
877 %return stack.append(RenderState { .Text = " = " });
878 }
879 if (var_decl.align_node) |align_node| {
880 %return stack.append(RenderState { .Text = ")" });
881 %return stack.append(RenderState { .Expression = align_node });
882 %return stack.append(RenderState { .Text = " align(" });
883 }
884 if (var_decl.type_node) |type_node| {
885 %return stream.print(": ");
886 %return stack.append(RenderState { .Expression = type_node });
987887 }
988888 },
989889
......@@ -1198,6 +1098,11 @@ test "zig fmt" {
11981098 \\
11991099 );
12001100
1101 testCanonical(
1102 \\var foo: c_int align(1);
1103 \\
1104 );
1105
12011106 testCanonical(
12021107 \\fn main(argc: c_int, argv: &&u8) -> c_int {
12031108 \\ const a = b;