a = a->next;
a->next = b;
}
+
+/*
+ * Alter an abstract declarator (type name) to declare an identifier instead,
+ * used by the English parser rules to reduce "identifier as type" sequences.
+ */
+static struct cdecl *insert_identifier(struct cdecl *decl, char *ident)
+{
+ struct cdecl_declarator *d = decl->declarators;
+
+ while (d->child)
+ d = d->child;
+
+ d->type = CDECL_DECL_IDENT;
+ d->u.ident = ident;
+
+ return decl;
+}
%}
%destructor { free($$); } <strval>
}
english: T_DECLARE T_IDENT T_AS english_declaration {
- $$ = $4;
- for (struct cdecl_declarator *d = $$->declarators; d; d = d->child) {
- if (d->type == CDECL_DECL_NULL) {
- d->type = CDECL_DECL_IDENT;
- d->u.ident = $2;
- }
- }
+ $$ = insert_identifier($4, $2);
} | T_TYPE english_declaration {
$$ = $2;
}
.specifiers = $1,
.declarators = $2);
} | T_IDENT T_AS english_declaration {
- $$ = $3;
- for (struct cdecl_declarator *d = $$->declarators; d; d = d->child) {
- if (d->type == CDECL_DECL_NULL) {
- d->type = CDECL_DECL_IDENT;
- d->u.ident = $1;
- }
- }
+ $$ = insert_identifier($3, $1);
}
english_array: T_VLA T_ARRAY english_vla T_OF {