-%token_class decl_type_token FLOAT DOUBLE INT8 UINT8 INT16 UINT16 INT32 UINT32 INT64 UINT64 NAME.
-%type decl_type {decl_type*}
-%destructor decl_type {free_decl_type($$);}
-decl_type(type_) ::= decl_type_token(T). {
+/* un/signed, urgh */
+decl_scalar_type(type_) ::= CHAR(C). {
+ type_ = C;
+}
+decl_scalar_type(type_) ::= SHORT(S) decl_scalar_type_short(s). {
+ if (s) {
+ type_ = PSI_TokenCat(2, S, s);
+ free(S);
+ free(s);
+ } else {
+ type_ = S;
+ }
+}
+decl_scalar_type_short(s) ::= . {
+ s = NULL;
+}
+
+decl_scalar_type_short(s) ::= INT(I). {
+ s = I;
+}
+decl_scalar_type(type_) ::= INT(I). {
+ type_ = I;
+}
+decl_scalar_type(type_) ::= LONG(L) decl_scalar_type_long(l). {
+ if (l) {
+ type_ = PSI_TokenCat(2, L, l);
+ free(L);
+ free(l);
+ } else {
+ type_ = L;
+ }
+}
+decl_scalar_type_long(l) ::= . {
+ l = NULL;
+}
+decl_scalar_type_long(l) ::= DOUBLE(D). {
+ l = D;
+}
+decl_scalar_type_long(l) ::= LONG(L) decl_scalar_type_long_long(ll). {
+ if (ll) {
+ l = PSI_TokenCat(2, L, ll);
+ free(L);
+ free(ll);
+ } else {
+ l = L;
+ }
+}
+decl_scalar_type_long_long(ll) ::= . {
+ ll = NULL;
+}
+decl_scalar_type_long_long(ll) ::= INT(I). {
+ ll = I;
+}
+decl_type(type_) ::= UNSIGNED(U) decl_scalar_type(N). {
+ PSI_Token *T = PSI_TokenCat(2, U, N);