aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.2.1-5666.3/gcc/gengtype-yacc.y
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.2.1-5666.3/gcc/gengtype-yacc.y')
-rw-r--r--gcc-4.2.1-5666.3/gcc/gengtype-yacc.y317
1 files changed, 317 insertions, 0 deletions
diff --git a/gcc-4.2.1-5666.3/gcc/gengtype-yacc.y b/gcc-4.2.1-5666.3/gcc/gengtype-yacc.y
new file mode 100644
index 000000000..8bdf983e0
--- /dev/null
+++ b/gcc-4.2.1-5666.3/gcc/gengtype-yacc.y
@@ -0,0 +1,317 @@
+/* -*- indented-text -*- */
+/* Process source files and output type information.
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+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
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
+
+%{
+#include "bconfig.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "gengtype.h"
+#define YYERROR_VERBOSE
+%}
+
+%union {
+ type_p t;
+ pair_p p;
+ options_p o;
+ const char *s;
+}
+
+%token <t>ENT_TYPEDEF_STRUCT
+%token <t>ENT_STRUCT
+%token ENT_EXTERNSTATIC
+%token ENT_YACCUNION
+%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
+%token <s>ID
+%token <s>STRING
+%token <s>ARRAY
+%token <s>PERCENT_ID
+%token <s>CHAR
+
+%type <p> struct_fields yacc_ids yacc_typematch
+%type <t> type lasttype
+%type <o> optionsopt options option optionseq optionseqopt
+%type <s> type_option stringseq
+
+%%
+
+start: /* empty */
+ | typedef_struct start
+ | externstatic start
+ | yacc_union start
+ ;
+
+typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
+ {
+ new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
+ $4, $2);
+ do_typedef ($6, $1, &lexer_line);
+ lexer_toplevel_done = 1;
+ }
+ ';'
+ {}
+ | ENT_STRUCT options '{' struct_fields '}'
+ {
+ new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
+ $4, $2);
+ lexer_toplevel_done = 1;
+ }
+ ';'
+ {}
+ ;
+
+externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
+ {
+ note_variable ($4, adjust_field_type ($3, $2), $2,
+ &lexer_line);
+ }
+ | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
+ {
+ note_variable ($4, create_array ($3, $5),
+ $2, &lexer_line);
+ }
+ | ENT_EXTERNSTATIC options lasttype ID ARRAY ARRAY semiequal
+ {
+ note_variable ($4, create_array (create_array ($3, $6),
+ $5),
+ $2, &lexer_line);
+ }
+ ;
+
+lasttype: type
+ {
+ lexer_toplevel_done = 1;
+ $$ = $1;
+ }
+ ;
+
+semiequal: ';'
+ | '='
+ ;
+
+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)
+ {
+ p->name = NULL;
+ p->type = NULL;
+ }
+ p->name = NULL;
+ p->type = NULL;
+ p->next = $1;
+ $$ = $3;
+ }
+ | yacc_typematch PERCENT_ID '<' ID '>' yacc_ids
+ {
+ pair_p p;
+ type_p newtype = NULL;
+ if (strcmp ($2, "type") == 0)
+ newtype = (type_p) 1;
+ for (p = $6; p->next != NULL; p = p->next)
+ {
+ p->name = $4;
+ p->type = newtype;
+ }
+ p->name = $4;
+ p->next = $1;
+ p->type = newtype;
+ $$ = $6;
+ }
+ ;
+
+yacc_ids: /* empty */
+ { $$ = NULL; }
+ | yacc_ids ID
+ {
+ pair_p p = XCNEW (struct pair);
+ p->next = $1;
+ p->line = lexer_line;
+ p->opt = XNEW (struct options);
+ p->opt->name = "tag";
+ p->opt->next = NULL;
+ p->opt->info = (char *)$2;
+ $$ = p;
+ }
+ | yacc_ids CHAR
+ {
+ pair_p p = XCNEW (struct pair);
+ p->next = $1;
+ p->line = lexer_line;
+ p->opt = XNEW (struct options);
+ p->opt->name = "tag";
+ p->opt->next = NULL;
+ p->opt->info = xasprintf ("'%s'", $2);
+ $$ = p;
+ }
+ ;
+
+struct_fields: { $$ = NULL; }
+ | type optionsopt ID bitfieldopt ';' struct_fields
+ {
+ pair_p p = XNEW (struct pair);
+ p->type = adjust_field_type ($1, $2);
+ p->opt = $2;
+ p->name = $3;
+ p->next = $6;
+ p->line = lexer_line;
+ $$ = p;
+ }
+ | type optionsopt ID ARRAY ';' struct_fields
+ {
+ pair_p p = XNEW (struct pair);
+ p->type = adjust_field_type (create_array ($1, $4), $2);
+ p->opt = $2;
+ p->name = $3;
+ p->next = $6;
+ p->line = lexer_line;
+ $$ = p;
+ }
+ | type optionsopt ID ARRAY ARRAY ';' struct_fields
+ {
+ pair_p p = XNEW (struct pair);
+ p->type = create_array (create_array ($1, $5), $4);
+ p->opt = $2;
+ p->name = $3;
+ p->next = $7;
+ p->line = lexer_line;
+ $$ = p;
+ }
+ | type ':' bitfieldlen ';' struct_fields
+ { $$ = $5; }
+ ;
+
+bitfieldopt: /* empty */
+ | ':' bitfieldlen
+ ;
+
+bitfieldlen: NUM | ID
+ { }
+ ;
+
+type: SCALAR
+ { $$ = $1; }
+ | ID
+ { $$ = resolve_typedef ($1, &lexer_line); }
+ | type '*'
+ { $$ = create_pointer ($1); }
+ | STRUCT ID '{' struct_fields '}'
+ { $$ = new_structure ($2, 0, &lexer_line, $4, NULL); }
+ | STRUCT ID
+ { $$ = find_structure ($2, 0); }
+ | UNION ID '{' struct_fields '}'
+ { $$ = new_structure ($2, 1, &lexer_line, $4, NULL); }
+ | UNION ID
+ { $$ = find_structure ($2, 1); }
+ | ENUM ID
+ { $$ = create_scalar_type ($2, strlen ($2)); }
+ | ENUM ID '{' enum_items '}'
+ { $$ = create_scalar_type ($2, strlen ($2)); }
+ ;
+
+enum_items: /* empty */
+ | ID '=' NUM ',' enum_items
+ { }
+ | ID ',' enum_items
+ { }
+ | ID enum_items
+ { }
+ ;
+
+optionsopt: { $$ = NULL; }
+ | options { $$ = $1; }
+ ;
+
+options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
+ { $$ = $4; }
+ ;
+
+type_option : ALIAS
+ { $$ = "ptr_alias"; }
+ | PARAM_IS
+ { $$ = $1; }
+ ;
+
+option: ID
+ { $$ = create_option (NULL, $1, (void *)""); }
+ | ID '(' stringseq ')'
+ { $$ = create_option (NULL, $1, (void *)$3); }
+ | type_option '(' type ')'
+ { $$ = create_option (NULL, $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 (NULL, "nested_ptr",
+ xmemdup (&d, sizeof (d), sizeof (d)));
+ }
+ ;
+
+optionseq: option
+ {
+ $1->next = NULL;
+ $$ = $1;
+ }
+ | optionseq ',' option
+ {
+ $3->next = $1;
+ $$ = $3;
+ }
+ ;
+
+optionseqopt: { $$ = NULL; }
+ | optionseq { $$ = $1; }
+ ;
+
+stringseq: STRING
+ { $$ = $1; }
+ | stringseq STRING
+ {
+ size_t l1 = strlen ($1);
+ size_t l2 = strlen ($2);
+ char *s = XRESIZEVEC (char, $1, l1 + l2 + 1);
+ memcpy (s + l1, $2, l2 + 1);
+ XDELETE ($2);
+ $$ = s;
+ }
+ ;
+%%