File:
[local] /
rpl /
rplawk /
parse.c
Revision
1.2:
download - view:
text,
annotated -
select for diffs -
revision graph
Wed Jun 12 09:48:22 2013 UTC (11 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_35,
rpl-4_1_34,
rpl-4_1_33,
rpl-4_1_32,
rpl-4_1_31,
rpl-4_1_30,
rpl-4_1_29,
rpl-4_1_28,
rpl-4_1_27,
rpl-4_1_26,
rpl-4_1_25,
rpl-4_1_24,
rpl-4_1_23,
rpl-4_1_22,
rpl-4_1_21,
rpl-4_1_20,
rpl-4_1_19,
rpl-4_1_18,
rpl-4_1_17,
rpl-4_1_16,
rpl-4_1_15,
rpl-4_1_14,
HEAD
Cohérence.
1: /****************************************************************
2: Copyright (C) Lucent Technologies 1997
3: All Rights Reserved
4:
5: Permission to use, copy, modify, and distribute this software and
6: its documentation for any purpose and without fee is hereby
7: granted, provided that the above copyright notice appear in all
8: copies and that both that the copyright notice and this
9: permission notice and warranty disclaimer appear in supporting
10: documentation, and that the name Lucent Technologies or any of
11: its entities not be used in advertising or publicity pertaining
12: to distribution of the software without specific, written prior
13: permission.
14:
15: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22: THIS SOFTWARE.
23: ****************************************************************/
24:
25: #define DEBUG
26: #include <stdio.h>
27: #include <string.h>
28: #include <stdlib.h>
29: #include "awk.h"
30: #include "ytab.h"
31:
32: Node *nodealloc(int n)
33: {
34: Node *x;
35:
36: x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *));
37: if (x == NULL)
38: FATAL("out of space in nodealloc");
39: x->nnext = NULL;
40: x->lineno = lineno;
41: return(x);
42: }
43:
44: Node *exptostat(Node *a)
45: {
46: a->ntype = NSTAT;
47: return(a);
48: }
49:
50: Node *node1(int a, Node *b)
51: {
52: Node *x;
53:
54: x = nodealloc(1);
55: x->nobj = a;
56: x->narg[0]=b;
57: return(x);
58: }
59:
60: Node *node2(int a, Node *b, Node *c)
61: {
62: Node *x;
63:
64: x = nodealloc(2);
65: x->nobj = a;
66: x->narg[0] = b;
67: x->narg[1] = c;
68: return(x);
69: }
70:
71: Node *node3(int a, Node *b, Node *c, Node *d)
72: {
73: Node *x;
74:
75: x = nodealloc(3);
76: x->nobj = a;
77: x->narg[0] = b;
78: x->narg[1] = c;
79: x->narg[2] = d;
80: return(x);
81: }
82:
83: Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
84: {
85: Node *x;
86:
87: x = nodealloc(4);
88: x->nobj = a;
89: x->narg[0] = b;
90: x->narg[1] = c;
91: x->narg[2] = d;
92: x->narg[3] = e;
93: return(x);
94: }
95:
96: Node *stat1(int a, Node *b)
97: {
98: Node *x;
99:
100: x = node1(a,b);
101: x->ntype = NSTAT;
102: return(x);
103: }
104:
105: Node *stat2(int a, Node *b, Node *c)
106: {
107: Node *x;
108:
109: x = node2(a,b,c);
110: x->ntype = NSTAT;
111: return(x);
112: }
113:
114: Node *stat3(int a, Node *b, Node *c, Node *d)
115: {
116: Node *x;
117:
118: x = node3(a,b,c,d);
119: x->ntype = NSTAT;
120: return(x);
121: }
122:
123: Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
124: {
125: Node *x;
126:
127: x = node4(a,b,c,d,e);
128: x->ntype = NSTAT;
129: return(x);
130: }
131:
132: Node *op1(int a, Node *b)
133: {
134: Node *x;
135:
136: x = node1(a,b);
137: x->ntype = NEXPR;
138: return(x);
139: }
140:
141: Node *op2(int a, Node *b, Node *c)
142: {
143: Node *x;
144:
145: x = node2(a,b,c);
146: x->ntype = NEXPR;
147: return(x);
148: }
149:
150: Node *op3(int a, Node *b, Node *c, Node *d)
151: {
152: Node *x;
153:
154: x = node3(a,b,c,d);
155: x->ntype = NEXPR;
156: return(x);
157: }
158:
159: Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
160: {
161: Node *x;
162:
163: x = node4(a,b,c,d,e);
164: x->ntype = NEXPR;
165: return(x);
166: }
167:
168: Node *celltonode(Cell *a, int b)
169: {
170: Node *x;
171:
172: a->ctype = OCELL;
173: a->csub = b;
174: x = node1(0, (Node *) a);
175: x->ntype = NVALUE;
176: return(x);
177: }
178:
179: Node *rectonode(void) /* make $0 into a Node */
180: {
181: extern Cell *literal0;
182: return op1(INDIRECT, celltonode(literal0, CUNK));
183: }
184:
185: Node *makearr(Node *p)
186: {
187: Cell *cp;
188:
189: if (isvalue(p)) {
190: cp = (Cell *) (p->narg[0]);
191: if (isfcn(cp))
192: SYNTAX( "%s is a function, not an array", cp->nval );
193: else if (!isarr(cp)) {
194: xfree(cp->sval);
195: cp->sval = (char *) makesymtab(NSYMTAB);
196: cp->tval = ARR;
197: }
198: }
199: return p;
200: }
201:
202: #define PA2NUM 50 /* max number of pat,pat patterns allowed */
203: int paircnt; /* number of them in use */
204: int pairstack[PA2NUM]; /* state of each pat,pat */
205:
206: Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */
207: {
208: Node *x;
209:
210: x = node4(PASTAT2, a, b, c, itonp(paircnt));
211: if (paircnt++ >= PA2NUM)
212: SYNTAX( "limited to %d pat,pat statements", PA2NUM );
213: x->ntype = NSTAT;
214: return(x);
215: }
216:
217: Node *linkum(Node *a, Node *b)
218: {
219: Node *c;
220:
221: if (errorflag) /* don't link things that are wrong */
222: return a;
223: if (a == NULL)
224: return(b);
225: else if (b == NULL)
226: return(a);
227: for (c = a; c->nnext != NULL; c = c->nnext)
228: ;
229: c->nnext = b;
230: return(a);
231: }
232:
233: void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */
234: { /* body of function, arglist */
235: Node *p;
236: int n;
237:
238: if (isarr(v)) {
239: SYNTAX( "`%s' is an array name and a function name", v->nval );
240: return;
241: }
242: if (isarg(v->nval) != -1) {
243: SYNTAX( "`%s' is both function name and argument name", v->nval );
244: return;
245: }
246:
247: v->tval = FCN;
248: v->sval = (char *) st;
249: n = 0; /* count arguments */
250: for (p = vl; p; p = p->nnext)
251: n++;
252: v->fval = n;
253: dprintf( ("defining func %s (%d args)\n", v->nval, n) );
254: }
255:
256: int isarg(const char *s) /* is s in argument list for current function? */
257: { /* return -1 if not, otherwise arg # */
258: extern Node *arglist;
259: Node *p = arglist;
260: int n;
261:
262: for (n = 0; p != 0; p = p->nnext, n++)
263: if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
264: return n;
265: return -1;
266: }
267:
268: int ptoi(void *p) /* convert pointer to integer */
269: {
270: return (int) (long) p; /* swearing that p fits, of course */
271: }
272:
273: Node *itonp(int i) /* and vice versa */
274: {
275: return (Node *) (long) i;
276: }
CVSweb interface <joel.bertrand@systella.fr>