Annotation of OpenXM_contrib2/asir2000/parse/parse.y, Revision 1.29
1.2 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.3 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.2 noro 27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
47: *
1.29 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2000/parse/parse.y,v 1.28 2005/08/24 06:28:39 noro Exp $
1.2 noro 49: */
1.1 noro 50: %{
51: #define malloc(x) GC_malloc(x)
52: #define realloc(x,y) GC_realloc(x,y)
53: #define free(x) GC_free(x)
54:
55: #if defined(TOWNS)
56: #include <alloca.h>
57: #endif
58: #include <ctype.h>
59: #include "ca.h"
60: #include <sys/types.h>
61: #include <sys/stat.h>
62: #include "parse.h"
63:
64: #define NOPR (prresult=0)
65:
1.19 noro 66: extern int gdef,mgdef,ldef;
1.1 noro 67: extern SNODE parse_snode;
1.13 noro 68: extern int main_parser, allow_create_var;
1.1 noro 69:
1.28 noro 70: int prresult,saveresult;
1.1 noro 71:
72: static int ind;
73: static FNODE t;
74: static NODE a,b;
75: static NODE2 a2;
76: static pointer val;
1.6 noro 77: static QUOTE quote;
1.1 noro 78: extern jmp_buf env;
79: %}
80:
81: %start start
82:
83: %union {
84: FNODE f;
85: SNODE s;
86: NODE n;
87: NODE2 n2;
88: int i;
89: pointer p;
90: }
91:
1.23 noro 92: %token <i> STRUCT POINT NEWSTRUCT ANS FDEF PFDEF MODDEF MODEND
1.21 noro 93: %token <i> GLOBAL MGLOBAL LOCAL LOCALF CMP OR AND CAR CDR QUOTED COLONCOLON
1.10 noro 94: %token <i> DO WHILE FOR IF ELSE BREAK RETURN CONTINUE PARIF MAP RECMAP TIMER GF2NGEN GFPNGEN GFSNGEN GETOPT
1.29 ! noro 95: %token <i> UNIFY
1.1 noro 96: %token <i> FOP_AND FOP_OR FOP_IMPL FOP_REPL FOP_EQUIV FOP_NOT LOP
97: %token <p> FORMULA UCASE LCASE STR SELF BOPASS
98: %token <p> '+' '-' '*' '/' '^' '%'
99:
100: %type <p> desc rawstr
101: %type <f> expr pexpr opt
102: %type <s> stat complex
1.17 noro 103: %type <n> stats node _node pvars vars members optlist
1.1 noro 104:
105: %right '=' BOPASS
106: %right '?' ':'
1.21 noro 107: %left '`'
1.1 noro 108: %right FOP_NOT
109: %left FOP_EQUIV
110: %left FOP_REPL
111: %left FOP_IMPL
112: %left FOP_OR
113: %left FOP_AND
114: %left LOP
115: %left LCASE
116: %left OR
117: %left AND
118: %left '&'
119: %left CMP
120: %left '+' '-'
121: %left PLUS
122: %left MINUS
123: %left '*' '/' '%'
124: %right '^'
125: %right '!'
126: %right SELF
127: %left POINT
128:
129: %%
130:
131: start : stat
1.22 noro 132: {
133: parse_snode = $1;
134: if ( yychar >= 0 )
135: fprintf(stderr,
136: "Warning: a token was wasted after an 'if' statement without 'else'.\n");
137: YYACCEPT;
138: }
1.1 noro 139: ;
140: stat : tail
141: { $$ = 0; }
142: | GLOBAL { gdef=1; } pvars { gdef=0; } tail
1.19 noro 143: { $$ = 0; NOPR; }
144: | MGLOBAL { mgdef=1; } pvars { mgdef=0; } tail
145: { $$ = 0; NOPR; }
146: | LOCAL { ldef=1; } pvars { ldef=0; } tail
147: { $$ = 0; NOPR; }
1.18 noro 148: | LOCALF vars tail
1.19 noro 149: { appenduflist($2); $$ = 0; NOPR; }
1.4 noro 150: | STRUCT rawstr '{' members '}' tail
1.19 noro 151: { structdef($2,$4); $$ = 0; NOPR; }
1.1 noro 152: | expr tail
153: { $$ = mksnode(1,S_SINGLE,$1); }
154: | complex
155: { $$ = $1; }
156: | BREAK tail
157: { $$ = mksnode(0,S_BREAK); }
158: | CONTINUE tail
159: { $$ = mksnode(0,S_CONTINUE); }
160: | RETURN tail
161: { $$ = mksnode(1,S_RETURN,0); }
162: | RETURN expr tail
163: { $$ = mksnode(1,S_RETURN,$2); }
164: | IF '(' node ')' stat
165: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,0); $5?$$->ln=$5->ln:0; NOPR; }
166: | IF '(' node ')' stat ELSE stat
167: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,$7); $7?$$->ln=$7->ln:0; NOPR; }
168: | FOR '(' node ';' node ';' node ')' stat
169: { $$ = mksnode(5,S_FOR,$1,$3,$5?$5:ONENODE,$7,$9); $9?$$->ln=$9->ln:0; NOPR; }
170: | WHILE '(' node ')' stat
171: { $$ = mksnode(5,S_FOR,$1,0,$3,0,$5); $5?$$->ln=$5->ln:0; NOPR; }
172: | DO stat WHILE '(' node ')' tail
1.28 noro 173: { $$ = mksnode(3,S_DO,$1,$2,$5); NOPR; }
1.1 noro 174: | LCASE '(' node ')' ':' '=' expr tail
175: { $$ = mksnode(3,S_PFDEF,$1,$3,$7); NOPR; }
1.20 noro 176: | PFDEF LCASE '(' node ')' tail
1.1 noro 177: { $$ = mksnode(3,S_PFDEF,$2,$4,0); NOPR; }
1.19 noro 178: | FDEF LCASE { mkpvs($2); } '(' { ldef = 1; } node { ldef = -1; } ')' desc '{' stats '}'
1.1 noro 179: {
1.19 noro 180: mkuf($2,asir_infile->name,$6,
181: mksnode(1,S_CPLX,$11),$1,asir_infile->ln,$9,CUR_MODULE);
1.28 noro 182: $$ = 0; NOPR;
1.15 noro 183: }
1.16 noro 184: | MODDEF LCASE tail
1.27 noro 185: {
186: CUR_MODULE = mkmodule($2);
187: MPVS = CUR_MODULE->pvs;
188: $$ = mksnode(1,S_MODULE,CUR_MODULE); NOPR;
189: }
1.16 noro 190: | MODEND tail
1.27 noro 191: { CUR_MODULE = 0; MPVS = 0; $$ = mksnode(1,S_MODULE,0); NOPR; }
1.1 noro 192: | error tail
193: { yyerrok; $$ = 0; }
194: ;
195: tail : ';'
196: { if ( main_parser ) prresult = 1; }
197: | '$'
198: { if ( main_parser ) prresult = 0; }
1.14 takayama 199: ;
1.1 noro 200: desc :
201: { $$ = 0; }
202: | STR
203: { $$ = $1; }
204: ;
205: complex : '{' stats '}'
206: { $$ = mksnode(1,S_CPLX,$2); }
207: ;
208: members : rawstr
209: { MKNODE($$,$1,0); }
210: | members ',' rawstr
211: { appendtonode($1,$3,&$$); }
212: ;
1.17 noro 213: vars : LCASE
214: { MKNODE($$,$1,0); }
215: | vars ',' LCASE
216: { appendtonode($1,$3,&$$); }
217: ;
1.1 noro 218: pvars : UCASE
219: { val = (pointer)makepvar($1); MKNODE($$,val,0); }
220: | pvars ',' UCASE
221: { appendtonode($1,(pointer)makepvar($3),&$$); }
222: ;
223: stats :
224: { $$ = 0; }
225: | stats stat
226: { appendtonode($1,(pointer)$2,&$$); }
227: ;
228: node :
229: { $$ = 0; }
230: | _node
231: { $$ = $1; }
232: ;
233: _node : expr
234: { MKNODE($$,$1,0); }
235: | _node ',' expr
236: { appendtonode($1,(pointer)$3,&$$); }
237: ;
238: optlist : opt
239: { MKNODE($$,$1,0); }
240: | optlist ',' opt
241: { appendtonode($1,(pointer)$3,&$$); }
242: ;
243: rawstr : UCASE
244: { $$ = $1; }
245: | LCASE
246: { $$ = $1; }
247: ;
248: opt : rawstr '=' expr
249: { $$ = mkfnode(2,I_OPT,$1,$3); }
250: ;
251: pexpr : STR
252: { $$ = mkfnode(1,I_STR,$1); }
253: | FORMULA
254: { $$ = mkfnode(1,I_FORMULA,$1); }
255: | ANS
256: { $$ = mkfnode(1,I_ANS,$1); }
257: | GF2NGEN
258: { $$ = mkfnode(0,I_GF2NGEN); }
259: | GFPNGEN
260: { $$ = mkfnode(0,I_GFPNGEN); }
1.10 noro 261: | GFSNGEN
262: { $$ = mkfnode(0,I_GFSNGEN); }
1.1 noro 263: | LCASE
264: {
265: FUNC f;
266:
267: searchf(noargsysf,$1,&f);
268: if ( f )
269: $$ = mkfnode(2,I_FUNC,f,0);
270: else {
271: searchc($1,&f);
272: if ( f )
273: $$ = mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,0));
274: else {
1.25 noro 275: gen_searchf_searchonly($1,(FUNC *)&f);
1.1 noro 276: if ( f )
277: makesrvar(f,(P *)&val);
278: else
279: makevar($1,(P *)&val);
280: $$ = mkfnode(1,I_FORMULA,val);
281: }
282: }
283: }
284: | LCASE '(' node ')'
285: {
1.9 noro 286: gen_searchf($1,(FUNC *)&val);
1.17 noro 287: print_crossref(val);
1.1 noro 288: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$3));
289: }
290:
291: | LCASE '(' node '|' optlist ')'
292: {
1.9 noro 293: gen_searchf($1,(FUNC *)&val);
1.17 noro 294: print_crossref(val);
1.1 noro 295: $$ = mkfnode(3,I_FUNC_OPT,val,
296: mkfnode(1,I_LIST,$3),mkfnode(1,I_LIST,$5));
297: }
1.9 noro 298: | MAP '(' LCASE ',' node ')'
299: {
300: gen_searchf($3,(FUNC *)&val);
1.17 noro 301: print_crossref(val);
1.9 noro 302: $$ = mkfnode(2,I_MAP,val,mkfnode(1,I_LIST,$5));
303: }
304: | RECMAP '(' LCASE ',' node ')'
305: {
306: gen_searchf($3,(FUNC *)&val);
1.17 noro 307: print_crossref(val);
1.9 noro 308: $$ = mkfnode(2,I_RECMAP,val,mkfnode(1,I_LIST,$5));
1.29 ! noro 309: }
! 310: | UNIFY '(' expr ',' expr ')'
! 311: {
! 312: $$ = mkfnode(2,I_UNIFY,$3,$5);
1.9 noro 313: }
1.1 noro 314: | LCASE '{' node '}' '(' node ')'
315: {
316: searchpf($1,(FUNC *)&val);
317: $$ = mkfnode(2,I_PFDERIV,val,mkfnode(1,I_LIST,$6),mkfnode(1,I_LIST,$3));
318: }
319: | GETOPT '(' rawstr ')'
320: {
321: $$ = mkfnode(2,I_GETOPT,$3);
322: }
1.9 noro 323: | GETOPT '(' ')'
1.1 noro 324: {
1.9 noro 325: $$ = mkfnode(2,I_GETOPT,0);
1.1 noro 326: }
327: | TIMER '(' expr ',' expr ',' expr ')'
328: {
329: $$ = mkfnode(3,I_TIMER,$3,$5,$7);
1.12 noro 330: }
331: | PARIF '(' LCASE ')'
332: {
333: searchf(parif,$3,(FUNC *)&val);
334: if ( !val )
335: mkparif($3,(FUNC *)&val);
336: $$ = mkfnode(2,I_FUNC,val,0);
1.1 noro 337: }
338: | PARIF '(' LCASE ',' node ')'
339: {
340: searchf(parif,$3,(FUNC *)&val);
341: if ( !val )
342: mkparif($3,(FUNC *)&val);
343: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$5));
344: }
345: | '(' '*' expr ')' '(' node ')'
346: {
347: $$ = mkfnode(2,I_IFUNC,$3,mkfnode(1,I_LIST,$6));
1.26 noro 348: }
349: | UCASE '(' node ')'
350: {
351: if ( main_parser || allow_create_var )
352: t = mkfnode(2,I_PVAR,makepvar($1),0);
353: else {
354: ind = searchpvar($1);
355: if ( ind == -1 ) {
356: fprintf(stderr,"%s : no such variable.\n",$1);
357: YYABORT;
358: } else
359: t = mkfnode(2,I_PVAR,ind,0);
360: }
361: $$ = mkfnode(2,I_IFUNC,t,mkfnode(1,I_LIST,$3));
1.1 noro 362: }
363: | CAR '(' expr ')'
364: { $$ = mkfnode(1,I_CAR,$3); }
365: | CDR '(' expr ')'
366: { $$ = mkfnode(1,I_CDR,$3); }
367: | '(' expr ')'
1.8 noro 368: { $$ = mkfnode(1,I_PAREN,$2); }
1.1 noro 369: | UCASE
370: {
1.13 noro 371: if ( main_parser || allow_create_var )
1.1 noro 372: $$ = mkfnode(2,I_PVAR,makepvar($1),0);
373: else {
374: ind = searchpvar($1);
375: if ( ind == -1 ) {
376: fprintf(stderr,"%s : no such variable.\n",$1);
377: YYABORT;
378: } else
379: $$ = mkfnode(2,I_PVAR,ind,0);
380: }
381: }
382: | pexpr '[' expr ']'
383: {
384: if ( $1->id == I_PVAR || $1->id == I_INDEX ) {
385: appendtonode((NODE)$1->arg[1],(pointer)$3,&a);
386: $1->arg[1] = (pointer)a; $$ = $1;
387: } else {
388: MKNODE(a,$3,0);
389: $$ = mkfnode(2,I_INDEX,(pointer)$1,a);
390: }
391: }
392: | pexpr POINT rawstr
1.4 noro 393: { $$ = mkfnode(2,I_POINT,$1,$3); }
1.1 noro 394: ;
395: expr : pexpr
396: { $$ = $1; }
397: | '(' STRUCT rawstr ')' pexpr
398: { $$ = mkfnode(3,I_CAST,structtoindex($3),$5,0); }
399: | expr '=' expr
400: { $$ = mkfnode(2,I_ASSPVAR,$1,$3); }
401: | expr BOPASS expr
402: { $$ = mkfnode(2,I_ASSPVAR,$1,mkfnode(3,I_BOP,$2,$1,$3)); }
403: | expr SELF
404: { $$ = mkfnode(2,I_POSTSELF,$2,$1); }
405: | SELF expr
406: { $$ = mkfnode(2,I_PRESELF,$1,$2); }
407: | '[' node ']'
408: { $$ = mkfnode(1,I_LIST,$2); }
409: | '+' expr %prec PLUS
410: { $$ = $2; }
411: | '-' expr %prec MINUS
1.11 noro 412: { $$ = mkfnode(1,I_MINUS,$2); }
1.1 noro 413: | expr '+' expr
414: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
415: | expr '-' expr
416: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
417: | expr '*' expr
418: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
419: | expr '/' expr
420: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
421: | expr '%' expr
422: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
423: | expr '^' expr
424: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
425: | expr CMP expr
426: { $$ = mkfnode(3,I_COP,$2,$1,$3); }
427: | '!' expr
428: { $$ = mkfnode(1,I_NOT,$2); }
429: | expr OR expr
430: { $$ = mkfnode(2,I_OR,$1,$3); }
431: | expr AND expr
432: { $$ = mkfnode(2,I_AND,$1,$3); }
433: | FOP_NOT expr
434: { $$ = mkfnode(3,I_LOP,$1,$2,0); }
435: | expr FOP_AND expr
436: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
437: | expr FOP_OR expr
438: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
439: | expr FOP_IMPL expr
440: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
441: | expr FOP_REPL expr
442: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
443: | expr FOP_EQUIV expr
444: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
445: | expr LOP expr
446: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
447: | expr '?' expr ':' expr
448: { $$ = mkfnode(3,I_CE,$1,$3,$5); }
449: | '<' node '>'
450: { $$ = mkfnode(1,I_EV,$2); }
451: | NEWSTRUCT '(' rawstr ')'
452: { $$ = mkfnode(1,I_NEWCOMP,(int)structtoindex($3)); }
1.6 noro 453: | QUOTED '(' expr ')'
454: { MKQUOTE(quote,$3); $$ = mkfnode(1,I_FORMULA,(pointer)quote); }
1.21 noro 455: | '`' expr
456: { MKQUOTE(quote,$2); $$ = mkfnode(1,I_FORMULA,(pointer)quote); }
1.1 noro 457: ;
458: %%
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>