| ... | ... | @@ -314,6 +314,18 @@ pub const Parser = struct { |
| 314 | 314 | try stack.append(State {.ExpectToken = Token.Id.LParen }); |
| 315 | 315 | continue; |
| 316 | 316 | }, |
| 317 | Token.Id.StringLiteral => { |
| 318 | const node = try arena.create(ast.NodeStringLiteral); |
| 319 | *node = ast.NodeStringLiteral { |
| 320 | .base = ast.Node {.id = ast.Node.Id.StringLiteral}, |
| 321 | .token = token, |
| 322 | }; |
| 323 | try stack.append(State { |
| 324 | .Operand = &node.base |
| 325 | }); |
| 326 | try stack.append(State.AfterOperand); |
| 327 | continue; |
| 328 | }, |
| 317 | 329 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), |
| 318 | 330 | } |
| 319 | 331 | }, |
| ... | ... | @@ -1026,11 +1038,28 @@ pub const Parser = struct { |
| 1026 | 1038 | const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base); |
| 1027 | 1039 | try stream.print("{}", self.tokenizer.getTokenSlice(float_literal.token)); |
| 1028 | 1040 | }, |
| 1041 | ast.Node.Id.StringLiteral => { |
| 1042 | const string_literal = @fieldParentPtr(ast.NodeStringLiteral, "base", base); |
| 1043 | try stream.print("{}", self.tokenizer.getTokenSlice(string_literal.token)); |
| 1044 | }, |
| 1029 | 1045 | ast.Node.Id.BuiltinCall => { |
| 1030 | 1046 | const builtin_call = @fieldParentPtr(ast.NodeBuiltinCall, "base", base); |
| 1031 | | try stream.print("{}()", self.tokenizer.getTokenSlice(builtin_call.builtin_token)); |
| 1047 | try stream.print("{}(", self.tokenizer.getTokenSlice(builtin_call.builtin_token)); |
| 1048 | try stack.append(RenderState { .Text = ")"}); |
| 1049 | var i = builtin_call.params.len; |
| 1050 | while (i != 0) { |
| 1051 | i -= 1; |
| 1052 | const param_node = builtin_call.params.at(i); |
| 1053 | try stack.append(RenderState { .Expression = param_node}); |
| 1054 | if (i != 0) { |
| 1055 | try stack.append(RenderState { .Text = ", " }); |
| 1056 | } |
| 1057 | } |
| 1032 | 1058 | }, |
| 1033 | | else => unreachable, |
| 1059 | ast.Node.Id.Root, |
| 1060 | ast.Node.Id.VarDecl, |
| 1061 | ast.Node.Id.FnProto, |
| 1062 | ast.Node.Id.ParamDecl => unreachable, |
| 1034 | 1063 | }, |
| 1035 | 1064 | RenderState.FnProtoRParen => |fn_proto| { |
| 1036 | 1065 | try stream.print(")"); |
| ... | ... | @@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void { |
| 1141 | 1170 | |
| 1142 | 1171 | test "zig fmt" { |
| 1143 | 1172 | try testCanonical( |
| 1173 | \\const std = @import("std"); |
| 1144 | 1174 | \\const std = @import(); |
| 1145 | 1175 | \\ |
| 1146 | 1176 | ); |