OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [gengtype-yacc.y] - Diff between revs 154 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 154 Rev 816
/* -*- indented-text -*- */
/* -*- indented-text -*- */
/* Process source files and output type information.
/* Process source files and output type information.
   Copyright (C) 2002, 2004, 2007 Free Software Foundation, Inc.
   Copyright (C) 2002, 2004, 2007 Free Software Foundation, Inc.
This file is part of GCC.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
Software Foundation; either version 3, or (at your option) any later
version.
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
along with GCC; see the file COPYING3.  If not see
.  */
.  */
%{
%{
#include "bconfig.h"
#include "bconfig.h"
#include "system.h"
#include "system.h"
#include "coretypes.h"
#include "coretypes.h"
#include "tm.h"
#include "tm.h"
#include "gengtype.h"
#include "gengtype.h"
#define YYERROR_VERBOSE
#define YYERROR_VERBOSE
%}
%}
%union {
%union {
  type_p t;
  type_p t;
  pair_p p;
  pair_p p;
  options_p o;
  options_p o;
  const char *s;
  const char *s;
}
}
%token ENT_TYPEDEF_STRUCT
%token ENT_TYPEDEF_STRUCT
%token ENT_STRUCT
%token ENT_STRUCT
%token ENT_EXTERNSTATIC
%token ENT_EXTERNSTATIC
%token ENT_YACCUNION
%token ENT_YACCUNION
%token GTY_TOKEN
%token GTY_TOKEN
%token UNION
%token UNION
%token STRUCT
%token STRUCT
%token ENUM
%token ENUM
%token ALIAS
%token ALIAS
%token NESTED_PTR
%token NESTED_PTR
%token PARAM_IS
%token PARAM_IS
%token NUM
%token NUM
%token PERCENTPERCENT "%%"
%token PERCENTPERCENT "%%"
%token SCALAR
%token SCALAR
%token ID
%token ID
%token STRING
%token STRING
%token ARRAY
%token ARRAY
%token PERCENT_ID
%token PERCENT_ID
%token CHAR
%token CHAR
%type 

struct_fields yacc_ids yacc_typematch

%type 

struct_fields yacc_ids yacc_typematch

%type  type lasttype
%type  type lasttype
%type  optionsopt options option optionseq optionseqopt
%type  optionsopt options option optionseq optionseqopt
%type  type_option stringseq
%type  type_option stringseq
%%
%%
start: /* empty */
start: /* empty */
       | typedef_struct start
       | typedef_struct start
       | externstatic start
       | externstatic start
       | yacc_union start
       | yacc_union start
       ;
       ;
typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
                   {
                   {
                     new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
                     new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
                                    $4, $2);
                                    $4, $2);
                     do_typedef ($6, $1, &lexer_line);
                     do_typedef ($6, $1, &lexer_line);
                     lexer_toplevel_done = 1;
                     lexer_toplevel_done = 1;
                   }
                   }
                 ';'
                 ';'
                   {}
                   {}
                | ENT_STRUCT options '{' struct_fields '}'
                | ENT_STRUCT options '{' struct_fields '}'
                   {
                   {
                     new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
                     new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
                                    $4, $2);
                                    $4, $2);
                     lexer_toplevel_done = 1;
                     lexer_toplevel_done = 1;
                   }
                   }
                 ';'
                 ';'
                   {}
                   {}
                ;
                ;
externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
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);
                                  &lexer_line);
                 }
                 }
              | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
              | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
                 {
                 {
                   note_variable ($4, create_array ($3, $5),
                   note_variable ($4, create_array ($3, $5),
                            $2, &lexer_line);
                            $2, &lexer_line);
                 }
                 }
              | ENT_EXTERNSTATIC options lasttype ID ARRAY ARRAY semiequal
              | ENT_EXTERNSTATIC options lasttype ID ARRAY ARRAY semiequal
                 {
                 {
                   note_variable ($4, create_array (create_array ($3, $6),
                   note_variable ($4, create_array (create_array ($3, $6),
                                              $5),
                                              $5),
                            $2, &lexer_line);
                            $2, &lexer_line);
                 }
                 }
              ;
              ;
