%{ /* Yacc grammar for ANSI and C++ cdecl. */ /* The output of this file is included */ /* into the C file cdecl.c. */ char cdgramsccsid[] = "@(#)cdgram.y 2.2 3/30/88"; %} %union { char *dynstr; struct { char *left; char *right; char *type; } halves; } %token ARRAY AS CAST COMMA DECLARE DOUBLECOLON EXPLAIN FUNCTION %token HELP INTO OF MEMBER POINTER REFERENCE RETURNING SET TO %token CHAR CLASS CONSTVOLATILE DOUBLE ENUM FLOAT INT LONG NAME %token NUMBER SHORT SIGNED STRUCT UNION UNSIGNED VOID %token AUTO EXTERN REGISTER STATIC %type adecllist adims c_type cast castlist cdecl cdecl1 cdims %type constvol_list ClassStruct mod_list mod_list1 modifier %type opt_constvol_list optNAME opt_storage storage StrClaUniEnum %type tname type %type adecl %start prog %% prog : /* empty */ | prog stmt { prompt(); prev = 0; } ; stmt : HELP NL { Debug((stderr, "stmt: help\n")); dohelp(); } | DECLARE NAME AS opt_storage adecl NL { Debug((stderr, "stmt: DECLARE NAME AS opt_storage adecl\n")); Debug((stderr, "\tNAME='%s'\n", $2)); Debug((stderr, "\topt_storage='%s'\n", $4)); Debug((stderr, "\tacdecl.left='%s'\n", $5.left)); Debug((stderr, "\tacdecl.right='%s'\n", $5.right)); Debug((stderr, "\tacdecl.type='%s'\n", $5.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); dodeclare($2, $4, $5.left, $5.right, $5.type); } | DECLARE opt_storage adecl NL { Debug((stderr, "stmt: DECLARE opt_storage adecl\n")); Debug((stderr, "\topt_storage='%s'\n", $2)); Debug((stderr, "\tacdecl.left='%s'\n", $3.left)); Debug((stderr, "\tacdecl.right='%s'\n", $3.right)); Debug((stderr, "\tacdecl.type='%s'\n", $3.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); dodeclare(NullCP, $2, $3.left, $3.right, $3.type); } | CAST NAME INTO adecl NL { Debug((stderr, "stmt: CAST NAME AS adecl\n")); Debug((stderr, "\tNAME='%s'\n", $2)); Debug((stderr, "\tacdecl.left='%s'\n", $4.left)); Debug((stderr, "\tacdecl.right='%s'\n", $4.right)); Debug((stderr, "\tacdecl.type='%s'\n", $4.type)); docast($2, $4.left, $4.right, $4.type); } | CAST adecl NL { Debug((stderr, "stmt: CAST adecl\n")); Debug((stderr, "\tacdecl.left='%s'\n", $2.left)); Debug((stderr, "\tacdecl.right='%s'\n", $2.right)); Debug((stderr, "\tacdecl.type='%s'\n", $2.type)); docast(NullCP, $2.left, $2.right, $2.type); } | EXPLAIN opt_storage opt_constvol_list type cdecl NL { Debug((stderr, "stmt: EXPLAIN opt_storage opt_constvol_list type cdecl\n")); Debug((stderr, "\topt_storage='%s'\n", $2)); Debug((stderr, "\topt_constvol_list='%s'\n", $3)); Debug((stderr, "\ttype='%s'\n", $4)); Debug((stderr, "\tcdecl='%s'\n", $5)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); dodexplain($2, $3, $4, $5); } | EXPLAIN storage opt_constvol_list cdecl NL { Debug((stderr, "stmt: EXPLAIN storage opt_constvol_list cdecl\n")); Debug((stderr, "\tstorage='%s'\n", $2)); Debug((stderr, "\topt_constvol_list='%s'\n", $3)); Debug((stderr, "\tcdecl='%s'\n", $4)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); dodexplain($2, $3, NullCP, $4); } | EXPLAIN opt_storage constvol_list cdecl NL { Debug((stderr, "stmt: EXPLAIN opt_storage constvol_list cdecl\n")); Debug((stderr, "\topt_storage='%s'\n", $2)); Debug((stderr, "\tconstvol_list='%s'\n", $3)); Debug((stderr, "\tcdecl='%s'\n", $4)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); dodexplain($2, $3, NullCP, $4); } | EXPLAIN '(' opt_constvol_list type cast ')' optNAME NL { Debug((stderr, "stmt: EXPLAIN ( opt_constvol_list type cast ) optNAME\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $3)); Debug((stderr, "\ttype='%s'\n", $4)); Debug((stderr, "\tcast='%s'\n", $5)); Debug((stderr, "\tNAME='%s'\n", $7)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); docexplain($3, $4, $5, $7); } | SET optNAME NL { Debug((stderr, "stmt: SET optNAME\n")); Debug((stderr, "\toptNAME='%s'\n", $2)); doset($2); } | NL | error NL { yyerrok; } ; NL : '\n' { doprompt(); } | ';' { noprompt(); } ; optNAME : NAME { Debug((stderr, "optNAME: NAME\n")); Debug((stderr, "\tNAME='%s'\n", $1)); $$ = $1; } | /* empty */ { Debug((stderr, "optNAME: EMPTY\n")); $$ = ds(unknown_name); } ; cdecl : cdecl1 | '*' opt_constvol_list cdecl { Debug((stderr, "cdecl: * opt_constvol_list cdecl\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $2)); Debug((stderr, "\tcdecl='%s'\n", $3)); $$ = cat($3,$2,ds(strlen($2)?" pointer to ":"pointer to "),NullCP); prev = 'p'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | NAME DOUBLECOLON '*' cdecl { Debug((stderr, "cdecl: NAME DOUBLECOLON '*' cdecl\n")); Debug((stderr, "\tNAME='%s'\n", $1)); Debug((stderr, "\tcdecl='%s'\n", $4)); if (!CplusplusFlag) unsupp("pointer to member of class", NullCP); $$ = cat($4,ds("pointer to member of class "),$1,ds(" "),NullCP); prev = 'p'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '&' opt_constvol_list cdecl { Debug((stderr, "cdecl: & opt_constvol_list cdecl\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $2)); Debug((stderr, "\tcdecl='%s'\n", $3)); if (!CplusplusFlag) unsupp("reference", NullCP); $$ = cat($3,$2,ds(strlen($2)?" reference to ":"reference to "),NullCP); prev = 'r'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } ; cdecl1 : cdecl1 '(' ')' { Debug((stderr, "cdecl1: cdecl1()\n")); Debug((stderr, "\tcdecl1='%s'\n", $1)); $$ = cat($1,ds("function returning "),NullCP); prev = 'f'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | cdecl1 '(' castlist ')' { Debug((stderr, "cdecl1: cdecl1(castlist)\n")); Debug((stderr, "\tcdecl1='%s'\n", $1)); Debug((stderr, "\tcastlist='%s'\n", $3)); $$ = cat($1, ds("function ("), $3, ds(") returning "), NullCP); prev = 'f'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | cdecl1 cdims { Debug((stderr, "cdecl1: cdecl1 cdims\n")); Debug((stderr, "\tcdecl1='%s'\n", $1)); Debug((stderr, "\tcdims='%s'\n", $2)); $$ = cat($1,ds("array "),$2,NullCP); prev = 'a'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '(' cdecl ')' { Debug((stderr, "cdecl1: (cdecl)\n")); Debug((stderr, "\tcdecl='%s'\n", $2)); $$ = $2; /* prev = prev; */ Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | NAME { Debug((stderr, "cdecl1: NAME\n")); Debug((stderr, "\tNAME='%s'\n", $1)); savedname = $1; $$ = ds(""); prev = 'n'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } ; castlist : castlist COMMA castlist { Debug((stderr, "castlist: castlist1, castlist2\n")); Debug((stderr, "\tcastlist1='%s'\n", $1)); Debug((stderr, "\tcastlist2='%s'\n", $3)); $$ = cat($1, ds(", "), $3, NullCP); } | opt_constvol_list type cast { Debug((stderr, "castlist: opt_constvol_list type cast\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $1)); Debug((stderr, "\ttype='%s'\n", $2)); Debug((stderr, "\tcast='%s'\n", $3)); $$ = cat($3, $1, ds(strlen($1) ? " " : ""), $2, NullCP); } | NAME { $$ = $1; } ; adecllist : /* empty */ { Debug((stderr, "adecllist: EMPTY\n")); $$ = ds(""); } | adecllist COMMA adecllist { Debug((stderr, "adecllist: adecllist1, adecllist2\n")); Debug((stderr, "\tadecllist1='%s'\n", $1)); Debug((stderr, "\tadecllist2='%s'\n", $3)); $$ = cat($1, ds(", "), $3, NullCP); } | NAME { Debug((stderr, "adecllist: NAME\n")); Debug((stderr, "\tNAME='%s'\n", $1)); $$ = $1; } | adecl { Debug((stderr, "adecllist: adecl\n")); Debug((stderr, "\tadecl.left='%s'\n", $1.left)); Debug((stderr, "\tadecl.right='%s'\n", $1.right)); Debug((stderr, "\tadecl.type='%s'\n", $1.type)); $$ = cat($1.type, ds(" "), $1.left, $1.right, NullCP); } | NAME AS adecl { Debug((stderr, "adecllist: NAME AS adecl\n")); Debug((stderr, "\tNAME='%s'\n", $1)); Debug((stderr, "\tadecl.left='%s'\n", $3.left)); Debug((stderr, "\tadecl.right='%s'\n", $3.right)); Debug((stderr, "\tadecl.type='%s'\n", $3.type)); $$ = cat($3.type, ds(" "), $3.left, $1, $3.right, NullCP); } ; cast : /* empty */ { Debug((stderr, "cast: EMPTY\n")); $$ = ds(""); /* prev = prev; */ Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '(' ')' { Debug((stderr, "cast: ()\n")); $$ = ds("function returning "); prev = 'f'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '(' cast ')' '(' ')' { Debug((stderr, "cast: (cast)()\n")); Debug((stderr, "\tcast='%s'\n", $2)); $$ = cat($2,ds("function returning "),NullCP); prev = 'f'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '(' cast ')' '(' castlist ')' { Debug((stderr, "cast: (cast)(castlist)\n")); Debug((stderr, "\tcast='%s'\n", $2)); Debug((stderr, "\tcastlist='%s'\n", $5)); $$ = cat($2,ds("function ("),$5,ds(") returning "),NullCP); prev = 'f'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '(' cast ')' { Debug((stderr, "cast: (cast)\n")); Debug((stderr, "\tcast='%s'\n", $2)); $$ = $2; /* prev = prev; */ Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | NAME DOUBLECOLON '*' cast { Debug((stderr, "cast: NAME::*cast\n")); Debug((stderr, "\tcast='%s'\n", $4)); if (!CplusplusFlag) unsupp("pointer to member of class", NullCP); $$ = cat($4,ds("pointer to member of class "),$1,ds(" "),NullCP); prev = 'p'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '*' cast { Debug((stderr, "cast: *cast\n")); Debug((stderr, "\tcast='%s'\n", $2)); $$ = cat($2,ds("pointer to "),NullCP); prev = 'p'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | '&' cast { Debug((stderr, "cast: &cast\n")); Debug((stderr, "\tcast='%s'\n", $2)); if (!CplusplusFlag) unsupp("reference", NullCP); $$ = cat($2,ds("reference to "),NullCP); prev = 'r'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | cast cdims { Debug((stderr, "cast: cast cdims\n")); Debug((stderr, "\tcast='%s'\n", $1)); Debug((stderr, "\tcdims='%s'\n", $2)); $$ = cat($1,ds("array "),$2,NullCP); prev = 'a'; Debug((stderr, "\tprev = '%s'\n", visible(prev))); } ; cdims : '[' ']' { Debug((stderr, "cdims: []\n")); $$ = ds("of "); } | '[' NUMBER ']' { Debug((stderr, "cdims: [NUMBER]\n")); Debug((stderr, "\tNUMBER='%s'\n", $2)); $$ = cat($2,ds(" of "),NullCP); } ; adecl : FUNCTION RETURNING adecl { Debug((stderr, "adecl: FUNCTION RETURNING adecl\n")); Debug((stderr, "\tadecl.left='%s'\n", $3.left)); Debug((stderr, "\tadecl.right='%s'\n", $3.right)); Debug((stderr, "\tadecl.type='%s'\n", $3.type)); if (prev == 'f') unsupp("Function returning function", "function returning pointer to function"); else if (prev=='A' || prev=='a') unsupp("Function returning array", "function returning pointer"); $$.left = $3.left; $$.right = cat(ds("()"),$3.right,NullCP); $$.type = $3.type; prev = 'f'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | FUNCTION '(' adecllist ')' RETURNING adecl { Debug((stderr, "adecl: FUNCTION (adecllist) RETURNING adecl\n")); Debug((stderr, "\tadecllist='%s'\n", $3)); Debug((stderr, "\tadecl.left='%s'\n", $6.left)); Debug((stderr, "\tadecl.right='%s'\n", $6.right)); Debug((stderr, "\tadecl.type='%s'\n", $6.type)); if (prev == 'f') unsupp("Function returning function", "function returning pointer to function"); else if (prev=='A' || prev=='a') unsupp("Function returning array", "function returning pointer"); $$.left = $6.left; $$.right = cat(ds("("),$3,ds(")"),$6.right,NullCP); $$.type = $6.type; prev = 'f'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | ARRAY adims OF adecl { Debug((stderr, "adecl: ARRAY adims OF adecl\n")); Debug((stderr, "\tadims='%s'\n", $2)); Debug((stderr, "\tadecl.left='%s'\n", $4.left)); Debug((stderr, "\tadecl.right='%s'\n", $4.right)); Debug((stderr, "\tadecl.type='%s'\n", $4.type)); if (prev == 'f') unsupp("Array of function", "array of pointer to function"); else if (prev == 'a') unsupp("Inner array of unspecified size", "array of pointer"); else if (prev == 'v') unsupp("Array of void", "pointer to void"); if (arbdims) prev = 'a'; else prev = 'A'; $$.left = $4.left; $$.right = cat($2,$4.right,NullCP); $$.type = $4.type; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | opt_constvol_list POINTER TO adecl { char *op = "", *cp = "", *sp = ""; Debug((stderr, "adecl: opt_constvol_list POINTER TO adecl\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $1)); Debug((stderr, "\tadecl.left='%s'\n", $4.left)); Debug((stderr, "\tadecl.right='%s'\n", $4.right)); Debug((stderr, "\tadecl.type='%s'\n", $4.type)); if (prev == 'a') unsupp("Pointer to array of unspecified dimension", "pointer to object"); if (prev=='a' || prev=='A' || prev=='f') { op = "("; cp = ")"; } if (strlen($1) != 0) sp = " "; $$.left = cat($4.left,ds(op),ds("*"), ds(sp),$1,ds(sp),NullCP); $$.right = cat(ds(cp),$4.right,NullCP); $$.type = $4.type; prev = 'p'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | opt_constvol_list POINTER TO MEMBER OF ClassStruct NAME adecl { char *op = "", *cp = "", *sp = ""; Debug((stderr, "adecl: opt_constvol_list POINTER TO MEMBER OF ClassStruct NAME adecl\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $1)); Debug((stderr, "\tClassStruct='%s'\n", $6)); Debug((stderr, "\tNAME='%s'\n", $7)); Debug((stderr, "\tadecl.left='%s'\n", $8.left)); Debug((stderr, "\tadecl.right='%s'\n", $8.right)); Debug((stderr, "\tadecl.type='%s'\n", $8.type)); if (!CplusplusFlag) unsupp("pointer to member of class", NullCP); if (prev == 'a') unsupp("Pointer to array of unspecified dimension", "pointer to object"); if (prev=='a' || prev=='A' || prev=='f') { op = "("; cp = ")"; } if (strlen($1) != 0) sp = " "; $$.left = cat($8.left,ds(op),$7,ds("::*"), ds(sp),$1,ds(sp),NullCP); $$.right = cat(ds(cp),$8.right,NullCP); $$.type = $8.type; prev = 'p'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | opt_constvol_list REFERENCE TO adecl { char *op = "", *cp = "", *sp = ""; Debug((stderr, "adecl: opt_constvol_list REFERENCE TO adecl\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $1)); Debug((stderr, "\tadecl.left='%s'\n", $4.left)); Debug((stderr, "\tadecl.right='%s'\n", $4.right)); Debug((stderr, "\tadecl.type='%s'\n", $4.type)); if (!CplusplusFlag) unsupp("reference", NullCP); if (prev == 'v') unsupp("Reference to void", "pointer to void"); else if (prev == 'a') unsupp("Reference to array of unspecified dimension", "reference to object"); if (prev=='a' || prev=='A' || prev=='f') { op = "("; cp = ")"; } if (strlen($1) != 0) sp = " "; $$.left = cat($4.left,ds(op),ds("&"), ds(sp),$1,ds(sp),NullCP); $$.right = cat(ds(cp),$4.right,NullCP); $$.type = $4.type; prev = 'r'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } | opt_constvol_list type { Debug((stderr, "adecl: opt_constvol_list type\n")); Debug((stderr, "\topt_constvol_list='%s'\n", $1)); Debug((stderr, "\ttype='%s'\n", $2)); $$.left = ds(""); $$.right = ds(""); $$.type = cat($1,ds(strlen($1)?" ":""),$2,NullCP); if (strcmp($2, "void") == 0) prev = 'v'; else if ((strncmp($2, "struct", 6) == 0) || (strncmp($2, "class", 5) == 0)) prev = 's'; else prev = 't'; Debug((stderr, "\n\tadecl now =\n")); Debug((stderr, "\t\tadecl.left='%s'\n", $$.left)); Debug((stderr, "\t\tadecl.right='%s'\n", $$.right)); Debug((stderr, "\t\tadecl.type='%s'\n", $$.type)); Debug((stderr, "\tprev = '%s'\n", visible(prev))); } ; adims : /* empty */ { Debug((stderr, "adims: EMPTY\n")); arbdims = 1; $$ = ds("[]"); } | NUMBER { Debug((stderr, "adims: NUMBER\n")); Debug((stderr, "\tNUMBER='%s'\n", $1)); arbdims = 0; $$ = cat(ds("["),$1,ds("]"),NullCP); } ; type : tinit c_type { Debug((stderr, "type: tinit c_type\n")); Debug((stderr, "\ttinit=''\n")); Debug((stderr, "\tc_type='%s'\n", $2)); mbcheck(); $$ = $2; } ; tinit : /* empty */ { Debug((stderr, "tinit: EMPTY\n")); modbits = 0; } ; c_type : mod_list { Debug((stderr, "c_type: mod_list\n")); Debug((stderr, "\tmod_list='%s'\n", $1)); $$ = $1; } | tname { Debug((stderr, "c_type: tname\n")); Debug((stderr, "\ttname='%s'\n", $1)); $$ = $1; } | mod_list tname { Debug((stderr, "c_type: mod_list tname\n")); Debug((stderr, "\tmod_list='%s'\n", $1)); Debug((stderr, "\ttname='%s'\n", $2)); $$ = cat($1,ds(" "),$2,NullCP); } | StrClaUniEnum NAME { Debug((stderr, "c_type: StrClaUniEnum NAME\n")); Debug((stderr, "\tStrClaUniEnum='%s'\n", $1)); Debug((stderr, "\tNAME='%s'\n", $2)); $$ = cat($1,ds(" "),$2,NullCP); } ; StrClaUniEnum : ClassStruct | ENUM | UNION { $$ = $1; } ; ClassStruct : STRUCT | CLASS { $$ = $1; } ; tname : INT { Debug((stderr, "tname: INT\n")); Debug((stderr, "\tINT='%s'\n", $1)); modbits |= MB_INT; $$ = $1; } | CHAR { Debug((stderr, "tname: CHAR\n")); Debug((stderr, "\tCHAR='%s'\n", $1)); modbits |= MB_CHAR; $$ = $1; } | FLOAT { Debug((stderr, "tname: FLOAT\n")); Debug((stderr, "\tFLOAT='%s'\n", $1)); modbits |= MB_FLOAT; $$ = $1; } | DOUBLE { Debug((stderr, "tname: DOUBLE\n")); Debug((stderr, "\tDOUBLE='%s'\n", $1)); modbits |= MB_DOUBLE; $$ = $1; } | VOID { Debug((stderr, "tname: VOID\n")); Debug((stderr, "\tVOID='%s'\n", $1)); modbits |= MB_VOID; $$ = $1; } ; mod_list : modifier mod_list1 { Debug((stderr, "mod_list: modifier mod_list1\n")); Debug((stderr, "\tmodifier='%s'\n", $1)); Debug((stderr, "\tmod_list1='%s'\n", $2)); $$ = cat($1,ds(" "),$2,NullCP); } | modifier { Debug((stderr, "mod_list: modifier\n")); Debug((stderr, "\tmodifier='%s'\n", $1)); $$ = $1; } ; mod_list1 : mod_list { Debug((stderr, "mod_list1: mod_list\n")); Debug((stderr, "\tmod_list='%s'\n", $1)); $$ = $1; } | CONSTVOLATILE { Debug((stderr, "mod_list1: CONSTVOLATILE\n")); Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1)); if (PreANSIFlag) notsupported(" (Pre-ANSI Compiler)", $1, NullCP); else if (RitchieFlag) notsupported(" (Ritchie Compiler)", $1, NullCP); else if ((strcmp($1, "noalias") == 0) && CplusplusFlag) unsupp($1, NullCP); $$ = $1; } ; modifier : UNSIGNED { Debug((stderr, "modifier: UNSIGNED\n")); Debug((stderr, "\tUNSIGNED='%s'\n", $1)); modbits |= MB_UNSIGNED; $$ = $1; } | SIGNED { Debug((stderr, "modifier: SIGNED\n")); Debug((stderr, "\tSIGNED='%s'\n", $1)); modbits |= MB_SIGNED; $$ = $1; } | LONG { Debug((stderr, "modifier: LONG\n")); Debug((stderr, "\tLONG='%s'\n", $1)); modbits |= MB_LONG; $$ = $1; } | SHORT { Debug((stderr, "modifier: SHORT\n")); Debug((stderr, "\tSHORT='%s'\n", $1)); modbits |= MB_SHORT; $$ = $1; } ; opt_constvol_list: CONSTVOLATILE opt_constvol_list { Debug((stderr, "opt_constvol_list: CONSTVOLATILE opt_constvol_list\n")); Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1)); Debug((stderr, "\topt_constvol_list='%s'\n", $2)); if (PreANSIFlag) notsupported(" (Pre-ANSI Compiler)", $1, NullCP); else if (RitchieFlag) notsupported(" (Ritchie Compiler)", $1, NullCP); else if ((strcmp($1, "noalias") == 0) && CplusplusFlag) unsupp($1, NullCP); $$ = cat($1,ds(strlen($2) ? " " : ""),$2,NullCP); } | /* empty */ { Debug((stderr, "opt_constvol_list: EMPTY\n")); $$ = ds(""); } ; constvol_list: CONSTVOLATILE opt_constvol_list { Debug((stderr, "constvol_list: CONSTVOLATILE opt_constvol_list\n")); Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1)); Debug((stderr, "\topt_constvol_list='%s'\n", $2)); if (PreANSIFlag) notsupported(" (Pre-ANSI Compiler)", $1, NullCP); else if (RitchieFlag) notsupported(" (Ritchie Compiler)", $1, NullCP); else if ((strcmp($1, "noalias") == 0) && CplusplusFlag) unsupp($1, NullCP); $$ = cat($1,ds(strlen($2) ? " " : ""),$2,NullCP); } ; storage : AUTO | EXTERN | REGISTER | STATIC { Debug((stderr, "storage: AUTO,EXTERN,STATIC,REGISTER (%s)\n", $1)); $$ = $1; } ; opt_storage : storage { Debug((stderr, "opt_storage: storage=%s\n", $1)); $$ = $1; } | /* empty */ { Debug((stderr, "opt_storage: EMPTY\n")); $$ = ds(""); } ; %%