@@ -51,6 +51,10 @@ pub const Parser = struct {
5151 .rparen = > return ParseError .UnexpectedRightParen ,
5252 .lbracket = > self .parseVector (allocator , tk .line ),
5353 .rbracket = > return ParseError .UnexpectedRightBracket ,
54+ .quote = > try self .wrapExpr (allocator , tk .line , "quote" ),
55+ .quasiquote = > try self .wrapExpr (allocator , tk .line , "quasiquote" ),
56+ .unquote = > try self .wrapExpr (allocator , tk .line , "unquote" ),
57+ .unquote_splice = > try self .wrapExpr (allocator , tk .line , "unquote_splice" ),
5458 };
5559 }
5660
@@ -85,13 +89,27 @@ pub const Parser = struct {
8589 },
8690 };
8791 }
92+
93+ fn wrapExpr (self : * Parser , allocator : Allocator , line : u32 , sym : []const u8 ) ParseError ! Node {
94+ const tk = try self .scanner .scanToken () orelse return ParseError .MissingExpr ;
95+ const expr = try self .parseExpr (allocator , tk );
96+ const items = &[_ ]Node { .{ .symbol = .{ .name = sym , .line = line } }, expr };
97+
98+ return Node {
99+ .list = Node.List {
100+ .items = try allocator .dupe (Node , items ),
101+ .line = line ,
102+ },
103+ };
104+ }
88105};
89106
90107pub const ParseError = error {
91108 UnexpectedRightParen ,
92109 UnexpectedRightBracket ,
93110 MissingRightParen ,
94111 MissingRightBracket ,
112+ MissingExpr ,
95113} || scanner .ScanError || fmt .ParseFloatError || Allocator .Error ;
96114
97115pub const AbstractSyntaxTree = struct { nodes : []const Node };
@@ -198,6 +216,13 @@ test "Parse keyword" {
198216 );
199217}
200218
219+ // test "Parse quote" {
220+ // try expectAstWithOneNode(
221+ // "'",
222+ // .{ .quote = .{ .name = "'", .line = 1 } },
223+ // );
224+ // }
225+
201226test "Parse string" {
202227 try expectAstWithOneNode (
203228 "\" Hello World!\" " ,
0 commit comments