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 {...@@ -18,6 +18,7 @@ pub const Node = struct {
18 PrefixOp,18 PrefixOp,
19 IntegerLiteral,19 IntegerLiteral,
20 FloatLiteral,20 FloatLiteral,
21 StringLiteral,
21 BuiltinCall,22 BuiltinCall,
22 };23 };
2324
...@@ -33,6 +34,7 @@ pub const Node = struct {...@@ -33,6 +34,7 @@ pub const Node = struct {
33 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),34 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
34 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),35 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),
35 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),36 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),
37 Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
36 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),38 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
37 };39 };
38 }40 }
...@@ -271,3 +273,12 @@ pub const NodeBuiltinCall = struct {...@@ -271,3 +273,12 @@ pub const NodeBuiltinCall = struct {
271 return null;273 return null;
272 }274 }
273};275};
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 {...@@ -314,6 +314,18 @@ pub const Parser = struct {
314 try stack.append(State {.ExpectToken = Token.Id.LParen });314 try stack.append(State {.ExpectToken = Token.Id.LParen });
315 continue;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 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),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,11 +1038,28 @@ pub const Parser = struct {
1026 const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base);1038 const float_literal = @fieldParentPtr(ast.NodeFloatLiteral, "base", base);
1027 try stream.print("{}", self.tokenizer.getTokenSlice(float_literal.token));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 ast.Node.Id.BuiltinCall => {1045 ast.Node.Id.BuiltinCall => {
1030 const builtin_call = @fieldParentPtr(ast.NodeBuiltinCall, "base", base);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 RenderState.FnProtoRParen => |fn_proto| {1064 RenderState.FnProtoRParen => |fn_proto| {
1036 try stream.print(")");1065 try stream.print(")");
...@@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void {...@@ -1141,6 +1170,7 @@ fn testCanonical(source: []const u8) !void {
11411170
1142test "zig fmt" {1171test "zig fmt" {
1143 try testCanonical(1172 try testCanonical(
1173 \\const std = @import("std");
1144 \\const std = @import();1174 \\const std = @import();
1145 \\1175 \\
1146 );1176 );