home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d167 / cdecl.lha / CDecl / cdgram.y < prev    next >
Text File  |  1988-11-22  |  23KB  |  856 lines

  1. %{
  2. /* Yacc grammar for ANSI and C++ cdecl. */
  3. /* The output of this file is included */
  4. /* into the C file cdecl.c. */
  5. char cdgramsccsid[] = "@(#)cdgram.y    2.2 3/30/88";
  6. %}
  7.  
  8. %union {
  9.     char *dynstr;
  10.     struct {
  11.         char *left;
  12.         char *right;
  13.         char *type;
  14.     } halves;
  15. }
  16.  
  17. %token ARRAY AS CAST COMMA DECLARE DOUBLECOLON EXPLAIN FUNCTION
  18. %token HELP INTO OF MEMBER POINTER REFERENCE RETURNING SET TO
  19. %token <dynstr> CHAR CLASS CONSTVOLATILE DOUBLE ENUM FLOAT INT LONG NAME
  20. %token <dynstr> NUMBER SHORT SIGNED STRUCT UNION UNSIGNED VOID
  21. %token <dynstr> AUTO EXTERN REGISTER STATIC
  22. %type <dynstr> adecllist adims c_type cast castlist cdecl cdecl1 cdims
  23. %type <dynstr> constvol_list ClassStruct mod_list mod_list1 modifier
  24. %type <dynstr> opt_constvol_list optNAME opt_storage storage StrClaUniEnum
  25. %type <dynstr> tname type
  26. %type <halves> adecl
  27.  
  28. %start prog
  29.  
  30. %%
  31. prog        : /* empty */
  32.         | prog stmt
  33.             {
  34.             prompt();
  35.             prev = 0;
  36.             }
  37.         ;
  38.  
  39. stmt        : HELP NL
  40.             {
  41.             Debug((stderr, "stmt: help\n"));
  42.             dohelp();
  43.             }
  44.  
  45.         | DECLARE NAME AS opt_storage adecl NL
  46.             {
  47.             Debug((stderr, "stmt: DECLARE NAME AS opt_storage adecl\n"));
  48.             Debug((stderr, "\tNAME='%s'\n", $2));
  49.             Debug((stderr, "\topt_storage='%s'\n", $4));
  50.             Debug((stderr, "\tacdecl.left='%s'\n", $5.left));
  51.             Debug((stderr, "\tacdecl.right='%s'\n", $5.right));
  52.             Debug((stderr, "\tacdecl.type='%s'\n", $5.type));
  53.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  54.             dodeclare($2, $4, $5.left, $5.right, $5.type);
  55.             }
  56.  
  57.         | DECLARE opt_storage adecl NL
  58.             {
  59.             Debug((stderr, "stmt: DECLARE opt_storage adecl\n"));
  60.             Debug((stderr, "\topt_storage='%s'\n", $2));
  61.             Debug((stderr, "\tacdecl.left='%s'\n", $3.left));
  62.             Debug((stderr, "\tacdecl.right='%s'\n", $3.right));
  63.             Debug((stderr, "\tacdecl.type='%s'\n", $3.type));
  64.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  65.             dodeclare(NullCP, $2, $3.left, $3.right, $3.type);
  66.             }
  67.  
  68.         | CAST NAME INTO adecl NL
  69.             {
  70.             Debug((stderr, "stmt: CAST NAME AS adecl\n"));
  71.             Debug((stderr, "\tNAME='%s'\n", $2));
  72.             Debug((stderr, "\tacdecl.left='%s'\n", $4.left));
  73.             Debug((stderr, "\tacdecl.right='%s'\n", $4.right));
  74.             Debug((stderr, "\tacdecl.type='%s'\n", $4.type));
  75.             docast($2, $4.left, $4.right, $4.type);
  76.             }
  77.  
  78.         | CAST adecl NL
  79.             {
  80.             Debug((stderr, "stmt: CAST adecl\n"));
  81.             Debug((stderr, "\tacdecl.left='%s'\n", $2.left));
  82.             Debug((stderr, "\tacdecl.right='%s'\n", $2.right));
  83.             Debug((stderr, "\tacdecl.type='%s'\n", $2.type));
  84.             docast(NullCP, $2.left, $2.right, $2.type);
  85.             }
  86.  
  87.         | EXPLAIN opt_storage opt_constvol_list type cdecl NL
  88.             {
  89.             Debug((stderr, "stmt: EXPLAIN opt_storage opt_constvol_list type cdecl\n"));
  90.             Debug((stderr, "\topt_storage='%s'\n", $2));
  91.             Debug((stderr, "\topt_constvol_list='%s'\n", $3));
  92.             Debug((stderr, "\ttype='%s'\n", $4));
  93.             Debug((stderr, "\tcdecl='%s'\n", $5));
  94.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  95.             dodexplain($2, $3, $4, $5);
  96.             }
  97.  
  98.         | EXPLAIN storage opt_constvol_list cdecl NL
  99.             {
  100.             Debug((stderr, "stmt: EXPLAIN storage opt_constvol_list cdecl\n"));
  101.             Debug((stderr, "\tstorage='%s'\n", $2));
  102.             Debug((stderr, "\topt_constvol_list='%s'\n", $3));
  103.             Debug((stderr, "\tcdecl='%s'\n", $4));
  104.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  105.             dodexplain($2, $3, NullCP, $4);
  106.             }
  107.  
  108.         | EXPLAIN opt_storage constvol_list cdecl NL
  109.             {
  110.             Debug((stderr, "stmt: EXPLAIN opt_storage constvol_list cdecl\n"));
  111.             Debug((stderr, "\topt_storage='%s'\n", $2));
  112.             Debug((stderr, "\tconstvol_list='%s'\n", $3));
  113.             Debug((stderr, "\tcdecl='%s'\n", $4));
  114.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  115.             dodexplain($2, $3, NullCP, $4);
  116.             }
  117.  
  118.         | EXPLAIN '(' opt_constvol_list type cast ')' optNAME NL
  119.             {
  120.             Debug((stderr, "stmt: EXPLAIN ( opt_constvol_list type cast ) optNAME\n"));
  121.             Debug((stderr, "\topt_constvol_list='%s'\n", $3));
  122.             Debug((stderr, "\ttype='%s'\n", $4));
  123.             Debug((stderr, "\tcast='%s'\n", $5));
  124.             Debug((stderr, "\tNAME='%s'\n", $7));
  125.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  126.             docexplain($3, $4, $5, $7);
  127.             }
  128.  
  129.         | SET optNAME NL
  130.             {
  131.             Debug((stderr, "stmt: SET optNAME\n"));
  132.             Debug((stderr, "\toptNAME='%s'\n", $2));
  133.             doset($2);
  134.             }
  135.  
  136.         | NL
  137.         | error NL
  138.             {
  139.             yyerrok;
  140.             }
  141.         ;
  142.  
  143. NL        : '\n'
  144.             {
  145.             doprompt();
  146.             }
  147.         | ';'
  148.             {
  149.             noprompt();
  150.             }
  151.         ;
  152.  
  153. optNAME        : NAME
  154.             {
  155.             Debug((stderr, "optNAME: NAME\n"));
  156.             Debug((stderr, "\tNAME='%s'\n", $1));
  157.             $$ = $1;
  158.             }
  159.  
  160.         | /* empty */
  161.             {
  162.             Debug((stderr, "optNAME: EMPTY\n"));
  163.             $$ = ds(unknown_name);
  164.             }
  165.         ;
  166.  
  167. cdecl        : cdecl1
  168.         | '*' opt_constvol_list cdecl
  169.             {
  170.             Debug((stderr, "cdecl: * opt_constvol_list cdecl\n"));
  171.             Debug((stderr, "\topt_constvol_list='%s'\n", $2));
  172.             Debug((stderr, "\tcdecl='%s'\n", $3));
  173.             $$ = cat($3,$2,ds(strlen($2)?" pointer to ":"pointer to "),NullCP);
  174.             prev = 'p';
  175.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  176.             }
  177.  
  178.         | NAME DOUBLECOLON '*' cdecl
  179.             {
  180.             Debug((stderr, "cdecl: NAME DOUBLECOLON '*' cdecl\n"));
  181.             Debug((stderr, "\tNAME='%s'\n", $1));
  182.             Debug((stderr, "\tcdecl='%s'\n", $4));
  183.             if (!CplusplusFlag)
  184.                 unsupp("pointer to member of class", NullCP);
  185.             $$ = cat($4,ds("pointer to member of class "),$1,ds(" "),NullCP);
  186.             prev = 'p';
  187.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  188.             }
  189.  
  190.         | '&' opt_constvol_list cdecl
  191.             {
  192.             Debug((stderr, "cdecl: & opt_constvol_list cdecl\n"));
  193.             Debug((stderr, "\topt_constvol_list='%s'\n", $2));
  194.             Debug((stderr, "\tcdecl='%s'\n", $3));
  195.             if (!CplusplusFlag)
  196.                 unsupp("reference", NullCP);
  197.             $$ = cat($3,$2,ds(strlen($2)?" reference to ":"reference to "),NullCP);
  198.             prev = 'r';
  199.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  200.             }
  201.         ;
  202.  
  203. cdecl1        : cdecl1 '(' ')'
  204.             {
  205.             Debug((stderr, "cdecl1: cdecl1()\n"));
  206.             Debug((stderr, "\tcdecl1='%s'\n", $1));
  207.             $$ = cat($1,ds("function returning "),NullCP);
  208.             prev = 'f';
  209.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  210.             }
  211.  
  212.         | cdecl1 '(' castlist ')'
  213.             {
  214.             Debug((stderr, "cdecl1: cdecl1(castlist)\n"));
  215.             Debug((stderr, "\tcdecl1='%s'\n", $1));
  216.             Debug((stderr, "\tcastlist='%s'\n", $3));
  217.             $$ = cat($1, ds("function ("),
  218.                   $3, ds(") returning "), NullCP);
  219.             prev = 'f';
  220.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  221.             }
  222.  
  223.         | cdecl1 cdims
  224.             {
  225.             Debug((stderr, "cdecl1: cdecl1 cdims\n"));
  226.             Debug((stderr, "\tcdecl1='%s'\n", $1));
  227.             Debug((stderr, "\tcdims='%s'\n", $2));
  228.             $$ = cat($1,ds("array "),$2,NullCP);
  229.             prev = 'a';
  230.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  231.             }
  232.  
  233.         | '(' cdecl ')'
  234.             {
  235.             Debug((stderr, "cdecl1: (cdecl)\n"));
  236.             Debug((stderr, "\tcdecl='%s'\n", $2));
  237.             $$ = $2;
  238.             /* prev = prev; */
  239.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  240.             }
  241.  
  242.         | NAME
  243.             {
  244.             Debug((stderr, "cdecl1: NAME\n"));
  245.             Debug((stderr, "\tNAME='%s'\n", $1));
  246.             savedname = $1;
  247.             $$ = ds("");
  248.             prev = 'n';
  249.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  250.             }
  251.         ;
  252.  
  253. castlist    : castlist COMMA castlist
  254.             {
  255.             Debug((stderr, "castlist: castlist1, castlist2\n"));
  256.             Debug((stderr, "\tcastlist1='%s'\n", $1));
  257.             Debug((stderr, "\tcastlist2='%s'\n", $3));
  258.             $$ = cat($1, ds(", "), $3, NullCP);
  259.             }
  260.  
  261.         | opt_constvol_list type cast
  262.             {
  263.             Debug((stderr, "castlist: opt_constvol_list type cast\n"));
  264.             Debug((stderr, "\topt_constvol_list='%s'\n", $1));
  265.             Debug((stderr, "\ttype='%s'\n", $2));
  266.             Debug((stderr, "\tcast='%s'\n", $3));
  267.             $$ = cat($3, $1, ds(strlen($1) ? " " : ""), $2, NullCP);
  268.             }
  269.  
  270.         | NAME
  271.             {
  272.             $$ = $1;
  273.             }
  274.         ;
  275.  
  276. adecllist    : /* empty */
  277.             {
  278.             Debug((stderr, "adecllist: EMPTY\n"));
  279.             $$ = ds("");
  280.             }
  281.  
  282.         | adecllist COMMA adecllist
  283.             {
  284.             Debug((stderr, "adecllist: adecllist1, adecllist2\n"));
  285.             Debug((stderr, "\tadecllist1='%s'\n", $1));
  286.             Debug((stderr, "\tadecllist2='%s'\n", $3));
  287.             $$ = cat($1, ds(", "), $3, NullCP);
  288.             }
  289.  
  290.         | NAME
  291.             {
  292.             Debug((stderr, "adecllist: NAME\n"));
  293.             Debug((stderr, "\tNAME='%s'\n", $1));
  294.             $$ = $1;
  295.             }
  296.  
  297.         | adecl
  298.             {
  299.             Debug((stderr, "adecllist: adecl\n"));
  300.             Debug((stderr, "\tadecl.left='%s'\n", $1.left));
  301.             Debug((stderr, "\tadecl.right='%s'\n", $1.right));
  302.             Debug((stderr, "\tadecl.type='%s'\n", $1.type));
  303.             $$ = cat($1.type, ds(" "), $1.left, $1.right, NullCP);
  304.             }
  305.  
  306.         | NAME AS adecl
  307.             {
  308.             Debug((stderr, "adecllist: NAME AS adecl\n"));
  309.             Debug((stderr, "\tNAME='%s'\n", $1));
  310.             Debug((stderr, "\tadecl.left='%s'\n", $3.left));
  311.             Debug((stderr, "\tadecl.right='%s'\n", $3.right));
  312.             Debug((stderr, "\tadecl.type='%s'\n", $3.type));
  313.             $$ = cat($3.type, ds(" "), $3.left, $1, $3.right, NullCP);
  314.             }
  315.         ;
  316.  
  317. cast        : /* empty */
  318.             {
  319.             Debug((stderr, "cast: EMPTY\n"));
  320.             $$ = ds("");
  321.             /* prev = prev; */
  322.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  323.             }
  324.  
  325.         | '(' ')'
  326.             {
  327.             Debug((stderr, "cast: ()\n"));
  328.             $$ = ds("function returning ");
  329.             prev = 'f';
  330.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  331.             }
  332.  
  333.         | '(' cast ')' '(' ')'
  334.             {
  335.             Debug((stderr, "cast: (cast)()\n"));
  336.             Debug((stderr, "\tcast='%s'\n", $2));
  337.             $$ = cat($2,ds("function returning "),NullCP);
  338.             prev = 'f';
  339.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  340.             }
  341.  
  342.         | '(' cast ')' '(' castlist ')'
  343.             {
  344.             Debug((stderr, "cast: (cast)(castlist)\n"));
  345.             Debug((stderr, "\tcast='%s'\n", $2));
  346.             Debug((stderr, "\tcastlist='%s'\n", $5));
  347.             $$ = cat($2,ds("function ("),$5,ds(") returning "),NullCP);
  348.             prev = 'f';
  349.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  350.             }
  351.  
  352.         | '(' cast ')'
  353.             {
  354.             Debug((stderr, "cast: (cast)\n"));
  355.             Debug((stderr, "\tcast='%s'\n", $2));
  356.             $$ = $2;
  357.             /* prev = prev; */
  358.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  359.             }
  360.  
  361.         | NAME DOUBLECOLON '*' cast
  362.             {
  363.             Debug((stderr, "cast: NAME::*cast\n"));
  364.             Debug((stderr, "\tcast='%s'\n", $4));
  365.             if (!CplusplusFlag)
  366.                 unsupp("pointer to member of class", NullCP);
  367.             $$ = cat($4,ds("pointer to member of class "),$1,ds(" "),NullCP);
  368.             prev = 'p';
  369.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  370.             }
  371.  
  372.         | '*' cast
  373.             {
  374.             Debug((stderr, "cast: *cast\n"));
  375.             Debug((stderr, "\tcast='%s'\n", $2));
  376.             $$ = cat($2,ds("pointer to "),NullCP);
  377.             prev = 'p';
  378.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  379.             }
  380.  
  381.         | '&' cast
  382.             {
  383.             Debug((stderr, "cast: &cast\n"));
  384.             Debug((stderr, "\tcast='%s'\n", $2));
  385.             if (!CplusplusFlag)
  386.                 unsupp("reference", NullCP);
  387.             $$ = cat($2,ds("reference to "),NullCP);
  388.             prev = 'r';
  389.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  390.             }
  391.  
  392.         | cast cdims
  393.             {
  394.             Debug((stderr, "cast: cast cdims\n"));
  395.             Debug((stderr, "\tcast='%s'\n", $1));
  396.             Debug((stderr, "\tcdims='%s'\n", $2));
  397.             $$ = cat($1,ds("array "),$2,NullCP);
  398.             prev = 'a';
  399.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  400.             }
  401.         ;
  402.  
  403. cdims        : '[' ']'
  404.             {
  405.             Debug((stderr, "cdims: []\n"));
  406.             $$ = ds("of ");
  407.             }
  408.  
  409.         | '[' NUMBER ']'
  410.             {
  411.             Debug((stderr, "cdims: [NUMBER]\n"));
  412.             Debug((stderr, "\tNUMBER='%s'\n", $2));
  413.             $$ = cat($2,ds(" of "),NullCP);
  414.             }
  415.         ;
  416.  
  417. adecl        : FUNCTION RETURNING adecl
  418.             {
  419.             Debug((stderr, "adecl: FUNCTION RETURNING adecl\n"));
  420.             Debug((stderr, "\tadecl.left='%s'\n", $3.left));
  421.             Debug((stderr, "\tadecl.right='%s'\n", $3.right));
  422.             Debug((stderr, "\tadecl.type='%s'\n", $3.type));
  423.             if (prev == 'f')
  424.                 unsupp("Function returning function",
  425.                        "function returning pointer to function");
  426.             else if (prev=='A' || prev=='a')
  427.                 unsupp("Function returning array",
  428.                        "function returning pointer");
  429.             $$.left = $3.left;
  430.             $$.right = cat(ds("()"),$3.right,NullCP);
  431.             $$.type = $3.type;
  432.             prev = 'f';
  433.             Debug((stderr, "\n\tadecl now =\n"));
  434.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  435.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  436.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  437.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  438.             }
  439.  
  440.         | FUNCTION '(' adecllist ')' RETURNING adecl
  441.             {
  442.             Debug((stderr, "adecl: FUNCTION (adecllist) RETURNING adecl\n"));
  443.             Debug((stderr, "\tadecllist='%s'\n", $3));
  444.             Debug((stderr, "\tadecl.left='%s'\n", $6.left));
  445.             Debug((stderr, "\tadecl.right='%s'\n", $6.right));
  446.             Debug((stderr, "\tadecl.type='%s'\n", $6.type));
  447.             if (prev == 'f')
  448.                 unsupp("Function returning function",
  449.                        "function returning pointer to function");
  450.             else if (prev=='A' || prev=='a')
  451.                 unsupp("Function returning array",
  452.                        "function returning pointer");
  453.             $$.left = $6.left;
  454.             $$.right = cat(ds("("),$3,ds(")"),$6.right,NullCP);
  455.             $$.type = $6.type;
  456.             prev = 'f';
  457.             Debug((stderr, "\n\tadecl now =\n"));
  458.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  459.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  460.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  461.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  462.             }
  463.  
  464.         | ARRAY adims OF adecl
  465.             {
  466.             Debug((stderr, "adecl: ARRAY adims OF adecl\n"));
  467.             Debug((stderr, "\tadims='%s'\n", $2));
  468.             Debug((stderr, "\tadecl.left='%s'\n", $4.left));
  469.             Debug((stderr, "\tadecl.right='%s'\n", $4.right));
  470.             Debug((stderr, "\tadecl.type='%s'\n", $4.type));
  471.             if (prev == 'f')
  472.                 unsupp("Array of function",
  473.                        "array of pointer to function");
  474.             else if (prev == 'a')
  475.                 unsupp("Inner array of unspecified size",
  476.                        "array of pointer");
  477.             else if (prev == 'v')
  478.                 unsupp("Array of void",
  479.                        "pointer to void");
  480.             if (arbdims)
  481.                 prev = 'a';
  482.             else
  483.                 prev = 'A';
  484.             $$.left = $4.left;
  485.             $$.right = cat($2,$4.right,NullCP);
  486.             $$.type = $4.type;
  487.             Debug((stderr, "\n\tadecl now =\n"));
  488.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  489.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  490.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  491.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  492.             }
  493.  
  494.         | opt_constvol_list POINTER TO adecl
  495.             {
  496.             char *op = "", *cp = "", *sp = "";
  497.  
  498.             Debug((stderr, "adecl: opt_constvol_list POINTER TO adecl\n"));
  499.             Debug((stderr, "\topt_constvol_list='%s'\n", $1));
  500.             Debug((stderr, "\tadecl.left='%s'\n", $4.left));
  501.             Debug((stderr, "\tadecl.right='%s'\n", $4.right));
  502.             Debug((stderr, "\tadecl.type='%s'\n", $4.type));
  503.             if (prev == 'a')
  504.                 unsupp("Pointer to array of unspecified dimension",
  505.                        "pointer to object");
  506.             if (prev=='a' || prev=='A' || prev=='f') {
  507.                 op = "(";
  508.                 cp = ")";
  509.             }
  510.             if (strlen($1) != 0)
  511.                 sp = " ";
  512.             $$.left = cat($4.left,ds(op),ds("*"),
  513.                        ds(sp),$1,ds(sp),NullCP);
  514.             $$.right = cat(ds(cp),$4.right,NullCP);
  515.             $$.type = $4.type;
  516.             prev = 'p';
  517.             Debug((stderr, "\n\tadecl now =\n"));
  518.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  519.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  520.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  521.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  522.             }
  523.  
  524.         | opt_constvol_list POINTER TO MEMBER OF ClassStruct NAME adecl
  525.             {
  526.             char *op = "", *cp = "", *sp = "";
  527.  
  528.             Debug((stderr, "adecl: opt_constvol_list POINTER TO MEMBER OF ClassStruct NAME adecl\n"));
  529.             Debug((stderr, "\topt_constvol_list='%s'\n", $1));
  530.             Debug((stderr, "\tClassStruct='%s'\n", $6));
  531.             Debug((stderr, "\tNAME='%s'\n", $7));
  532.             Debug((stderr, "\tadecl.left='%s'\n", $8.left));
  533.             Debug((stderr, "\tadecl.right='%s'\n", $8.right));
  534.             Debug((stderr, "\tadecl.type='%s'\n", $8.type));
  535.             if (!CplusplusFlag)
  536.                 unsupp("pointer to member of class", NullCP);
  537.             if (prev == 'a')
  538.                 unsupp("Pointer to array of unspecified dimension",
  539.                        "pointer to object");
  540.             if (prev=='a' || prev=='A' || prev=='f') {
  541.                 op = "(";
  542.                 cp = ")";
  543.             }
  544.             if (strlen($1) != 0)
  545.                 sp = " ";
  546.             $$.left = cat($8.left,ds(op),$7,ds("::*"),
  547.                       ds(sp),$1,ds(sp),NullCP);
  548.             $$.right = cat(ds(cp),$8.right,NullCP);
  549.             $$.type = $8.type;
  550.             prev = 'p';
  551.             Debug((stderr, "\n\tadecl now =\n"));
  552.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  553.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  554.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  555.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  556.             }
  557.  
  558.         | opt_constvol_list REFERENCE TO adecl
  559.             {
  560.             char *op = "", *cp = "", *sp = "";
  561.  
  562.             Debug((stderr, "adecl: opt_constvol_list REFERENCE TO adecl\n"));
  563.             Debug((stderr, "\topt_constvol_list='%s'\n", $1));
  564.             Debug((stderr, "\tadecl.left='%s'\n", $4.left));
  565.             Debug((stderr, "\tadecl.right='%s'\n", $4.right));
  566.             Debug((stderr, "\tadecl.type='%s'\n", $4.type));
  567.             if (!CplusplusFlag)
  568.                 unsupp("reference", NullCP);
  569.             if (prev == 'v')
  570.                 unsupp("Reference to void",
  571.                        "pointer to void");
  572.             else if (prev == 'a')
  573.                 unsupp("Reference to array of unspecified dimension",
  574.                        "reference to object");
  575.             if (prev=='a' || prev=='A' || prev=='f') {
  576.                 op = "(";
  577.                 cp = ")";
  578.             }
  579.             if (strlen($1) != 0)
  580.                 sp = " ";
  581.             $$.left = cat($4.left,ds(op),ds("&"),
  582.                        ds(sp),$1,ds(sp),NullCP);
  583.             $$.right = cat(ds(cp),$4.right,NullCP);
  584.             $$.type = $4.type;
  585.             prev = 'r';
  586.             Debug((stderr, "\n\tadecl now =\n"));
  587.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  588.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  589.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  590.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  591.             }
  592.  
  593.         | opt_constvol_list type
  594.             {
  595.             Debug((stderr, "adecl: opt_constvol_list type\n"));
  596.             Debug((stderr, "\topt_constvol_list='%s'\n", $1));
  597.             Debug((stderr, "\ttype='%s'\n", $2));
  598.             $$.left = ds("");
  599.             $$.right = ds("");
  600.             $$.type = cat($1,ds(strlen($1)?" ":""),$2,NullCP);
  601.             if (strcmp($2, "void") == 0)
  602.                 prev = 'v';
  603.             else if ((strncmp($2, "struct", 6) == 0) ||
  604.                      (strncmp($2, "class", 5) == 0))
  605.                 prev = 's';
  606.             else
  607.                 prev = 't';
  608.             Debug((stderr, "\n\tadecl now =\n"));
  609.             Debug((stderr, "\t\tadecl.left='%s'\n", $$.left));
  610.             Debug((stderr, "\t\tadecl.right='%s'\n", $$.right));
  611.             Debug((stderr, "\t\tadecl.type='%s'\n", $$.type));
  612.             Debug((stderr, "\tprev = '%s'\n", visible(prev)));
  613.             }
  614.         ;
  615.  
  616. adims        : /* empty */
  617.             {
  618.             Debug((stderr, "adims: EMPTY\n"));
  619.             arbdims = 1;
  620.             $$ = ds("[]");
  621.             }
  622.  
  623.         | NUMBER
  624.             {
  625.             Debug((stderr, "adims: NUMBER\n"));
  626.             Debug((stderr, "\tNUMBER='%s'\n", $1));
  627.             arbdims = 0;
  628.             $$ = cat(ds("["),$1,ds("]"),NullCP);
  629.             }
  630.         ;
  631.  
  632. type        : tinit c_type
  633.             {
  634.             Debug((stderr, "type: tinit c_type\n"));
  635.             Debug((stderr, "\ttinit=''\n"));
  636.             Debug((stderr, "\tc_type='%s'\n", $2));
  637.             mbcheck();
  638.             $$ = $2;
  639.             }
  640.         ;
  641.  
  642. tinit        : /* empty */
  643.             {
  644.             Debug((stderr, "tinit: EMPTY\n"));
  645.             modbits = 0;
  646.             }
  647.         ;
  648.  
  649. c_type        : mod_list
  650.             {
  651.             Debug((stderr, "c_type: mod_list\n"));
  652.             Debug((stderr, "\tmod_list='%s'\n", $1));
  653.             $$ = $1;
  654.             }
  655.  
  656.         | tname
  657.             {
  658.             Debug((stderr, "c_type: tname\n"));
  659.             Debug((stderr, "\ttname='%s'\n", $1));
  660.             $$ = $1;
  661.             }
  662.  
  663.         | mod_list tname
  664.             {
  665.             Debug((stderr, "c_type: mod_list tname\n"));
  666.             Debug((stderr, "\tmod_list='%s'\n", $1));
  667.             Debug((stderr, "\ttname='%s'\n", $2));
  668.             $$ = cat($1,ds(" "),$2,NullCP);
  669.             }
  670.  
  671.         | StrClaUniEnum NAME
  672.             {
  673.             Debug((stderr, "c_type: StrClaUniEnum NAME\n"));
  674.             Debug((stderr, "\tStrClaUniEnum='%s'\n", $1));
  675.             Debug((stderr, "\tNAME='%s'\n", $2));
  676.             $$ = cat($1,ds(" "),$2,NullCP);
  677.             }
  678.         ;
  679.  
  680. StrClaUniEnum    : ClassStruct
  681.         | ENUM
  682.         | UNION
  683.             {
  684.             $$ = $1;
  685.             }
  686.         ;
  687.  
  688. ClassStruct    : STRUCT
  689.         | CLASS
  690.             {
  691.             $$ = $1;
  692.             }
  693.         ;
  694.  
  695. tname        : INT
  696.             {
  697.             Debug((stderr, "tname: INT\n"));
  698.             Debug((stderr, "\tINT='%s'\n", $1));
  699.             modbits |= MB_INT; $$ = $1;
  700.             }
  701.  
  702.         | CHAR
  703.             {
  704.             Debug((stderr, "tname: CHAR\n"));
  705.             Debug((stderr, "\tCHAR='%s'\n", $1));
  706.             modbits |= MB_CHAR; $$ = $1;
  707.             }
  708.  
  709.         | FLOAT
  710.             {
  711.             Debug((stderr, "tname: FLOAT\n"));
  712.             Debug((stderr, "\tFLOAT='%s'\n", $1));
  713.             modbits |= MB_FLOAT; $$ = $1;
  714.             }
  715.  
  716.         | DOUBLE
  717.             {
  718.             Debug((stderr, "tname: DOUBLE\n"));
  719.             Debug((stderr, "\tDOUBLE='%s'\n", $1));
  720.             modbits |= MB_DOUBLE; $$ = $1;
  721.             }
  722.  
  723.         | VOID
  724.             {
  725.             Debug((stderr, "tname: VOID\n"));
  726.             Debug((stderr, "\tVOID='%s'\n", $1));
  727.             modbits |= MB_VOID; $$ = $1;
  728.             }
  729.         ;
  730.  
  731. mod_list    : modifier mod_list1
  732.             {
  733.             Debug((stderr, "mod_list: modifier mod_list1\n"));
  734.             Debug((stderr, "\tmodifier='%s'\n", $1));
  735.             Debug((stderr, "\tmod_list1='%s'\n", $2));
  736.             $$ = cat($1,ds(" "),$2,NullCP);
  737.             }
  738.  
  739.         | modifier
  740.             {
  741.             Debug((stderr, "mod_list: modifier\n"));
  742.             Debug((stderr, "\tmodifier='%s'\n", $1));
  743.             $$ = $1;
  744.             }
  745.         ;
  746.  
  747. mod_list1    : mod_list
  748.             {
  749.             Debug((stderr, "mod_list1: mod_list\n"));
  750.             Debug((stderr, "\tmod_list='%s'\n", $1));
  751.             $$ = $1;
  752.             }
  753.  
  754.         | CONSTVOLATILE
  755.             {
  756.             Debug((stderr, "mod_list1: CONSTVOLATILE\n"));
  757.             Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1));
  758.             if (PreANSIFlag)
  759.                 notsupported(" (Pre-ANSI Compiler)", $1, NullCP);
  760.             else if (RitchieFlag)
  761.                 notsupported(" (Ritchie Compiler)", $1, NullCP);
  762.             else if ((strcmp($1, "noalias") == 0) && CplusplusFlag)
  763.                 unsupp($1, NullCP);
  764.             $$ = $1;
  765.             }
  766.         ;
  767.  
  768. modifier    : UNSIGNED
  769.             {
  770.             Debug((stderr, "modifier: UNSIGNED\n"));
  771.             Debug((stderr, "\tUNSIGNED='%s'\n", $1));
  772.             modbits |= MB_UNSIGNED; $$ = $1;
  773.             }
  774.  
  775.         | SIGNED
  776.             {
  777.             Debug((stderr, "modifier: SIGNED\n"));
  778.             Debug((stderr, "\tSIGNED='%s'\n", $1));
  779.             modbits |= MB_SIGNED; $$ = $1;
  780.             }
  781.  
  782.         | LONG
  783.             {
  784.             Debug((stderr, "modifier: LONG\n"));
  785.             Debug((stderr, "\tLONG='%s'\n", $1));
  786.             modbits |= MB_LONG; $$ = $1;
  787.             }
  788.  
  789.         | SHORT
  790.             {
  791.             Debug((stderr, "modifier: SHORT\n"));
  792.             Debug((stderr, "\tSHORT='%s'\n", $1));
  793.             modbits |= MB_SHORT; $$ = $1;
  794.             }
  795.         ;
  796.  
  797. opt_constvol_list: CONSTVOLATILE opt_constvol_list
  798.             {
  799.             Debug((stderr, "opt_constvol_list: CONSTVOLATILE opt_constvol_list\n"));
  800.             Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1));
  801.             Debug((stderr, "\topt_constvol_list='%s'\n", $2));
  802.             if (PreANSIFlag)
  803.                 notsupported(" (Pre-ANSI Compiler)", $1, NullCP);
  804.             else if (RitchieFlag)
  805.                 notsupported(" (Ritchie Compiler)", $1, NullCP);
  806.             else if ((strcmp($1, "noalias") == 0) && CplusplusFlag)
  807.                 unsupp($1, NullCP);
  808.             $$ = cat($1,ds(strlen($2) ? " " : ""),$2,NullCP);
  809.             }
  810.  
  811.         | /* empty */
  812.             {
  813.             Debug((stderr, "opt_constvol_list: EMPTY\n"));
  814.             $$ = ds("");
  815.             }
  816.         ;
  817.  
  818. constvol_list: CONSTVOLATILE opt_constvol_list
  819.             {
  820.             Debug((stderr, "constvol_list: CONSTVOLATILE opt_constvol_list\n"));
  821.             Debug((stderr, "\tCONSTVOLATILE='%s'\n", $1));
  822.             Debug((stderr, "\topt_constvol_list='%s'\n", $2));
  823.             if (PreANSIFlag)
  824.                 notsupported(" (Pre-ANSI Compiler)", $1, NullCP);
  825.             else if (RitchieFlag)
  826.                 notsupported(" (Ritchie Compiler)", $1, NullCP);
  827.             else if ((strcmp($1, "noalias") == 0) && CplusplusFlag)
  828.                 unsupp($1, NullCP);
  829.             $$ = cat($1,ds(strlen($2) ? " " : ""),$2,NullCP);
  830.             }
  831.         ;
  832.  
  833. storage        : AUTO
  834.         | EXTERN
  835.         | REGISTER
  836.         | STATIC
  837.             {
  838.             Debug((stderr, "storage: AUTO,EXTERN,STATIC,REGISTER (%s)\n", $1));
  839.             $$ = $1;
  840.             }
  841.         ;
  842.  
  843. opt_storage    : storage
  844.             {
  845.             Debug((stderr, "opt_storage: storage=%s\n", $1));
  846.             $$ = $1;
  847.             }
  848.  
  849.         | /* empty */
  850.             {
  851.             Debug((stderr, "opt_storage: EMPTY\n"));
  852.             $$ = ds("");
  853.             }
  854.         ;
  855. %%
  856.