lasttype: type
lasttype: type
            {
            {
              lexer_toplevel_done = 1;
              lexer_toplevel_done = 1;
              $$ = $1;
              $$ = $1;
            }
            }
            ;
            ;
semiequal: ';'
semiequal: ';'
           | '='
           | '='
           ;
           ;
yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch
yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch
            PERCENTPERCENT
            PERCENTPERCENT
              {
              {
                note_yacc_type ($2, $3, $5, &lexer_line);
                note_yacc_type ($2, $3, $5, &lexer_line);
              }
              }
            ;
            ;
yacc_typematch: /* empty */
yacc_typematch: /* empty */
                   { $$ = NULL; }
                   { $$ = NULL; }
                | yacc_typematch PERCENT_ID yacc_ids
                | yacc_typematch PERCENT_ID yacc_ids
                   {
                   {
                     pair_p p;
                     pair_p p;
                     for (p = $3; p->next != NULL; p = p->next)
                     for (p = $3; p->next != NULL; p = p->next)
                       {
                       {
                         p->name = NULL;
                         p->name = NULL;
                         p->type = NULL;
                         p->type = NULL;
                       }
                       }
                     p->name = NULL;
                     p->name = NULL;
                     p->type = NULL;
                     p->type = NULL;
                     p->next = $1;
                     p->next = $1;
                     $$ = $3;
                     $$ = $3;
                   }
                   }
                | yacc_typematch PERCENT_ID '<' ID '>' yacc_ids
                | yacc_typematch PERCENT_ID '<' ID '>' yacc_ids
                   {
                   {
                     pair_p p;
                     pair_p p;
                     type_p newtype = NULL;
                     type_p newtype = NULL;
                     if (strcmp ($2, "type") == 0)
                     if (strcmp ($2, "type") == 0)
                       newtype = (type_p) 1;
                       newtype = (type_p) 1;
                     for (p = $6; p->next != NULL; p = p->next)
                     for (p = $6; p->next != NULL; p = p->next)
                       {
                       {
                         p->name = $4;
                         p->name = $4;
                         p->type = newtype;
                         p->type = newtype;
                       }
                       }
                     p->name = $4;
                     p->name = $4;
                     p->next = $1;
                     p->next = $1;
                     p->type = newtype;
                     p->type = newtype;
                     $$ = $6;
                     $$ = $6;
                   }
                   }
                ;
                ;
yacc_ids: /* empty */
yacc_ids: /* empty */
        { $$ = NULL; }
        { $$ = NULL; }
     | yacc_ids ID
     | yacc_ids ID
        {
        {
          pair_p p = XCNEW (struct pair);
          pair_p p = XCNEW (struct pair);
          p->next = $1;
          p->next = $1;
          p->line = lexer_line;
          p->line = lexer_line;
          p->opt = XNEW (struct options);
          p->opt = XNEW (struct options);
          p->opt->name = "tag";
          p->opt->name = "tag";
          p->opt->next = NULL;
          p->opt->next = NULL;
          p->opt->info = (char *)$2;
          p->opt->info = (char *)$2;
          $$ = p;
          $$ = p;
        }
        }
     | yacc_ids CHAR
     | yacc_ids CHAR
        {
        {
          pair_p p = XCNEW (struct pair);
          pair_p p = XCNEW (struct pair);
          p->next = $1;
          p->next = $1;
          p->line = lexer_line;
          p->line = lexer_line;
          p->opt = XNEW (struct options);
          p->opt = XNEW (struct options);
          p->opt->name = "tag";
          p->opt->name = "tag";
          p->opt->next = NULL;
          p->opt->next = NULL;
          p->opt->info = xasprintf ("'%s'", $2);
          p->opt->info = xasprintf ("'%s'", $2);
          $$ = p;
          $$ = p;
        }
        }
     ;
     ;
