Annotation of OpenXM_contrib2/asir2000/parse/parse.y, Revision 1.15
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.15 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2000/parse/parse.y,v 1.14 2002/12/22 02:08:29 takayama 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.15 ! noro 66: extern int gdef,mgdef;
1.1 noro 67: extern SNODE parse_snode;
1.13 noro 68: extern int main_parser, allow_create_var;
1.1 noro 69:
70: int prresult;
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.15 ! noro 92: %token <i> STRUCT POINT NEWSTRUCT ANS FDEF PFDEF MODDEF GLOBAL MGLOBAL CMP OR AND CAR CDR QUOTED
1.10 noro 93: %token <i> DO WHILE FOR IF ELSE BREAK RETURN CONTINUE PARIF MAP RECMAP TIMER GF2NGEN GFPNGEN GFSNGEN GETOPT
1.1 noro 94: %token <i> FOP_AND FOP_OR FOP_IMPL FOP_REPL FOP_EQUIV FOP_NOT LOP
95: %token <p> FORMULA UCASE LCASE STR SELF BOPASS
96: %token <p> '+' '-' '*' '/' '^' '%'
97:
98: %type <p> desc rawstr
99: %type <f> expr pexpr opt
100: %type <s> stat complex
1.4 noro 101: %type <n> stats node _node pvars members optlist
1.1 noro 102:
103: %right '=' BOPASS
104: %right '?' ':'
105: %right FOP_NOT
106: %left FOP_EQUIV
107: %left FOP_REPL
108: %left FOP_IMPL
109: %left FOP_OR
110: %left FOP_AND
111: %left LOP
112: %left LCASE
113: %left OR
114: %left AND
115: %left '&'
116: %left CMP
117: %left '+' '-'
118: %left PLUS
119: %left MINUS
120: %left '*' '/' '%'
121: %right '^'
122: %right '!'
123: %right SELF
124: %left POINT
125:
126: %%
127:
128: start : stat
129: { parse_snode = $1; YYACCEPT; }
130: ;
131: stat : tail
132: { $$ = 0; }
133: | GLOBAL { gdef=1; } pvars { gdef=0; } tail
134: { $$ = 0; }
1.15 ! noro 135: | MGLOBAL { mgdef=1; } pvars { mgdef=0; } tail
! 136: { $$ = 0; }
1.4 noro 137: | STRUCT rawstr '{' members '}' tail
1.1 noro 138: { structdef($2,$4); $$ = 0; }
139: | expr tail
140: { $$ = mksnode(1,S_SINGLE,$1); }
141: | complex
142: { $$ = $1; }
143: | BREAK tail
144: { $$ = mksnode(0,S_BREAK); }
145: | CONTINUE tail
146: { $$ = mksnode(0,S_CONTINUE); }
147: | RETURN tail
148: { $$ = mksnode(1,S_RETURN,0); }
149: | RETURN expr tail
150: { $$ = mksnode(1,S_RETURN,$2); }
151: | IF '(' node ')' stat
152: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,0); $5?$$->ln=$5->ln:0; NOPR; }
153: | IF '(' node ')' stat ELSE stat
154: { $$ = mksnode(4,S_IFELSE,$1,$3,$5,$7); $7?$$->ln=$7->ln:0; NOPR; }
155: | FOR '(' node ';' node ';' node ')' stat
156: { $$ = mksnode(5,S_FOR,$1,$3,$5?$5:ONENODE,$7,$9); $9?$$->ln=$9->ln:0; NOPR; }
157: | WHILE '(' node ')' stat
158: { $$ = mksnode(5,S_FOR,$1,0,$3,0,$5); $5?$$->ln=$5->ln:0; NOPR; }
159: | DO stat WHILE '(' node ')' tail
160: { $$ = mksnode(3,S_DO,$1,$2,$5); }
161: | LCASE '(' node ')' ':' '=' expr tail
162: { $$ = mksnode(3,S_PFDEF,$1,$3,$7); NOPR; }
163: | PFDEF LCASE '(' node ')'
164: { $$ = mksnode(3,S_PFDEF,$2,$4,0); NOPR; }
165: | FDEF LCASE { mkpvs(); } '(' node ')' desc '{' stats '}'
166: {
167: mkuf($2,asir_infile->name,$5,
1.15 ! noro 168: mksnode(1,S_CPLX,$9),$1,asir_infile->ln,$7,CUR_MODULE);
1.1 noro 169: $$ = 0; NOPR;
1.15 ! noro 170: }
! 171: | MODDEF LCASE { CUR_MODULE = mkmodule($2); } '{' stats '}'
! 172: {
! 173: CUR_MODULE = 0;
! 174: $$ = 0; NOPR;
1.1 noro 175: }
176: | error tail
177: { yyerrok; $$ = 0; }
178: ;
179: tail : ';'
180: { if ( main_parser ) prresult = 1; }
181: | '$'
182: { if ( main_parser ) prresult = 0; }
1.14 takayama 183: ;
1.1 noro 184: desc :
185: { $$ = 0; }
186: | STR
187: { $$ = $1; }
188: ;
189: complex : '{' stats '}'
190: { $$ = mksnode(1,S_CPLX,$2); }
191: ;
192: members : rawstr
193: { MKNODE($$,$1,0); }
194: | members ',' rawstr
195: { appendtonode($1,$3,&$$); }
196: ;
197: pvars : UCASE
198: { val = (pointer)makepvar($1); MKNODE($$,val,0); }
199: | pvars ',' UCASE
200: { appendtonode($1,(pointer)makepvar($3),&$$); }
201: ;
202: stats :
203: { $$ = 0; }
204: | stats stat
205: { appendtonode($1,(pointer)$2,&$$); }
206: ;
207: node :
208: { $$ = 0; }
209: | _node
210: { $$ = $1; }
211: ;
212: _node : expr
213: { MKNODE($$,$1,0); }
214: | _node ',' expr
215: { appendtonode($1,(pointer)$3,&$$); }
216: ;
217: optlist : opt
218: { MKNODE($$,$1,0); }
219: | optlist ',' opt
220: { appendtonode($1,(pointer)$3,&$$); }
221: ;
222: rawstr : UCASE
223: { $$ = $1; }
224: | LCASE
225: { $$ = $1; }
226: ;
227: opt : rawstr '=' expr
228: { $$ = mkfnode(2,I_OPT,$1,$3); }
229: ;
230: pexpr : STR
231: { $$ = mkfnode(1,I_STR,$1); }
232: | FORMULA
233: { $$ = mkfnode(1,I_FORMULA,$1); }
234: | ANS
235: { $$ = mkfnode(1,I_ANS,$1); }
236: | GF2NGEN
237: { $$ = mkfnode(0,I_GF2NGEN); }
238: | GFPNGEN
239: { $$ = mkfnode(0,I_GFPNGEN); }
1.10 noro 240: | GFSNGEN
241: { $$ = mkfnode(0,I_GFSNGEN); }
1.1 noro 242: | LCASE
243: {
244: FUNC f;
245:
246: searchf(noargsysf,$1,&f);
247: if ( f )
248: $$ = mkfnode(2,I_FUNC,f,0);
249: else {
250: searchc($1,&f);
251: if ( f )
252: $$ = mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,0));
253: else {
254: searchf(sysf,$1,&f);
255: if ( !f )
256: searchf(ubinf,$1,&f);
257: if ( !f )
258: searchpf($1,&f);
259: if ( !f )
260: searchf(usrf,$1,&f);
261: if ( f )
262: makesrvar(f,(P *)&val);
263: else
264: makevar($1,(P *)&val);
265: $$ = mkfnode(1,I_FORMULA,val);
266: }
267: }
268: }
269: | LCASE '(' node ')'
270: {
1.9 noro 271: gen_searchf($1,(FUNC *)&val);
1.1 noro 272: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$3));
273: }
274:
275: | LCASE '(' node '|' optlist ')'
276: {
1.9 noro 277: gen_searchf($1,(FUNC *)&val);
1.1 noro 278: $$ = mkfnode(3,I_FUNC_OPT,val,
279: mkfnode(1,I_LIST,$3),mkfnode(1,I_LIST,$5));
280: }
1.9 noro 281: | MAP '(' LCASE ',' node ')'
282: {
283: gen_searchf($3,(FUNC *)&val);
284: $$ = mkfnode(2,I_MAP,val,mkfnode(1,I_LIST,$5));
285: }
286: | RECMAP '(' LCASE ',' node ')'
287: {
288: gen_searchf($3,(FUNC *)&val);
289: $$ = mkfnode(2,I_RECMAP,val,mkfnode(1,I_LIST,$5));
290: }
1.1 noro 291: | LCASE '{' node '}' '(' node ')'
292: {
293: searchpf($1,(FUNC *)&val);
294: $$ = mkfnode(2,I_PFDERIV,val,mkfnode(1,I_LIST,$6),mkfnode(1,I_LIST,$3));
295: }
296: | GETOPT '(' rawstr ')'
297: {
298: $$ = mkfnode(2,I_GETOPT,$3);
299: }
1.9 noro 300: | GETOPT '(' ')'
1.1 noro 301: {
1.9 noro 302: $$ = mkfnode(2,I_GETOPT,0);
1.1 noro 303: }
304: | TIMER '(' expr ',' expr ',' expr ')'
305: {
306: $$ = mkfnode(3,I_TIMER,$3,$5,$7);
1.12 noro 307: }
308: | PARIF '(' LCASE ')'
309: {
310: searchf(parif,$3,(FUNC *)&val);
311: if ( !val )
312: mkparif($3,(FUNC *)&val);
313: $$ = mkfnode(2,I_FUNC,val,0);
1.1 noro 314: }
315: | PARIF '(' LCASE ',' node ')'
316: {
317: searchf(parif,$3,(FUNC *)&val);
318: if ( !val )
319: mkparif($3,(FUNC *)&val);
320: $$ = mkfnode(2,I_FUNC,val,mkfnode(1,I_LIST,$5));
321: }
322: | '(' '*' expr ')' '(' node ')'
323: {
324: $$ = mkfnode(2,I_IFUNC,$3,mkfnode(1,I_LIST,$6));
325: }
326: | CAR '(' expr ')'
327: { $$ = mkfnode(1,I_CAR,$3); }
328: | CDR '(' expr ')'
329: { $$ = mkfnode(1,I_CDR,$3); }
330: | '(' expr ')'
1.8 noro 331: { $$ = mkfnode(1,I_PAREN,$2); }
1.1 noro 332: | UCASE
333: {
1.13 noro 334: if ( main_parser || allow_create_var )
1.1 noro 335: $$ = mkfnode(2,I_PVAR,makepvar($1),0);
336: else {
337: ind = searchpvar($1);
338: if ( ind == -1 ) {
339: fprintf(stderr,"%s : no such variable.\n",$1);
340: YYABORT;
341: } else
342: $$ = mkfnode(2,I_PVAR,ind,0);
343: }
344: }
345: | pexpr '[' expr ']'
346: {
347: if ( $1->id == I_PVAR || $1->id == I_INDEX ) {
348: appendtonode((NODE)$1->arg[1],(pointer)$3,&a);
349: $1->arg[1] = (pointer)a; $$ = $1;
350: } else {
351: MKNODE(a,$3,0);
352: $$ = mkfnode(2,I_INDEX,(pointer)$1,a);
353: }
354: }
355: | pexpr POINT rawstr
1.4 noro 356: { $$ = mkfnode(2,I_POINT,$1,$3); }
1.1 noro 357: ;
358: expr : pexpr
359: { $$ = $1; }
360: | '(' STRUCT rawstr ')' pexpr
361: { $$ = mkfnode(3,I_CAST,structtoindex($3),$5,0); }
362: | expr '=' expr
363: { $$ = mkfnode(2,I_ASSPVAR,$1,$3); }
364: | expr BOPASS expr
365: { $$ = mkfnode(2,I_ASSPVAR,$1,mkfnode(3,I_BOP,$2,$1,$3)); }
366: | expr SELF
367: { $$ = mkfnode(2,I_POSTSELF,$2,$1); }
368: | SELF expr
369: { $$ = mkfnode(2,I_PRESELF,$1,$2); }
370: | '[' node ']'
371: { $$ = mkfnode(1,I_LIST,$2); }
372: | '+' expr %prec PLUS
373: { $$ = $2; }
374: | '-' expr %prec MINUS
1.11 noro 375: { $$ = mkfnode(1,I_MINUS,$2); }
1.1 noro 376: | expr '+' expr
377: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
378: | expr '-' expr
379: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
380: | expr '*' expr
381: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
382: | expr '/' expr
383: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
384: | expr '%' expr
385: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
386: | expr '^' expr
387: { $$ = mkfnode(3,I_BOP,$2,$1,$3); }
388: | expr CMP expr
389: { $$ = mkfnode(3,I_COP,$2,$1,$3); }
390: | '!' expr
391: { $$ = mkfnode(1,I_NOT,$2); }
392: | expr OR expr
393: { $$ = mkfnode(2,I_OR,$1,$3); }
394: | expr AND expr
395: { $$ = mkfnode(2,I_AND,$1,$3); }
396: | FOP_NOT expr
397: { $$ = mkfnode(3,I_LOP,$1,$2,0); }
398: | expr FOP_AND expr
399: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
400: | expr FOP_OR expr
401: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
402: | expr FOP_IMPL expr
403: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
404: | expr FOP_REPL expr
405: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
406: | expr FOP_EQUIV expr
407: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
408: | expr LOP expr
409: { $$ = mkfnode(3,I_LOP,$2,$1,$3); }
410: | expr '?' expr ':' expr
411: { $$ = mkfnode(3,I_CE,$1,$3,$5); }
412: | '<' node '>'
413: { $$ = mkfnode(1,I_EV,$2); }
414: | NEWSTRUCT '(' rawstr ')'
415: { $$ = mkfnode(1,I_NEWCOMP,(int)structtoindex($3)); }
1.6 noro 416: | QUOTED '(' expr ')'
417: { MKQUOTE(quote,$3); $$ = mkfnode(1,I_FORMULA,(pointer)quote); }
1.1 noro 418: ;
419: %%
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>