Annotation of OpenXM_contrib2/asir2000/parse/parse.y, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/parse/parse.y,v 1.2 1999/11/18 05:42:03 noro Exp $ */
2: %{
3: #define malloc(x) GC_malloc(x)
4: #define realloc(x,y) GC_realloc(x,y)
5: #define free(x) GC_free(x)
6:
7: #if defined(THINK_C)
8: #define alloca(x) GC_malloc(x)
9: #endif
10: #if defined(TOWNS)
11: #include <alloca.h>
12: #endif
13: #include <ctype.h>
14: #include "ca.h"
15: #if !defined(THINK_C)
16: #include <sys/types.h>
17: #include <sys/stat.h>
18: #endif
19: #include "parse.h"
20:
21: #define NOPR (prresult=0)
22:
23: extern int gdef;
24: extern SNODE parse_snode;
25: extern int main_parser;
26:
27: int prresult;
28:
29: static int ind;
30: static FNODE t;
31: static NODE a,b;
32: static NODE2 a2;
33: static pointer val;
34: extern jmp_buf env;
35: %}
36:
37: %start start
38:
39: %union {
40: FNODE f;
41: SNODE s;
42: NODE n;
43: NODE2 n2;
44: int i;
45: pointer p;
46: }
47:
48: %token <i> STRUCT POINT NEWSTRUCT ANS FDEF PFDEF GLOBAL CMP OR AND CAR CDR
49: %token <i> DO WHILE FOR IF ELSE BREAK RETURN CONTINUE PARIF MAP TIMER GF2NGEN GFPNGEN GETOPT
50: %token <i> FOP_AND FOP_OR FOP_IMPL FOP_REPL FOP_EQUIV FOP_NOT LOP
51: %token <p> FORMULA UCASE LCASE STR SELF BOPASS
52: %token <p> '+' '-' '*' '/' '^' '%'
53:
54: %type <p> desc rawstr
55: %type <f> expr pexpr opt
56: %type <s> stat complex
57: %type <n> stats node _node pvars fields members optlist
58:
59: %right '=' BOPASS
60: %right '?' ':'
61: %right FOP_NOT
62: %left FOP_EQUIV
63: %left FOP_REPL
64: %left FOP_IMPL
65: %left FOP_OR
66: %left FOP_AND
67: %left LOP
68: %left LCASE
69: %left OR
70: %left AND
71: %left '&'
72: %left CMP
73: %left '+' '-'
74: %left PLUS
75: %left MINUS
76: %left '*' '/' '%'
77: %right '^'
78: %right '!'
79: %right SELF
80: %left POINT
81:
82: %%
83:
84: start : stat
85: { parse_snode = $1; YYACCEPT; }
86: ;
87: stat : tail
88: { $$ = 0; }
89: | GLOBAL { gdef=1; } pvars { gdef=0; } tail
90: { $$ = 0; }
91: | STRUCT rawstr '{' fields '}' tail
92: { structdef($2,$4); $$ = 0; }
93: | STRUCT rawstr '{' fields '}' pvars tail
94: { structdef($2,$4); setstruct($2,$6); $$ = 0; }
95: | STRUCT rawstr pvars tail
96: { setstruct($2,$3); $$ = 0; }
97: | expr tail
98: { $$ = mksnode(1,S_SINGLE,$1); }
99: | complex
100: { $$ = $1; }
101: | BREAK tail
102: { $$ = mksnode(0,S_BREAK); }
103: | CONTINUE tail
104: { $$ = mksnode(0,S_CONTINUE); }
105: | RETURN tail
106: { $$ = mksnode(1,S_RETURN,0); }
107: | RETURN expr tail
108: { $$ = mksnode(1,S_RETURN,$2); }
109: | IF '(' node ')' stat
110: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,0); $5?$$->ln=$5->ln:0; NOPR; }
111: | IF '(' node ')' stat ELSE stat
112: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,$7); $7?$$->ln=$7->ln:0; NOPR; }
113: | FOR '(' node ';' node ';' node ')' stat
114: { $$ = mksnode(5,S_FOR,$1,$3,$5?$5:ONENODE,$7,$9); $9?$$->ln=$9->ln:0; NOPR; }
115: | WHILE '(' node ')' stat
116: { $$ = mksnode(5,S_FOR,$1,0,$3,0,$5); $5?$$->ln=$5->ln:0; NOPR; }
117: | DO stat WHILE '(' node ')' tail
118: { $$ = mksnode(3,S_DO,$1,$2,$5); }
119: | LCASE '(' node ')' ':' '=' expr tail
120: { $$ = mksnode(3,S_PFDEF,$1,$3,$7); NOPR; }
121: | PFDEF LCASE '(' node ')'
122: { $$ = mksnode(3,S_PFDEF,$2,$4,0); NOPR; }
123: | FDEF LCASE { mkpvs(); } '(' node ')' desc '{' stats '}'
124: {
125: mkuf($2,asir_infile->name,$5,
126: mksnode(1,S_CPLX,$9),$1,asir_infile->ln,$7);
127: $$ = 0; NOPR;
128: }
129: | error tail
130: { yyerrok; $$ = 0; }
131: ;
132: tail : ';'
133: { if ( main_parser ) prresult = 1; }
134: | '$'
135: { if ( main_parser ) prresult = 0; }
136: desc :
137: { $$ = 0; }
138: | STR
139: { $$ = $1; }
140: ;
141: complex : '{' stats '}'
142: { $$ = mksnode(1,S_CPLX,$2); }
143: ;
144: fields :
145: { $$ = 0; }
146: | fields members tail
147: { MKNODE(a,0,$2); appendtonode($1,(pointer)a,&$$); }
148: | fields STRUCT rawstr members tail
149: { MKNODE(a,$3,$4); appendtonode($1,(pointer)a,&$$); }
150: ;
151: members : rawstr
152: { MKNODE($$,$1,0); }
153: | members ',' rawstr
154: { appendtonode($1,$3,&$$); }
155: ;
156: pvars : UCASE
157: { val = (pointer)makepvar($1); MKNODE($$,val,0); }
158: | pvars ',' UCASE
159: { appendtonode($1,(pointer)makepvar($3),&$$); }
160: ;
161: stats :
162: { $$ = 0; }
163: | stats stat
164: { appendtonode($1,(pointer)$2,&$$); }
165: ;
166: node :
167: { $$ = 0; }
168: | _node
169: { $$ = $1; }
170: ;
171: _node : expr
172: { MKNODE($$,$1,0); }
173: | _node ',' expr
174: { appendtonode($1,(pointer)$3,&$$); }
175: ;
176: optlist : opt
177: { MKNODE($$,$1,0); }
178: | optlist ',' opt
179: { appendtonode($1,(pointer)$3,&$$); }
180: ;
181: rawstr : UCASE
182: { $$ = $1; }
183: | LCASE
184: { $$ = $1; }
185: ;
186: opt : rawstr '=' expr
187: { $$ = mkfnode(2,I_OPT,$1,$3); }
188: ;
189: pexpr : STR
190: { $$ = mkfnode(1,I_STR,$1); }
191: | FORMULA
192: { $$ = mkfnode(1,I_FORMULA,$1); }
193: | ANS
194: { $$ = mkfnode(1,I_ANS,$1); }
195: | GF2NGEN
196: { $$ = mkfnode(0,I_GF2NGEN); }
197: | GFPNGEN
198: { $$ = mkfnode(0,I_GFPNGEN); }
199: | LCASE
200: {
201: FUNC f;
202:
203: searchf(noargsysf,$1,&f);
204: if ( f )
205: $$ = mkfnode(2,I_FUNC,f,0);
206: else {
207: searchc($1,&f);
208: if ( f )
209: $$ = mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,0));
210: else {
211: searchf(sysf,$1,&f);
212: if ( !f )
213: searchf(ubinf,$1,&f);
214: if ( !f )
215: searchpf($1,&f);
216: if ( !f )
217: searchf(usrf,$1,&f);
218: if ( f )
219: makesrvar(f,(P *)&val);
220: else
221: makevar($1,(P *)&val);
222: $$ = mkfnode(1,I_FORMULA,val);
223: }
224: }
225: }
226: | LCASE '(' node ')'
227: {
228: searchf(sysf,$1,(FUNC *)&val);
229: if ( !val )
230: searchf(ubinf,$1,(FUNC *)&val);
231: if ( !val )
232: searchpf($1,(FUNC *)&val);
233: if ( !val )
234: searchf(usrf,$1,(FUNC *)&val);
235: if ( !val )
236: appenduf($1,(FUNC *)&val);
237: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$3));
238: }
239:
240: | LCASE '(' node '|' optlist ')'
241: {
242: searchf(sysf,$1,(FUNC *)&val);
243: if ( !val )
244: searchf(ubinf,$1,(FUNC *)&val);
245: if ( !val )
246: searchpf($1,(FUNC *)&val);
247: if ( !val )
248: searchf(usrf,$1,(FUNC *)&val);
249: if ( !val )
250: appenduf($1,(FUNC *)&val);
251: $$ = mkfnode(3,I_FUNC_OPT,val,
252: mkfnode(1,I_LIST,$3),mkfnode(1,I_LIST,$5));
253: }
254: | LCASE '{' node '}' '(' node ')'
255: {
256: searchpf($1,(FUNC *)&val);
257: $$ = mkfnode(2,I_PFDERIV,val,mkfnode(1,I_LIST,$6),mkfnode(1,I_LIST,$3));
258: }
259: | GETOPT '(' rawstr ')'
260: {
261: $$ = mkfnode(2,I_GETOPT,$3);
262: }
263: | MAP '(' LCASE ',' node ')'
264: {
265: searchf(sysf,$3,(FUNC *)&val);
266: if ( !val )
267: searchf(ubinf,$3,(FUNC *)&val);
268: if ( !val )
269: searchpf($3,(FUNC *)&val);
270: if ( !val )
271: searchf(usrf,$3,(FUNC *)&val);
272: if ( !val )
273: appenduf($3,(FUNC *)&val);
274: $$ = mkfnode(2,I_MAP,val,mkfnode(1,I_LIST,$5));
275: }
276: | TIMER '(' expr ',' expr ',' expr ')'
277: {
278: $$ = mkfnode(3,I_TIMER,$3,$5,$7);
279: }
280: | PARIF '(' LCASE ',' node ')'
281: {
282: searchf(parif,$3,(FUNC *)&val);
283: if ( !val )
284: mkparif($3,(FUNC *)&val);
285: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$5));
286: }
287: | '(' '*' expr ')' '(' node ')'
288: {
289: $$ = mkfnode(2,I_IFUNC,$3,mkfnode(1,I_LIST,$6));
290: }
291: | CAR '(' expr ')'
292: { $$ = mkfnode(1,I_CAR,$3); }
293: | CDR '(' expr ')'
294: { $$ = mkfnode(1,I_CDR,$3); }
295: | '(' expr ')'
296: { $$ = $2; }
297: | UCASE
298: {
299: if ( main_parser )
300: $$ = mkfnode(2,I_PVAR,makepvar($1),0);
301: else {
302: ind = searchpvar($1);
303: if ( ind == -1 ) {
304: fprintf(stderr,"%s : no such variable.\n",$1);
305: YYABORT;
306: } else
307: $$ = mkfnode(2,I_PVAR,ind,0);
308: }
309: }
310: | pexpr '[' expr ']'
311: {
312: if ( $1->id == I_PVAR || $1->id == I_INDEX ) {
313: appendtonode((NODE)$1->arg[1],(pointer)$3,&a);
314: $1->arg[1] = (pointer)a; $$ = $1;
315: } else {
316: MKNODE(a,$3,0);
317: $$ = mkfnode(2,I_INDEX,(pointer)$1,a);
318: }
319: }
320: | pexpr POINT rawstr
321: { memberofstruct($1,$3,&$$); }
322: ;
323: expr : pexpr
324: { $$ = $1; }
325: | '(' STRUCT rawstr ')' pexpr
326: { $$ = mkfnode(3,I_CAST,structtoindex($3),$5,0); }
327: | expr '=' expr
328: { $$ = mkfnode(2,I_ASSPVAR,$1,$3); }
329: | expr BOPASS expr
330: { $$ = mkfnode(2,I_ASSPVAR,$1,mkfnode(3,I_BOP,$2,$1,$3)); }
331: | expr SELF
332: { $$ = mkfnode(2,I_POSTSELF,$2,$1); }
333: | SELF expr
334: { $$ = mkfnode(2,I_PRESELF,$1,$2); }
335: | '[' node ']'
336: { $$ = mkfnode(1,I_LIST,$2); }
337: | '+' expr %prec PLUS
338: { $$ = $2; }
339: | '-' expr %prec MINUS
340: { $$ = mkfnode(3,I_BOP,$1,0,$2); }
341: | expr '+' expr
342: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
343: | expr '-' expr
344: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
345: | expr '*' expr
346: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
347: | expr '/' expr
348: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
349: | expr '%' expr
350: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
351: | expr '^' expr
352: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
353: | expr CMP expr
354: { $$ = mkfnode(3,I_COP,$2,$1,$3); }
355: | '!' expr
356: { $$ = mkfnode(1,I_NOT,$2); }
357: | expr OR expr
358: { $$ = mkfnode(2,I_OR,$1,$3); }
359: | expr AND expr
360: { $$ = mkfnode(2,I_AND,$1,$3); }
361: | FOP_NOT expr
362: { $$ = mkfnode(3,I_LOP,$1,$2,0); }
363: | expr FOP_AND expr
364: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
365: | expr FOP_OR expr
366: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
367: | expr FOP_IMPL expr
368: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
369: | expr FOP_REPL expr
370: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
371: | expr FOP_EQUIV expr
372: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
373: | expr LOP expr
374: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
375: | expr '?' expr ':' expr
376: { $$ = mkfnode(3,I_CE,$1,$3,$5); }
377: | '<' node '>'
378: { $$ = mkfnode(1,I_EV,$2); }
379: | NEWSTRUCT '(' rawstr ')'
380: { $$ = mkfnode(1,I_NEWCOMP,(int)structtoindex($3)); }
381: ;
382: %%
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>