authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-14 13:43:05-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-14 13:43:05-05:00
logd790670f4c11687fea50c2fd302ca8a815b32d68
treecd3031462494d666e76b7a7c1e490f4caa978dba
parent1a53c648ed711277232aaa5a0b1082a9f24bd9c3

self hosted parser: support string literals


2 files changed, 43 insertions(+), 2 deletions(-)

std/zig/ast.zig+11
......@@ -18,6 +18,7 @@ pub const Node = struct {
1818 PrefixOp,
1919 IntegerLiteral,
2020 FloatLiteral,
21 StringLiteral,
2122 BuiltinCall,
2223 };
2324
......@@ -33,6 +34,7 @@ pub const Node = struct {
3334 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
3435 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),
3536 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),
37 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
3638 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
3739 };
3840 }
......@@ -271,3 +273,12 @@ pub const NodeBuiltinCall = struct {
271273 return null;
272274 }
273275};
276
277pub const NodeStringLiteral = struct {
278 base: Node,
279 token: Token,
280
281 pub fn iterate(self: &NodeStringLiteral) ?&Node {
282 return null;
283 }
284};
std/zig/parser.zig+32-2
......@@ -314,6 +314,18 @@ pub const Parser = struct {
314314 try stack.append(State {.ExpectToken = Token.Id.LParen });
315315 continue;
316316 },
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 },
317329 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),
318330 }
319331 },
......@@ -1026,11 +1038,28 @@ pub const Parser = struct {
10261038 const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base);
10271039 try stream.print("{}", self.tokenizer.getTokenSlice(float_literal.token));
10281040 },
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 },
10291045 ast.Node.Id.BuiltinCall => {
10301046 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 }
10321058 },
1033 else => unreachable,
1059 ast.Node.Id.Root,
1060 ast.Node.Id.VarDecl,
1061 ast.Node.Id.FnProto,
1062 ast.Node.Id.ParamDecl => unreachable,
10341063 },
10351064 RenderState.FnProtoRParen => |fn_proto| {
10361065 try stream.print(")");
......@@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void {
11411170
11421171test "zig fmt" {
11431172 try testCanonical(
1173 \\const std = @import("std");
11441174 \\const std = @import();
11451175 \\
11461176 );