struct_fields: { $$ = NULL; }
struct_fields: { $$ = NULL; }
               | type optionsopt ID bitfieldopt ';' struct_fields
               | type optionsopt ID bitfieldopt ';' struct_fields
                  {
                  {
                    pair_p p = XNEW (struct pair);
                    pair_p p = XNEW (struct pair);
                    p->type = adjust_field_type ($1, $2);
                    p->type = adjust_field_type ($1, $2);
                    p->opt = $2;
                    p->opt = $2;
                    p->name = $3;
                    p->name = $3;
                    p->next = $6;
                    p->next = $6;
                    p->line = lexer_line;
                    p->line = lexer_line;
                    $$ = p;
                    $$ = p;
                  }
                  }
               | type optionsopt ID ARRAY ';' struct_fields
               | type optionsopt ID ARRAY ';' struct_fields
                  {
                  {
                    pair_p p = XNEW (struct pair);
                    pair_p p = XNEW (struct pair);
                    p->type = adjust_field_type (create_array ($1, $4), $2);
                    p->type = adjust_field_type (create_array ($1, $4), $2);
                    p->opt = $2;
                    p->opt = $2;
                    p->name = $3;
                    p->name = $3;
                    p->next = $6;
                    p->next = $6;
                    p->line = lexer_line;
                    p->line = lexer_line;
                    $$ = p;
                    $$ = p;
                  }
                  }
               | type optionsopt ID ARRAY ARRAY ';' struct_fields
               | type optionsopt ID ARRAY ARRAY ';' struct_fields
                  {
                  {
                    pair_p p = XNEW (struct pair);
                    pair_p p = XNEW (struct pair);
                    p->type = create_array (create_array ($1, $5), $4);
                    p->type = create_array (create_array ($1, $5), $4);
                    p->opt = $2;
                    p->opt = $2;
                    p->name = $3;
                    p->name = $3;
                    p->next = $7;
                    p->next = $7;
                    p->line = lexer_line;
                    p->line = lexer_line;
                    $$ = p;
                    $$ = p;
                  }
                  }
               | type ':' bitfieldlen ';' struct_fields
               | type ':' bitfieldlen ';' struct_fields
                  { $$ = $5; }
                  { $$ = $5; }
               ;
               ;
bitfieldopt: /* empty */
bitfieldopt: /* empty */
             | ':' bitfieldlen
             | ':' bitfieldlen
             ;
             ;
bitfieldlen: NUM | ID
bitfieldlen: NUM | ID
                { }
                { }
             ;
             ;
type: SCALAR
type: SCALAR
         { $$ = $1; }
         { $$ = $1; }
      | ID
      | ID
         { $$ = resolve_typedef ($1, &lexer_line); }
         { $$ = resolve_typedef ($1, &lexer_line); }
      | type '*'
      | type '*'
         { $$ = create_pointer ($1); }
         { $$ = create_pointer ($1); }
      | STRUCT ID '{' struct_fields '}'
      | STRUCT ID '{' struct_fields '}'
         { $$ = new_structure ($2, 0, &lexer_line, $4, NULL); }
         { $$ = new_structure ($2, 0, &lexer_line, $4, NULL); }
      | STRUCT ID
      | STRUCT ID
         { $$ = find_structure ($2, 0); }
         { $$ = find_structure ($2, 0); }
      | UNION ID '{' struct_fields '}'
      | UNION ID '{' struct_fields '}'
         { $$ = new_structure ($2, 1, &lexer_line, $4, NULL); }
         { $$ = new_structure ($2, 1, &lexer_line, $4, NULL); }
      | UNION ID
      | UNION ID
         { $$ = find_structure ($2, 1); }
         { $$ = find_structure ($2, 1); }
      | ENUM ID
      | ENUM ID
         { $$ = create_scalar_type ($2, strlen ($2)); }
         { $$ = create_scalar_type ($2, strlen ($2)); }
      | ENUM ID '{' enum_items '}'
      | ENUM ID '{' enum_items '}'
         { $$ = create_scalar_type ($2, strlen ($2)); }
         { $$ = create_scalar_type ($2, strlen ($2)); }
      ;
      ;
