]> git.corax.cc Git - ccc/commitdiff
parser: Implement parsing of type names and abstract declarators
authorMatthias Kruk <m@m10k.eu>
Sun, 12 Jul 2020 06:18:24 +0000 (15:18 +0900)
committerMatthias Kruk <m@m10k.eu>
Sun, 12 Jul 2020 06:18:24 +0000 (15:18 +0900)
src/parser.c
src/parser.h

index fecb5691d18b414baf8fda2813b1942148bed9b4..0859d4a2271c1ee7cc032f54a99e4d9092f3f51a 100644 (file)
@@ -862,8 +862,53 @@ struct cast_expression *parse_cast_expression(void)
 
 struct type_name *parse_type_name(void)
 {
-       fprintf(stderr, "FIXME: %s() is not implemented\n", __func__);
-       return(NULL);
+       struct type_name *name;
+
+       name = type_name_new();
+
+       /*
+        * type-name:
+        *     specifier-qualifier-list abstract-declarator_opt
+        */
+
+       if(name) {
+               name->sqlist = parse_specifier_qualifier_list();
+
+               if(name->sqlist) {
+                       /* we don't check the return value because the abstract declarator is optional */
+                       name->absdecl = parse_abstract_declarator();
+               } else {
+                       type_name_free(name);
+                       name = NULL;
+               }
+       }
+
+       return(name);
+}
+
+struct abstract_declarator *parse_abstract_declarator(void)
+{
+       struct abstract_declarator *decl;
+
+       decl = abstract_declarator_new();
+
+       /*
+        * abstract-declarator:
+        *     pointer
+        *     pointer_opt direct-abstract-declarator
+        */
+
+       if(decl) {
+               decl->pointer = parse_pointer();
+               decl->dadecl = parse_direct_abstract_declarator();
+
+               if(!decl->pointer && !decl->dadecl) {
+                       abstract_declarator_free(decl);
+                       decl = NULL;
+               }
+       }
+
+       return(decl);
 }
 
 struct logical_or_expression *parse_logical_or_expression(void)
index 1951d02c36f7363db8f14f4c6d04068f946e86ab..fc09c0923d846898fa442711a5c3d576e112a59e 100644 (file)
@@ -11,6 +11,7 @@ struct constant *parse_constant(void);
 struct string *parse_string(void);
 struct type_name *parse_type_name(void);
 
+struct abstract_declarator *parse_abstract_declarator(void);
 struct assignment_expression *parse_assignment_expression(void);
 struct logical_or_expression *parse_logical_or_expression(void);
 struct logical_and_expression *parse_logical_and_expression(void);