about summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/parser.zig21
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()});