Import final gcc2 snapshot (990109)
[official-gcc.git] / gcc / bi-parser.y
blobff07c474f509772b00bc485fb510ad888300945b
1 /* Bytecode definition file parser.
2 Copyright (C) 1993, 1998 Free Software Foundation, Inc.
4 This file is part of GNU CC.
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.
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.
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. */
24 #include "hconfig.h"
25 #include "system.h"
26 #include "bi-defs.h"
28 extern char yytext[];
29 extern int yyleng;
32 /* Chain of all defs built by the parser. */
33 struct def *defs;
34 int ndefs;
36 static struct node *makenode ();
37 static struct variation *makevar ();
38 static struct def *makedef ();
40 void yyerror ();
44 %union
46 char *string;
47 struct def *def;
48 struct variation *variation;
49 struct node *node;
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
60 top:
61 defs
62 { defs = $1; }
65 defs:
66 def
67 | defs def
68 { $2->next = $1; $$ = $2; }
71 def:
72 DEFOP '(' STRING ',' opt_string ',' '(' variations ')' ')'
73 { $$ = makedef ($3, $5, $8); }
76 variations:
77 variation
78 | variations ',' variation
79 { $3->next = $1; $$ = $3; }
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); }
93 opt_string:
94 /* empty */ { $$ = ""; }
95 | STRING { $$ = $1; }
98 list:
99 '(' items ')'
100 { $$ = $2; }
101 | /* empty */
102 { $$ = NULL; }
105 items:
106 item
107 /* Note right recursion. */
108 | item ',' items
109 { $1->next = $3; $$ = $1; }
112 item:
113 STRING
114 { $$ = makenode ($1); }
119 static struct node *
120 makenode (s)
121 char *s;
123 struct node *n;
125 n = (struct node *) malloc (sizeof (struct node));
126 n->text = s;
127 n->next = NULL;
128 return n;
131 static struct variation *
132 makevar (name, inputs, outputs, literals)
133 char *name;
134 struct node *inputs, *outputs, *literals;
136 struct variation *v;
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;
148 static struct def *
149 makedef (name, template, vars)
150 char *name, *template;
151 struct variation *vars;
153 struct def *d;
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;
163 void
164 yyerror (s)
165 char *s;
167 fprintf (stderr, "syntax error in input\n");
168 exit (FATAL_EXIT_CODE);