enum_items: /* empty */
enum_items: /* empty */
            | ID '=' NUM ',' enum_items
            | ID '=' NUM ',' enum_items
              { }
              { }
            | ID ',' enum_items
            | ID ',' enum_items
              { }
              { }
            | ID enum_items
            | ID enum_items
              { }
              { }
            ;
            ;
optionsopt: { $$ = NULL; }
optionsopt: { $$ = NULL; }
            | options { $$ = $1; }
            | options { $$ = $1; }
            ;
            ;
options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
           { $$ = $4; }
           { $$ = $4; }
         ;
         ;
type_option : ALIAS
type_option : ALIAS
                { $$ = "ptr_alias"; }
                { $$ = "ptr_alias"; }
              | PARAM_IS
              | PARAM_IS
                { $$ = $1; }
                { $$ = $1; }
              ;
              ;
option:   ID
option:   ID
            { $$ = create_option (NULL, $1, (void *)""); }
            { $$ = create_option (NULL, $1, (void *)""); }
        | ID '(' stringseq ')'
        | ID '(' stringseq ')'
            { $$ = create_option (NULL, $1, (void *)$3); }
            { $$ = create_option (NULL, $1, (void *)$3); }
        | type_option '(' type ')'
        | type_option '(' type ')'
            { $$ = create_option (NULL, $1, adjust_field_type ($3, NULL)); }
            { $$ = create_option (NULL, $1, adjust_field_type ($3, NULL)); }
        | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
        | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
            {
            {
              struct nested_ptr_data d;
              struct nested_ptr_data d;
              d.type = adjust_field_type ($3, NULL);
              d.type = adjust_field_type ($3, NULL);
              d.convert_to = $5;
              d.convert_to = $5;
              d.convert_from = $7;
              d.convert_from = $7;
              $$ = create_option (NULL, "nested_ptr",
              $$ = create_option (NULL, "nested_ptr",
                                  xmemdup (&d, sizeof (d), sizeof (d)));
                                  xmemdup (&d, sizeof (d), sizeof (d)));
            }
            }
        ;
        ;
optionseq: option
optionseq: option
              {
              {
                $1->next = NULL;
                $1->next = NULL;
                $$ = $1;
                $$ = $1;
              }
              }
            | optionseq ',' option
            | optionseq ',' option
              {
              {
                $3->next = $1;
                $3->next = $1;
                $$ = $3;
                $$ = $3;
              }
              }
            ;
            ;
optionseqopt: { $$ = NULL; }
optionseqopt: { $$ = NULL; }
              | optionseq { $$ = $1; }
              | optionseq { $$ = $1; }
              ;
              ;
stringseq: STRING
stringseq: STRING
             { $$ = $1; }
             { $$ = $1; }
           | stringseq STRING
           | stringseq STRING
             {
             {
               size_t l1 = strlen ($1);
               size_t l1 = strlen ($1);
               size_t l2 = strlen ($2);
               size_t l2 = strlen ($2);
               char *s = XRESIZEVEC (char, $1, l1 + l2 + 1);
               char *s = XRESIZEVEC (char, $1, l1 + l2 + 1);
               memcpy (s + l1, $2, l2 + 1);
               memcpy (s + l1, $2, l2 + 1);
               XDELETE ($2);
               XDELETE ($2);
               $$ = s;
               $$ = s;
             }
             }
           ;
           ;
%%
%%
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.