OSDN Git Service

* pa.h (DO_GLOBAL_DTORS_BODY): Fix pointer -> integer assignment
[pf3gnuchains/gcc-fork.git] / gcc / bi-parser.y
1 /* Bytecode definition file parser.
2    Copyright (C) 1993 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 %{
22
23 #include <stdio.h>
24 #include "hconfig.h"
25 #include "bi-defs.h"
26
27 extern char yytext[];
28 extern int yyleng;
29
30
31 /* Chain of all defs built by the parser. */
32 struct def *defs;
33 int ndefs;
34
35 static struct node *makenode ();
36 static struct variation *makevar ();
37 static struct def *makedef ();
38
39 void yyerror ();
40
41 %}
42
43 %union
44 {
45   char *string;
46   struct def *def;
47   struct variation *variation;
48   struct node *node;
49 }
50
51 %token <string> DEFOP STRING
52 %type <string> opt_string
53 %type <def> defs def
54 %type <variation> variations variation
55 %type <node> list items item
56
57 %%
58
59 top: 
60   defs
61     { defs = $1; }
62   ;
63
64 defs:
65   def
66   | defs def
67     { $2->next = $1; $$ = $2; }
68   ;
69
70 def:
71   DEFOP '(' STRING ',' opt_string ',' '(' variations ')' ')'
72     { $$ = makedef ($3, $5, $8); }
73   ;
74
75 variations:
76   variation
77   | variations ',' variation
78     { $3->next = $1; $$ = $3; }
79   ;
80
81 variation:
82   '(' opt_string ')'
83     { $$ = makevar ($2, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); }
84   | '(' opt_string ',' list ')'
85     { $$ = makevar ($2, $4, (struct node *) NULL, (struct node *) NULL); }
86   | '(' opt_string ',' list ',' list ')'
87     { $$ = makevar ($2, $4, $6, (struct node *) NULL); }
88   | '(' opt_string ',' list ',' list ',' list ')'
89     { $$ = makevar ($2, $4, $6, $8); }
90   ;
91
92 opt_string:
93   /* empty */ { $$ = ""; }
94   | STRING { $$ = $1; }
95   ;
96
97 list:
98   '(' items ')'
99     { $$ = $2; }
100   | /* empty */
101     { $$ = NULL; }
102   ;
103
104 items:
105   item
106   /* Note right recursion. */
107   | item ',' items
108     { $1->next = $3; $$ = $1; }
109   ;
110
111 item:
112   STRING
113     { $$ = makenode ($1); }
114   ;
115
116 %%
117
118 static struct node *
119 makenode (s)
120      char *s;
121 {
122   struct node *n;
123
124   n = (struct node *) malloc (sizeof (struct node));
125   n->text = s;
126   n->next = NULL;
127   return n;
128 }
129
130 static struct variation *
131 makevar (name, inputs, outputs, literals)
132      char *name;
133      struct node *inputs, *outputs, *literals;
134 {
135   struct variation *v;
136
137   v = (struct variation *) malloc (sizeof (struct variation));
138   v->name = name;
139   v->code = ndefs++;
140   v->inputs = inputs;
141   v->outputs = outputs;
142   v->literals = literals;
143   v->next = NULL;
144   return v;
145 }
146
147 static struct def *
148 makedef (name, template, vars)
149      char *name, *template;
150      struct variation *vars;
151 {
152   struct def *d;
153
154   d = (struct def *) malloc (sizeof (struct def));
155   d->basename = name;
156   d->template = template;
157   d->variations = vars;
158   d->next = NULL;
159   return d;
160 }
161
162 void
163 yyerror (s)
164      char *s;
165 {
166   fprintf (stderr, "syntax error in input\n");
167   exit (FATAL_EXIT_CODE);
168 }