OSDN Git Service

* sourcebuild.texi (Config Fragments): Use @comma{} in
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-yacc.y
index c705315..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.
 
@@ -39,11 +39,12 @@ 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 GTY_TOKEN
+%token UNION
+%token STRUCT
+%token ENUM
+%token ALIAS
+%token NESTED_PTR
 %token <s>PARAM_IS
 %token NUM
 %token PERCENTPERCENT "%%"
@@ -57,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
 
 %%
 
@@ -212,11 +213,16 @@ struct_fields: { $$ = NULL; }
                    p->line = lexer_line;
                    $$ = p;
                  }
+              | type ':' bitfieldlen ';' struct_fields
+                 { $$ = $5; }
               ;
 
 bitfieldopt: /* empty */
-            | ':' NUM
-            | ':' ID
+            | ':' bitfieldlen
+            ;
+
+bitfieldlen: NUM | ID
+               { }
             ;
 
 type: SCALAR
@@ -268,20 +274,22 @@ type_option : ALIAS
                { $$ = $1; }
              ;
 
-option:        type_option '(' type ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = adjust_field_type ($3, NULL);
-            $$ = o;
-          }
-       | ID '(' STRING ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = (void *)$3;
-            $$ = o;
-          }
+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;
+
+             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
@@ -299,4 +307,17 @@ optionseq: option
 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;
+            }
+          ;
 %%