|
|
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
1.1.1.2 ! root 18: the Free Software Foundation, 59 Temple Place - Suite 330,
! 19: Boston, MA 02111-1307, USA. */
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.