diff options
Diffstat (limited to 'src/parser.zig')
| -rw-r--r-- | src/parser.zig | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/parser.zig b/src/parser.zig index e92ed51..da3c71c 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -589,11 +589,12 @@ pub const Parser = struct { } } - // PrimaryExpression ::= NULL | NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionDefinition | StructDefinition | StructInstantiation | FieldAccess | LPAREN Expression RPAREN + // PrimaryExpression ::= NULL | NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionDefinition | TypeDefinition | StructDefinition | StructInstantiation | FieldAccess | LPAREN Expression RPAREN fn parse_primary_expression(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing primary expression {any}\n", .{self.peek_token()}); if (self.accept_parse(parse_function_definition)) |stmt| return stmt; + if (self.accept_parse(parse_type_definition)) |stmt| return stmt; if (self.accept_parse(parse_struct_definition)) |stmt| return stmt; if (self.accept_parse(parse_struct_instanciation)) |stmt| return stmt; @@ -706,6 +707,24 @@ pub const Parser = struct { return node_list.items; } + // TypeDefinition ::= "newtype" Type + fn parse_type_definition(self: *Parser) ParserError!*Node { + errdefer if (!self.try_context) std.debug.print("Error parsing type definition {any}\n", .{self.peek_token()}); + + _ = try self.parse_token(tokenizer.TokenType.TYPE); + + const typ = try self.parse_type(); + + return self.create_node(.{ + .TYPE = .{ + .SIMPLE_TYPE = .{ + .name = "", + .underlying_type = typ, + }, + }, + }); + } + // StructDefinition ::= "struct" LBRACE StructFields? RBRACE fn parse_struct_definition(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing struct definition {any}\n", .{self.peek_token()}); |