| %{ |
| /* 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 <dynstr> CHAR CLASS CONSTVOLATILE DOUBLE ENUM FLOAT INT LONG NAME |
| %token <dynstr> NUMBER SHORT SIGNED STRUCT UNION UNSIGNED VOID |
| %token <dynstr> AUTO EXTERN REGISTER STATIC |
| %type <dynstr> adecllist adims c_type cast castlist cdecl cdecl1 cdims |
| %type <dynstr> constvol_list ClassStruct mod_list mod_list1 modifier |
| %type <dynstr> opt_constvol_list optNAME opt_storage storage StrClaUniEnum |
| %type <dynstr> tname type |
| %type <halves> 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(""); |
| if (strcmp($2, "void") == 0) |
| prev = 'v'; |
| else if ((strncmp($2, "struct", 6) == 0) || |
| (strncmp($2, "class", 5) == 0)) |
| prev = 's'; |
| else |
| prev = 't'; |
| $$.type = cat($1,ds(strlen($1)?" ":""),$2,NullCP); |
| 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(""); |
| } |
| ; |
| %% |