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)
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);