OSDN Git Service

* sourcebuild.texi (Config Fragments): Use @comma{} in
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-yacc.y
index 43fbea6..449a515 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- indented-text -*- */
 /* Process source files and output type information.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -20,8 +20,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
 %{
-#include "hconfig.h"
+#include "bconfig.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "gengtype.h"
 #define YYERROR_VERBOSE
 %}
@@ -37,12 +39,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 %token <t>ENT_STRUCT
 %token ENT_EXTERNSTATIC
 %token ENT_YACCUNION
-%token GTY_TOKEN "GTY"
-%token UNION "union"
-%token STRUCT "struct"
-%token ENUM "enum"
-%token ALIAS "ptr_alias"
-%token PARAM_IS "param_is"
+%token GTY_TOKEN
+%token UNION
+%token STRUCT
+%token ENUM
+%token ALIAS
+%token NESTED_PTR
+%token <s>PARAM_IS
 %token NUM
 %token PERCENTPERCENT "%%"
 %token <t>SCALAR
@@ -55,7 +58,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 %type <p> struct_fields yacc_ids yacc_typematch
 %type <t> type lasttype
 %type <o> optionsopt options option optionseq optionseqopt
-%type <s> type_option
+%type <s> type_option stringseq
 
 %%
 
@@ -63,6 +66,7 @@ start: /* empty */
        | typedef_struct start
        | externstatic start
        | yacc_union start
+       ;
 
 typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
                   {
@@ -72,6 +76,7 @@ typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
                     lexer_toplevel_done = 1;
                   }
                 ';'
+                  {}
                | ENT_STRUCT options '{' struct_fields '}'
                   {
                     new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
@@ -79,10 +84,12 @@ typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
                     lexer_toplevel_done = 1;
                   }
                 ';'
+                  {}
+               ;
 
 externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
                 {
-                  note_variable ($4, adjust_field_type ($3, $2), $2, 
+                  note_variable ($4, adjust_field_type ($3, $2), $2,
                                  &lexer_line);
                 }
              | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
@@ -96,26 +103,30 @@ externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
                                              $5),
                            $2, &lexer_line);
                 }
+             ;
 
 lasttype: type
-           { 
+           {
              lexer_toplevel_done = 1;
              $$ = $1;
            }
+           ;
 
 semiequal: ';'
           | '='
           ;
 
-yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch PERCENTPERCENT
+yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch
+           PERCENTPERCENT
              {
                note_yacc_type ($2, $3, $5, &lexer_line);
              }
+           ;
 
 yacc_typematch: /* empty */
                   { $$ = NULL; }
                | yacc_typematch PERCENT_ID yacc_ids
-                  { 
+                  {
                     pair_p p;
                     for (p = $3; p->next != NULL; p = p->next)
                       {
@@ -148,7 +159,7 @@ yacc_typematch: /* empty */
 yacc_ids: /* empty */
        { $$ = NULL; }
      | yacc_ids ID
-        { 
+        {
          pair_p p = xcalloc (1, sizeof (*p));
          p->next = $1;
          p->line = lexer_line;
@@ -166,10 +177,10 @@ yacc_ids: /* empty */
          p->opt = xmalloc (sizeof (*(p->opt)));
          p->opt->name = "tag";
          p->opt->next = NULL;
-         p->opt->info = xmalloc (3 + strlen ($2));
-         sprintf (p->opt->info, "'%s'", $2);
+         p->opt->info = xasprintf ("'%s'", $2);
          $$ = p;
        }
+     ;
 
 struct_fields: { $$ = NULL; }
               | type optionsopt ID bitfieldopt ';' struct_fields
@@ -202,9 +213,17 @@ struct_fields: { $$ = NULL; }
                    p->line = lexer_line;
                    $$ = p;
                  }
+              | type ':' bitfieldlen ';' struct_fields
+                 { $$ = $5; }
+              ;
 
 bitfieldopt: /* empty */
-            | ':' NUM
+            | ':' bitfieldlen
+            ;
+
+bitfieldlen: NUM | ID
+               { }
+            ;
 
 type: SCALAR
          { $$ = $1; }
@@ -230,6 +249,7 @@ type: SCALAR
          { $$ = create_scalar_type ($2, strlen ($2)); }
       | ENUM ID '{' enum_items '}'
          { $$ = create_scalar_type ($2, strlen ($2)); }
+      ;
 
 enum_items: /* empty */
            | ID '=' NUM ',' enum_items
@@ -242,28 +262,35 @@ enum_items: /* empty */
 
 optionsopt: { $$ = NULL; }
            | options { $$ = $1; }
+           ;
 
-options: GTY_TOKEN '(' '(' optionseqopt ')' ')' { $$ = $4; }
+options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
+          { $$ = $4; }
+        ;
 
 type_option : ALIAS
                { $$ = "ptr_alias"; }
              | PARAM_IS
-               { $$ = "param_is"; }
+               { $$ = $1; }
+             ;
+
+option:   ID
+           { $$ = create_option ($1, (void *)""); }
+        | ID '(' stringseq ')'
+            { $$ = create_option ($1, (void *)$3); }
+       | type_option '(' type ')'
+           { $$ = create_option ($1, adjust_field_type ($3, NULL)); }
+       | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
+           {
+             struct nested_ptr_data d;
 
-option:        type_option '(' type ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = $3;
-            $$ = o;
-          }
-       | ID '(' STRING ')'
-          { 
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = (void *)$3;
-            $$ = o;
-          }
+             d.type = adjust_field_type ($3, NULL);
+             d.convert_to = $5;
+             d.convert_from = $7;
+             $$ = create_option ("nested_ptr",
+                                 xmemdup (&d, sizeof (d), sizeof (d)));
+           }
+       ;
 
 optionseq: option
              {
@@ -275,8 +302,22 @@ optionseq: option
                $3->next = $1;
                $$ = $3;
              }
+           ;
 
-optionseqopt: { $$ = NULL }
+optionseqopt: { $$ = NULL; }
              | optionseq { $$ = $1; }
+             ;
 
+stringseq: STRING
+            { $$ = $1; }
+          | stringseq STRING
+            {
+              size_t l1 = strlen ($1);
+              size_t l2 = strlen ($2);
+              char *s = xrealloc ((char *)$1, l1 + l2 + 1);
+              memcpy (s + l1, $2, l2 + 1);
+              free ((void *)$2);
+              $$ = s;
+            }
+          ;
 %%