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 {...@@ -68,22 +68,7 @@ pub const Parser = struct {
68 TopLevelExtern: ?Token,68 TopLevelExtern: ?Token,
69 TopLevelDecl: TopLevelDeclCtx,69 TopLevelDecl: TopLevelDeclCtx,
70 Expression: DestPtr,70 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,
84 AddrOfModifiers: &ast.NodeAddrOfExpr,71 AddrOfModifiers: &ast.NodeAddrOfExpr,
85 SuffixOpExpression: DestPtr,
86 PrimaryExpression: DestPtr,
87 TypeExpr: DestPtr,72 TypeExpr: DestPtr,
88 VarDecl: &ast.NodeVarDecl,73 VarDecl: &ast.NodeVarDecl,
89 VarDeclAlign: &ast.NodeVarDecl,74 VarDeclAlign: &ast.NodeVarDecl,
...@@ -252,11 +237,9 @@ pub const Parser = struct {...@@ -252,11 +237,9 @@ pub const Parser = struct {
252237
253 const next_token = self.getNextToken();238 const next_token = self.getNextToken();
254 if (next_token.id == Token.Id.Keyword_align) {239 if (next_token.id == Token.Id.Keyword_align) {
255 %return stack.append(State {240 _ = %return self.eatToken(Token.Id.LParen);
256 .GroupedExpression = DestPtr {241 %return stack.append(State { .ExpectToken = Token.Id.RParen });
257 .NullableField = &var_decl.align_node242 %return stack.append(State { .Expression = DestPtr{.NullableField = &var_decl.align_node} });
258 }
259 });
260 continue;243 continue;
261 }244 }
262245
...@@ -284,84 +267,30 @@ pub const Parser = struct {...@@ -284,84 +267,30 @@ pub const Parser = struct {
284 },267 },
285 State.Expression => |dest_ptr| {268 State.Expression => |dest_ptr| {
286 const token = self.getNextToken();269 const token = self.getNextToken();
287 if (token.id == Token.Id.Keyword_return) {270 switch (token.id) {
288 const return_node = %return self.createAttachReturn(dest_ptr, token);271 Token.Id.Keyword_return => {
289 stack.append(State {.UnwrapExpression = DestPtr {.Field = &return_node.expr} }) %% unreachable;272 const return_node = %return self.createAttachReturn(dest_ptr, token);
290 continue;273 stack.append(State {.Expression = DestPtr {.Field = &return_node.expr} }) %% unreachable;
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;
358 continue;274 continue;
359 },275 },
360 else => {276 Token.Id.Identifier => {
361 self.putBackToken(first_token);277 _ = %return self.createAttachIdentifier(dest_ptr, token);
362 stack.append(State { .SuffixOpExpression = dest_ptr }) %% unreachable;
363 continue;278 continue;
364 },279 },
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)),
365 }294 }
366 },295 },
367296
...@@ -391,37 +320,13 @@ pub const Parser = struct {...@@ -391,37 +320,13 @@ pub const Parser = struct {
391 else => {320 else => {
392 self.putBackToken(token);321 self.putBackToken(token);
393 stack.append(State {322 stack.append(State {
394 .PrefixOpExpression = DestPtr { .Field = &addr_of_expr.op_expr},323 .Expression = DestPtr { .Field = &addr_of_expr.op_expr},
395 }) %% unreachable;324 }) %% unreachable;
396 continue;325 continue;
397 },326 },
398 }327 }
399 },328 },
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
425 State.TypeExpr => |dest_ptr| {330 State.TypeExpr => |dest_ptr| {
426 const token = self.getNextToken();331 const token = self.getNextToken();
427 if (token.id == Token.Id.Keyword_var) {332 if (token.id == Token.Id.Keyword_var) {
...@@ -429,7 +334,7 @@ pub const Parser = struct {...@@ -429,7 +334,7 @@ pub const Parser = struct {
429 }334 }
430 self.putBackToken(token);335 self.putBackToken(token);
431336
432 stack.append(State { .PrefixOpExpression = dest_ptr }) %% unreachable;337 stack.append(State { .Expression = dest_ptr }) %% unreachable;
433 continue;338 continue;
434 },339 },
435340
...@@ -577,8 +482,6 @@ pub const Parser = struct {...@@ -577,8 +482,6 @@ pub const Parser = struct {
577 %return stack.append(State { .Expression = DestPtr{.List = &block.statements} });482 %return stack.append(State { .Expression = DestPtr{.List = &block.statements} });
578 continue;483 continue;
579 },484 },
580
581 State.GroupedExpression => @panic("TODO"),
582 }485 }
583 unreachable;486 unreachable;
584 }487 }
...@@ -882,7 +785,6 @@ pub const Parser = struct {...@@ -882,7 +785,6 @@ pub const Parser = struct {
882 Expression: &ast.Node,785 Expression: &ast.Node,
883 AddrOfExprBit: &ast.NodeAddrOfExpr,786 AddrOfExprBit: &ast.NodeAddrOfExpr,
884 VarDecl: &ast.NodeVarDecl,787 VarDecl: &ast.NodeVarDecl,
885 VarDeclAlign: &ast.NodeVarDecl,
886 Statement: &ast.Node,788 Statement: &ast.Node,
887 PrintIndent,789 PrintIndent,
888 Indent: usize,790 Indent: usize,
...@@ -969,21 +871,19 @@ pub const Parser = struct {...@@ -969,21 +871,19 @@ pub const Parser = struct {
969 %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));871 %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token));
970 %return stream.print("{}", self.tokenizer.getTokenSlice(var_decl.name_token));872 %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 }
983 %return stack.append(RenderState { .Text = ";" });874 %return stack.append(RenderState { .Text = ";" });
984 if (var_decl.init_node) |init_node| {875 if (var_decl.init_node) |init_node| {
985 %return stream.print(" = ");
986 %return stack.append(RenderState { .Expression = init_node });876 %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 });
987 }887 }
988 },888 },
989889
...@@ -1198,6 +1098,11 @@ test "zig fmt" {...@@ -1198,6 +1098,11 @@ test "zig fmt" {
1198 \\1098 \\
1199 );1099 );
12001100
1101 testCanonical(
1102 \\var foo: c_int align(1);
1103 \\
1104 );
1105
1201 testCanonical(1106 testCanonical(
1202 \\fn main(argc: c_int, argv: &&u8) -> c_int {1107 \\fn main(argc: c_int, argv: &&u8) -> c_int {
1203 \\ const a = b;1108 \\ const a = b;