| ... | ... | @@ -68,22 +68,7 @@ pub const Parser = struct { |
| 68 | 68 | TopLevelExtern: ?Token, |
| 69 | 69 | TopLevelDecl: TopLevelDeclCtx, |
| 70 | 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 | 71 | AddrOfModifiers: &ast.NodeAddrOfExpr, |
| 85 | | SuffixOpExpression: DestPtr, |
| 86 | | PrimaryExpression: DestPtr, |
| 87 | 72 | TypeExpr: DestPtr, |
| 88 | 73 | VarDecl: &ast.NodeVarDecl, |
| 89 | 74 | VarDeclAlign: &ast.NodeVarDecl, |
| ... | ... | @@ -252,11 +237,9 @@ pub const Parser = struct { |
| 252 | 237 | |
| 253 | 238 | const next_token = self.getNextToken(); |
| 254 | 239 | 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} }); |
| 260 | 243 | continue; |
| 261 | 244 | } |
| 262 | 245 | |
| ... | ... | @@ -284,84 +267,30 @@ pub const Parser = struct { |
| 284 | 267 | }, |
| 285 | 268 | State.Expression => |dest_ptr| { |
| 286 | 269 | 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; |
| 358 | 274 | continue; |
| 359 | 275 | }, |
| 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); |
| 363 | 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 | 320 | else => { |
| 392 | 321 | self.putBackToken(token); |
| 393 | 322 | stack.append(State { |
| 394 | | .PrefixOpExpression = DestPtr { .Field = &addr_of_expr.op_expr}, |
| 323 | .Expression = DestPtr { .Field = &addr_of_expr.op_expr}, |
| 395 | 324 | }) %% unreachable; |
| 396 | 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 | 330 | State.TypeExpr => |dest_ptr| { |
| 426 | 331 | const token = self.getNextToken(); |
| 427 | 332 | if (token.id == Token.Id.Keyword_var) { |
| ... | ... | @@ -429,7 +334,7 @@ pub const Parser = struct { |
| 429 | 334 | } |
| 430 | 335 | self.putBackToken(token); |
| 431 | 336 | |
| 432 | | stack.append(State { .PrefixOpExpression = dest_ptr }) %% unreachable; |
| 337 | stack.append(State { .Expression = dest_ptr }) %% unreachable; |
| 433 | 338 | continue; |
| 434 | 339 | }, |
| 435 | 340 | |
| ... | ... | @@ -577,8 +482,6 @@ pub const Parser = struct { |
| 577 | 482 | %return stack.append(State { .Expression = DestPtr{.List = &block.statements} }); |
| 578 | 483 | continue; |
| 579 | 484 | }, |
| 580 | | |
| 581 | | State.GroupedExpression => @panic("TODO"), |
| 582 | 485 | } |
| 583 | 486 | unreachable; |
| 584 | 487 | } |
| ... | ... | @@ -882,7 +785,6 @@ pub const Parser = struct { |
| 882 | 785 | Expression: &ast.Node, |
| 883 | 786 | AddrOfExprBit: &ast.NodeAddrOfExpr, |
| 884 | 787 | VarDecl: &ast.NodeVarDecl, |
| 885 | | VarDeclAlign: &ast.NodeVarDecl, |
| 886 | 788 | Statement: &ast.Node, |
| 887 | 789 | PrintIndent, |
| 888 | 790 | Indent: usize, |
| ... | ... | @@ -969,21 +871,19 @@ pub const Parser = struct { |
| 969 | 871 | %return stream.print("{} ", self.tokenizer.getTokenSlice(var_decl.mut_token)); |
| 970 | 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 | 874 | %return stack.append(RenderState { .Text = ";" }); |
| 984 | 875 | if (var_decl.init_node) |init_node| { |
| 985 | | %return stream.print(" = "); |
| 986 | 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 | 1098 | \\ |
| 1199 | 1099 | ); |
| 1200 | 1100 | |
| 1101 | testCanonical( |
| 1102 | \\var foo: c_int align(1); |
| 1103 | \\ |
| 1104 | ); |
| 1105 | |
| 1201 | 1106 | testCanonical( |
| 1202 | 1107 | \\fn main(argc: c_int, argv: &&u8) -> c_int { |
| 1203 | 1108 | \\ const a = b; |