| ... | @@ -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 { |
| 252 | | 237 | |
| 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_node | 242 | %return stack.append(State { .Expression = DestPtr{.NullableField = &var_decl.align_node} }); |
| 258 | } | | |
| 259 | }); | | |
| 260 | continue; | 243 | continue; |
| 261 | } | 244 | } |
| 262 | | 245 | |
| ... | @@ -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 | }, |
| 367 | | 296 | |
| ... | @@ -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 | }, |
| 400 | | 329 | |
| 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); |
| 431 | | 336 | |
| 432 | stack.append(State { .PrefixOpExpression = dest_ptr }) %% unreachable; | 337 | stack.append(State { .Expression = dest_ptr }) %% unreachable; |
| 433 | continue; | 338 | continue; |
| 434 | }, | 339 | }, |
| 435 | | 340 | |
| ... | @@ -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)); |
| 971 | | 873 | |
| 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 | }, |
| 989 | | 889 | |
| ... | @@ -1198,6 +1098,11 @@ test "zig fmt" { | ... | @@ -1198,6 +1098,11 @@ test "zig fmt" { |
| 1198 | \\ | 1098 | \\ |
| 1199 | ); | 1099 | ); |
| 1200 | | 1100 | |
| | 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; |