OSDN Git Service

(fold_rtx, case PLUS): When seeing if negative of constant is around,
[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, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 %{
23
24 #include <stdio.h>
25 #include "hconfig.h"
26 #include "bi-defs.h"
27
28 extern char yytext[];
29 extern int yyleng;
30
31
32 /* Chain of all defs built by the parser. */
33 struct def *defs;
34 int ndefs;
35
36 static struct node *makenode ();
37 static struct variation *makevar ();
38 static struct def *makedef ();
39
40 void yyerror ();
41
42 %}
43
44 %union
45 {
46   char *string;
47   struct def *def;
48   struct variation *variation;
49   struct node *node;
50 }
51
52 %token <string> DEFOP STRING
53 %type <string> opt_string
54 %type <def> defs def
55 %type <variation> variations variation
56 %type <node> list items item
57
58 %%
59
60 top: 
61   defs
62     { defs = $1; }
63   ;
64
65 defs:
66   def
67   | defs def
68     { $2->next = $1; $$ = $2; }
69   ;
70
71 def:
72   DEFOP '(' STRING ',' opt_string ',' '(' variations ')' ')'
73     { $$ = makedef ($3, $5, $8); }
74   ;
75
76 variations:
77   variation
78   | variations ',' variation
79     { $3->next = $1; $$ = $3; }
80   ;
81
82 variation:
83   '(' opt_string ')'
84     { $$ = makevar ($2, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); }
85   | '(' opt_string ',' list ')'
86     { $$ = makevar ($2, $4, (struct node *) NULL, (struct node *) NULL); }
87   | '(' opt_string ',' list ',' list ')'
88     { $$ = makevar ($2, $4, $6, (struct node *) NULL); }
89   | '(' opt_string ',' list ',' list ',' list ')'
90     { $$ = makevar ($2, $4, $6, $8); }
91   ;
92
93 opt_string:
94   /* empty */ { $$ = ""; }
95   | STRING { $$ = $1; }
96   ;
97
98 list:
99   '(' items ')'
100     { $$ = $2; }
101   | /* empty */
102     { $$ = NULL; }
103   ;
104
105 items:
106   item
107   /* Note right recursion. */
108   | item ',' items
109     { $1->next = $3; $$ = $1; }
110   ;
111
112 item:
113   STRING
114     { $$ = makenode ($1); }
115   ;
116
117 %%
118
119 static struct node *
120 makenode (s)
121      char *s;
122 {
123   struct node *n;
124
125   n = (struct node *) malloc (sizeof (struct node));
126   n->text = s;
127   n->next = NULL;
128   return n;
129 }
130
131 static struct variation *
132 makevar (name, inputs, outputs, literals)
133      char *name;
134      struct node *inputs, *outputs, *literals;
135 {
136   struct variation *v;
137
138   v = (struct variation *) malloc (sizeof (struct variation));
139   v->name = name;
140   v->code = ndefs++;
141   v->inputs = inputs;
142   v->outputs = outputs;
143   v->literals = literals;
144   v->next = NULL;
145   return v;
146 }
147
148 static struct def *
149 makedef (name, template, vars)
150      char *name, *template;
151      struct variation *vars;
152 {
153   struct def *d;
154
155   d = (struct def *) malloc (sizeof (struct def));
156   d->basename = name;
157   d->template = template;
158   d->variations = vars;
159   d->next = NULL;
160   return d;
161 }
162
163 void
164 yyerror (s)
165      char *s;
166 {
167   fprintf (stderr, "syntax error in input\n");
168   exit (FATAL_EXIT_CODE);
169 }