|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.