|
|
1.1 root 1: # define OR 257
2: # define AND 258
3: # define ADD 259
4: # define SUBT 260
5: # define MULT 261
6: # define DIV 262
7: # define REM 263
8: # define EQ 264
9: # define GT 265
10: # define GEQ 266
11: # define LT 267
12: # define LEQ 268
13: # define NEQ 269
14: # define A_STRING 270
15: # define SUBSTR 271
16: # define LENGTH 272
17: # define INDEX 273
18: # define NOARG 274
19: # define MATCH 275
20: # define MCH 276
21: #define yyclearin yychar = -1
22: #define yyerrok yyerrflag = 0
23: extern int yychar;
24: extern short yyerrflag;
25: #ifndef YYMAXDEPTH
26: #define YYMAXDEPTH 150
27: #endif
28: #ifndef YYSTYPE
29: #define YYSTYPE int
30: #endif
31: YYSTYPE yylval, yyval;
32: # define YYERRCODE 256
33:
34: # line 48 "expr.y"
35:
36: /* expression command */
37: #include <stdio.h>
38: #define ESIZE 256
39: #define error(c) errxx(c)
40: #define EQL(x,y) !strcmp(x,y)
41: long atol();
42: char **Av;
43: int Ac;
44: int Argi;
45:
46: char Mstring[1][128];
47: char *malloc();
48: extern int nbra;
49:
50: main(argc, argv) char **argv; {
51: Ac = argc;
52: Argi = 1;
53: Av = argv;
54: yyparse();
55: }
56:
57: char *operators[] = { "|", "&", "+", "-", "*", "/", "%", ":",
58: "=", "==", "<", "<=", ">", ">=", "!=",
59: "match", "substr", "length", "index", "\0" };
60: int op[] = { OR, AND, ADD, SUBT, MULT, DIV, REM, MCH,
61: EQ, EQ, LT, LEQ, GT, GEQ, NEQ,
62: MATCH, SUBSTR, LENGTH, INDEX };
63: yylex() {
64: register char *p;
65: register i;
66:
67: if(Argi >= Ac) return NOARG;
68:
69: p = Av[Argi++];
70:
71: if(*p == '(' || *p == ')')
72: return (int)*p;
73: for(i = 0; *operators[i]; ++i)
74: if(EQL(operators[i], p))
75: return op[i];
76:
77: yylval = p;
78: return A_STRING;
79: }
80:
81: char *rel(op, r1, r2) register char *r1, *r2; {
82: register long i;
83:
84: if(ematch(r1, "-*[0-9]*$") && ematch(r2, "[0-9]*$"))
85: i = atol(r1) - atol(r2);
86: else
87: i = strcmp(r1, r2);
88: switch(op) {
89: case EQ: i = i==0; break;
90: case GT: i = i>0; break;
91: case GEQ: i = i>=0; break;
92: case LT: i = i<0; break;
93: case LEQ: i = i<=0; break;
94: case NEQ: i = i!=0; break;
95: }
96: return i? "1": "0";
97: }
98:
99: char *arith(op, r1, r2) char *r1, *r2; {
100: long i1, i2;
101: register char *rv;
102:
103: if(!(ematch(r1, "[0-9]*$") && ematch(r2, "[0-9]*$")))
104: yyerror("non-numeric argument");
105: i1 = atol(r1);
106: i2 = atol(r2);
107:
108: switch(op) {
109: case ADD: i1 = i1 + i2; break;
110: case SUBT: i1 = i1 - i2; break;
111: case MULT: i1 = i1 * i2; break;
112: case DIV: i1 = i1 / i2; break;
113: case REM: i1 = i1 % i2; break;
114: }
115: rv = malloc(16);
116: sprintf(rv, "%D", i1);
117: return rv;
118: }
119: char *conj(op, r1, r2) char *r1, *r2; {
120: register char *rv;
121:
122: switch(op) {
123:
124: case OR:
125: if(EQL(r1, "0")
126: || EQL(r1, ""))
127: if(EQL(r2, "0")
128: || EQL(r2, ""))
129: rv = "0";
130: else
131: rv = r2;
132: else
133: rv = r1;
134: break;
135: case AND:
136: if(EQL(r1, "0")
137: || EQL(r1, ""))
138: rv = "0";
139: else if(EQL(r2, "0")
140: || EQL(r2, ""))
141: rv = "0";
142: else
143: rv = r1;
144: break;
145: }
146: return rv;
147: }
148:
149: char *substr(v, s, w) char *v, *s, *w; {
150: register si, wi;
151: register char *res;
152:
153: si = atol(s);
154: wi = atol(w);
155: while(--si) if(*v) ++v;
156:
157: res = v;
158:
159: while(wi--) if(*v) ++v;
160:
161: *v = '\0';
162: return res;
163: }
164:
165: char *length(s) register char *s; {
166: register i = 0;
167: register char *rv;
168:
169: while(*s++) ++i;
170:
171: rv = malloc(8);
172: sprintf(rv, "%d", i);
173: return rv;
174: }
175:
176: char *index(s, t) char *s, *t; {
177: register i, j;
178: register char *rv;
179:
180: for(i = 0; s[i] ; ++i)
181: for(j = 0; t[j] ; ++j)
182: if(s[i]==t[j]) {
183: sprintf(rv = malloc(8), "%d", ++i);
184: return rv;
185: }
186: return "0";
187: }
188:
189: char *match(s, p)
190: {
191: register char *rv;
192:
193: sprintf(rv = malloc(8), "%d", ematch(s, p));
194: if(nbra) {
195: rv = malloc(strlen(Mstring[0])+1);
196: strcpy(rv, Mstring[0]);
197: }
198: return rv;
199: }
200:
201: #define INIT register char *sp = instring;
202: #define GETC() (*sp++)
203: #define PEEKC() (*sp)
204: #define UNGETC(c) (--sp)
205: #define RETURN(c) return
206: #define ERROR(c) errxx(c)
207:
208:
209: ematch(s, p)
210: char *s;
211: register char *p;
212: {
213: static char expbuf[ESIZE];
214: char *compile();
215: register num;
216: extern char *braslist[], *braelist[], *loc2;
217:
218: compile(p, expbuf, &expbuf[ESIZE], 0);
219: if(nbra > 1)
220: yyerror("Too many '\\('s");
221: if(advance(s, expbuf)) {
222: if(nbra == 1) {
223: p = braslist[0];
224: num = braelist[0] - p;
225: strncpy(Mstring[0], p, num);
226: Mstring[0][num] = '\0';
227: }
228: return(loc2-s);
229: }
230: return(0);
231: }
232:
233: errxx(c)
234: {
235: yyerror("RE error");
236: }
237:
238: #define CBRA 2
239: #define CCHR 4
240: #define CDOT 8
241: #define CCL 12
242: #define CDOL 20
243: #define CEOF 22
244: #define CKET 24
245: #define CBACK 36
246:
247: #define STAR 01
248: #define RNGE 03
249:
250: #define NBRA 9
251:
252: #define PLACE(c) ep[c >> 3] |= bittab[c & 07]
253: #define ISTHERE(c) (ep[c >> 3] & bittab[c & 07])
254:
255: char *braslist[NBRA];
256: char *braelist[NBRA];
257: int nbra;
258: char *loc1, *loc2, *locs;
259: int sed;
260:
261: int circf;
262: int low;
263: int size;
264:
265: char bittab[] = {
266: 1,
267: 2,
268: 4,
269: 8,
270: 16,
271: 32,
272: 64,
273: 128
274: };
275:
276: char *
277: compile(instring, ep, endbuf, seof)
278: register char *ep;
279: char *instring, *endbuf;
280: {
281: INIT /* Dependent declarations and initializations */
282: register c;
283: register eof = seof;
284: char *lastep = instring;
285: int cclcnt;
286: char bracket[NBRA], *bracketp;
287: int closed;
288: char neg;
289: int lc;
290: int i, cflg;
291:
292: lastep = 0;
293: if((c = GETC()) == eof) {
294: if(*ep == 0 && !sed)
295: ERROR(41);
296: RETURN(ep);
297: }
298: bracketp = bracket;
299: circf = closed = nbra = 0;
300: if (c == '^')
301: circf++;
302: else
303: UNGETC(c);
304: for (;;) {
305: if (ep >= endbuf)
306: ERROR(50);
307: if((c = GETC()) != '*' && ((c != '\\') || (PEEKC() != '{')))
308: lastep = ep;
309: if (c == eof) {
310: *ep++ = CEOF;
311: RETURN(ep);
312: }
313: switch (c) {
314:
315: case '.':
316: *ep++ = CDOT;
317: continue;
318:
319: case '\n':
320: ERROR(36);
321: case '*':
322: if (lastep==0 || *lastep==CBRA || *lastep==CKET)
323: goto defchar;
324: *lastep |= STAR;
325: continue;
326:
327: case '$':
328: if(PEEKC() != eof)
329: goto defchar;
330: *ep++ = CDOL;
331: continue;
332:
333: case '[':
334: if(&ep[17] >= endbuf)
335: ERROR(50);
336:
337: *ep++ = CCL;
338: lc = 0;
339: for(i = 0; i < 16; i++)
340: ep[i] = 0;
341:
342: neg = 0;
343: if((c = GETC()) == '^') {
344: neg = 1;
345: c = GETC();
346: }
347:
348: do {
349: if(c == '\0' || c == '\n')
350: ERROR(49);
351: if(c == '-' && lc != 0) {
352: if ((c = GETC()) == ']') {
353: PLACE('-');
354: break;
355: }
356: while(lc < c) {
357: PLACE(lc);
358: lc++;
359: }
360: }
361: lc = c;
362: PLACE(c);
363: } while((c = GETC()) != ']');
364: if(neg) {
365: for(cclcnt = 0; cclcnt < 16; cclcnt++)
366: ep[cclcnt] ^= -1;
367: ep[0] &= 0376;
368: }
369:
370: ep += 16;
371:
372: continue;
373:
374: case '\\':
375: switch(c = GETC()) {
376:
377: case '(':
378: if(nbra >= NBRA)
379: ERROR(43);
380: *bracketp++ = nbra;
381: *ep++ = CBRA;
382: *ep++ = nbra++;
383: continue;
384:
385: case ')':
386: if(bracketp <= bracket)
387: ERROR(42);
388: *ep++ = CKET;
389: *ep++ = *--bracketp;
390: closed++;
391: continue;
392:
393: case '{':
394: if(lastep == (char *) (0))
395: goto defchar;
396: *lastep |= RNGE;
397: cflg = 0;
398: nlim:
399: c = GETC();
400: i = 0;
401: do {
402: if ('0' <= c && c <= '9')
403: i = 10 * i + c - '0';
404: else
405: ERROR(16);
406: } while(((c = GETC()) != '\\') && (c != ','));
407: if (i > 255)
408: ERROR(11);
409: *ep++ = i;
410: if (c == ',') {
411: if(cflg++)
412: ERROR(44);
413: if((c = GETC()) == '\\')
414: *ep++ = 255;
415: else {
416: UNGETC(c);
417: goto nlim; /* get 2'nd number */
418: }
419: }
420: if(GETC() != '}')
421: ERROR(45);
422: if(!cflg) /* one number */
423: *ep++ = i;
424: else if((ep[-1] & 0377) < (ep[-2] & 0377))
425: ERROR(46);
426: continue;
427:
428: case '\n':
429: ERROR(36);
430:
431: case 'n':
432: c = '\n';
433: goto defchar;
434:
435: default:
436: if(c >= '1' && c <= '9') {
437: if((c -= '1') >= closed)
438: ERROR(25);
439: *ep++ = CBACK;
440: *ep++ = c;
441: continue;
442: }
443: }
444: /* Drop through to default to use \ to turn off special chars */
445:
446: defchar:
447: default:
448: lastep = ep;
449: *ep++ = CCHR;
450: *ep++ = c;
451: }
452: }
453: }
454:
455: step(p1, p2)
456: register char *p1, *p2;
457: {
458: register c;
459:
460: if (circf) {
461: loc1 = p1;
462: return(advance(p1, p2));
463: }
464: /* fast check for first character */
465: if (*p2==CCHR) {
466: c = p2[1];
467: do {
468: if (*p1 != c)
469: continue;
470: if (advance(p1, p2)) {
471: loc1 = p1;
472: return(1);
473: }
474: } while (*p1++);
475: return(0);
476: }
477: /* regular algorithm */
478: do {
479: if (advance(p1, p2)) {
480: loc1 = p1;
481: return(1);
482: }
483: } while (*p1++);
484: return(0);
485: }
486:
487: advance(lp, ep)
488: register char *lp, *ep;
489: {
490: register char *curlp;
491: char c;
492: char *bbeg;
493: int ct;
494:
495: for (;;) switch (*ep++) {
496:
497: case CCHR:
498: if (*ep++ == *lp++)
499: continue;
500: return(0);
501:
502: case CDOT:
503: if (*lp++)
504: continue;
505: return(0);
506:
507: case CDOL:
508: if (*lp==0)
509: continue;
510: return(0);
511:
512: case CEOF:
513: loc2 = lp;
514: return(1);
515:
516: case CCL:
517: c = *lp++ & 0177;
518: if(ISTHERE(c)) {
519: ep += 16;
520: continue;
521: }
522: return(0);
523: case CBRA:
524: braslist[*ep++] = lp;
525: continue;
526:
527: case CKET:
528: braelist[*ep++] = lp;
529: continue;
530:
531: case CCHR|RNGE:
532: c = *ep++;
533: getrnge(ep);
534: while(low--)
535: if(*lp++ != c)
536: return(0);
537: curlp = lp;
538: while(size--)
539: if(*lp++ != c)
540: break;
541: if(size < 0)
542: lp++;
543: ep += 2;
544: goto star;
545:
546: case CDOT|RNGE:
547: getrnge(ep);
548: while(low--)
549: if(*lp++ == '\0')
550: return(0);
551: curlp = lp;
552: while(size--)
553: if(*lp++ == '\0')
554: break;
555: if(size < 0)
556: lp++;
557: ep += 2;
558: goto star;
559:
560: case CCL|RNGE:
561: getrnge(ep + 16);
562: while(low--) {
563: c = *lp++ & 0177;
564: if(!ISTHERE(c))
565: return(0);
566: }
567: curlp = lp;
568: while(size--) {
569: c = *lp++ & 0177;
570: if(!ISTHERE(c))
571: break;
572: }
573: if(size < 0)
574: lp++;
575: ep += 18; /* 16 + 2 */
576: goto star;
577:
578: case CBACK:
579: bbeg = braslist[*ep];
580: ct = braelist[*ep++] - bbeg;
581:
582: if(ecmp(bbeg, lp, ct)) {
583: lp += ct;
584: continue;
585: }
586: return(0);
587:
588: case CBACK|STAR:
589: bbeg = braslist[*ep];
590: ct = braelist[*ep++] - bbeg;
591: curlp = lp;
592: while(ecmp(bbeg, lp, ct))
593: lp += ct;
594:
595: while(lp >= curlp) {
596: if(advance(lp, ep)) return(1);
597: lp -= ct;
598: }
599: return(0);
600:
601:
602: case CDOT|STAR:
603: curlp = lp;
604: while (*lp++);
605: goto star;
606:
607: case CCHR|STAR:
608: curlp = lp;
609: while (*lp++ == *ep);
610: ep++;
611: goto star;
612:
613: case CCL|STAR:
614: curlp = lp;
615: do {
616: c = *lp++ & 0177;
617: } while(ISTHERE(c));
618: ep += 16;
619: goto star;
620:
621: star:
622: do {
623: if(--lp == locs)
624: break;
625: if (advance(lp, ep))
626: return(1);
627: } while (lp > curlp);
628: return(0);
629:
630: }
631: }
632:
633: getrnge(str)
634: register char *str;
635: {
636: low = *str++ & 0377;
637: size = *str == 255 ? 20000 : (*str &0377) - low;
638: }
639:
640: ecmp(a, b, count)
641: register char *a, *b;
642: register count;
643: {
644: if(a == b) /* should have been caught in compile() */
645: error(51);
646: while(count--)
647: if(*a++ != *b++) return(0);
648: return(1);
649: }
650:
651: static char *sccsid = "@(#)expr.y 4.3 (Berkeley) 6/30/83";
652: yyerror(s)
653:
654: {
655: fprintf(stderr, "%s\n", s);
656: exit(2);
657: }
658: short yyexca[] ={
659: -1, 1,
660: 0, -1,
661: -2, 0,
662: };
663: # define YYNPROD 22
664: # define YYLAST 270
665: short yyact[]={
666:
667: 3, 10, 11, 18, 19, 20, 21, 22, 12, 13,
668: 14, 15, 16, 17, 23, 1, 0, 0, 9, 0,
669: 23, 43, 11, 18, 19, 20, 21, 22, 12, 13,
670: 14, 15, 16, 17, 3, 18, 19, 20, 21, 22,
671: 23, 18, 19, 20, 21, 22, 12, 13, 14, 15,
672: 16, 17, 23, 20, 21, 22, 0, 0, 23, 2,
673: 0, 0, 0, 24, 25, 26, 27, 28, 23, 0,
674: 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
675: 39, 40, 41, 42, 0, 44, 45, 0, 46, 0,
676: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
677: 0, 0, 0, 0, 0, 47, 0, 0, 0, 0,
678: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
679: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
680: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
681: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
682: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
683: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
684: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
685: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
686: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
687: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
688: 0, 0, 0, 0, 0, 0, 0, 10, 11, 18,
689: 19, 20, 21, 22, 12, 13, 14, 15, 16, 17,
690: 8, 5, 6, 7, 0, 4, 23, 10, 11, 18,
691: 19, 20, 21, 22, 12, 13, 14, 15, 16, 17,
692: 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,
693: 0, 0, 0, 0, 8, 5, 6, 7, 0, 4 };
694: short yypact[]={
695:
696: -6,-1000,-256, -6, -6, -6, -6, -6,-1000,-1000,
697: -6, -6, -6, -6, -6, -6, -6, -6, -6, -6,
698: -6, -6, -6, -6, -20, -40, -40,-1000, -40,-236,
699: -218,-224,-224,-224,-224,-224,-224,-208,-208,-262,
700: -262,-262,-1000,-1000,-1000, -40,-1000,-1000 };
701: short yypgo[]={
702:
703: 0, 15, 59 };
704: short yyr1[]={
705:
706: 0, 1, 2, 2, 2, 2, 2, 2, 2, 2,
707: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
708: 2, 2 };
709: short yyr2[]={
710:
711: 0, 2, 3, 3, 3, 3, 3, 3, 3, 3,
712: 3, 3, 3, 3, 3, 3, 3, 3, 4, 2,
713: 3, 1 };
714: short yychk[]={
715:
716: -1000, -1, -2, 40, 275, 271, 272, 273, 270, 274,
717: 257, 258, 264, 265, 266, 267, 268, 269, 259, 260,
718: 261, 262, 263, 276, -2, -2, -2, -2, -2, -2,
719: -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
720: -2, -2, -2, 41, -2, -2, -2, -2 };
721: short yydef[]={
722:
723: 0, -2, 0, 0, 0, 0, 0, 0, 21, 1,
724: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
725: 0, 0, 0, 0, 0, 0, 0, 19, 0, 3,
726: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
727: 14, 15, 16, 2, 17, 0, 20, 18 };
728: #ifndef lint
729: static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83";
730: #endif not lint
731:
732: #
733: # define YYFLAG -1000
734: # define YYERROR goto yyerrlab
735: # define YYACCEPT return(0)
736: # define YYABORT return(1)
737:
738: /* parser for yacc output */
739:
740: #ifdef YYDEBUG
741: int yydebug = 0; /* 1 for debugging */
742: #endif
743: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
744: int yychar = -1; /* current input token number */
745: int yynerrs = 0; /* number of errors */
746: short yyerrflag = 0; /* error recovery flag */
747:
748: yyparse() {
749:
750: short yys[YYMAXDEPTH];
751: short yyj, yym;
752: register YYSTYPE *yypvt;
753: register short yystate, *yyps, yyn;
754: register YYSTYPE *yypv;
755: register short *yyxi;
756:
757: yystate = 0;
758: yychar = -1;
759: yynerrs = 0;
760: yyerrflag = 0;
761: yyps= &yys[-1];
762: yypv= &yyv[-1];
763:
764: yystack: /* put a state and value onto the stack */
765:
766: #ifdef YYDEBUG
767: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
768: #endif
769: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
770: *yyps = yystate;
771: ++yypv;
772: *yypv = yyval;
773:
774: yynewstate:
775:
776: yyn = yypact[yystate];
777:
778: if( yyn<= YYFLAG ) goto yydefault; /* simple state */
779:
780: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
781: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
782:
783: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
784: yychar = -1;
785: yyval = yylval;
786: yystate = yyn;
787: if( yyerrflag > 0 ) --yyerrflag;
788: goto yystack;
789: }
790:
791: yydefault:
792: /* default state action */
793:
794: if( (yyn=yydef[yystate]) == -2 ) {
795: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
796: /* look through exception table */
797:
798: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
799:
800: while( *(yyxi+=2) >= 0 ){
801: if( *yyxi == yychar ) break;
802: }
803: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
804: }
805:
806: if( yyn == 0 ){ /* error */
807: /* error ... attempt to resume parsing */
808:
809: switch( yyerrflag ){
810:
811: case 0: /* brand new error */
812:
813: yyerror( "syntax error" );
814: yyerrlab:
815: ++yynerrs;
816:
817: case 1:
818: case 2: /* incompletely recovered error ... try again */
819:
820: yyerrflag = 3;
821:
822: /* find a state where "error" is a legal shift action */
823:
824: while ( yyps >= yys ) {
825: yyn = yypact[*yyps] + YYERRCODE;
826: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
827: yystate = yyact[yyn]; /* simulate a shift of "error" */
828: goto yystack;
829: }
830: yyn = yypact[*yyps];
831:
832: /* the current yyps has no shift onn "error", pop stack */
833:
834: #ifdef YYDEBUG
835: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
836: #endif
837: --yyps;
838: --yypv;
839: }
840:
841: /* there is no state on the stack with an error shift ... abort */
842:
843: yyabort:
844: return(1);
845:
846:
847: case 3: /* no shift yet; clobber input char */
848:
849: #ifdef YYDEBUG
850: if( yydebug ) printf( "error recovery discards char %d\n", yychar );
851: #endif
852:
853: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
854: yychar = -1;
855: goto yynewstate; /* try again in the same state */
856:
857: }
858:
859: }
860:
861: /* reduction by production yyn */
862:
863: #ifdef YYDEBUG
864: if( yydebug ) printf("reduce %d\n",yyn);
865: #endif
866: yyps -= yyr2[yyn];
867: yypvt = yypv;
868: yypv -= yyr2[yyn];
869: yyval = yypv[1];
870: yym=yyn;
871: /* consult goto table to find next state */
872: yyn = yyr1[yyn];
873: yyj = yypgo[yyn] + *yyps + 1;
874: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
875: switch(yym){
876:
877: case 1:
878: # line 20 "expr.y"
879: {
880: printf("%s\n", yypvt[-1]);
881: exit((!strcmp(yypvt[-1],"0")||!strcmp(yypvt[-1],"\0"))? 1: 0);
882: } break;
883: case 2:
884: # line 27 "expr.y"
885: { yyval = yypvt[-1]; } break;
886: case 3:
887: # line 28 "expr.y"
888: { yyval = conj(OR, yypvt[-2], yypvt[-0]); } break;
889: case 4:
890: # line 29 "expr.y"
891: { yyval = conj(AND, yypvt[-2], yypvt[-0]); } break;
892: case 5:
893: # line 30 "expr.y"
894: { yyval = rel(EQ, yypvt[-2], yypvt[-0]); } break;
895: case 6:
896: # line 31 "expr.y"
897: { yyval = rel(GT, yypvt[-2], yypvt[-0]); } break;
898: case 7:
899: # line 32 "expr.y"
900: { yyval = rel(GEQ, yypvt[-2], yypvt[-0]); } break;
901: case 8:
902: # line 33 "expr.y"
903: { yyval = rel(LT, yypvt[-2], yypvt[-0]); } break;
904: case 9:
905: # line 34 "expr.y"
906: { yyval = rel(LEQ, yypvt[-2], yypvt[-0]); } break;
907: case 10:
908: # line 35 "expr.y"
909: { yyval = rel(NEQ, yypvt[-2], yypvt[-0]); } break;
910: case 11:
911: # line 36 "expr.y"
912: { yyval = arith(ADD, yypvt[-2], yypvt[-0]); } break;
913: case 12:
914: # line 37 "expr.y"
915: { yyval = arith(SUBT, yypvt[-2], yypvt[-0]); } break;
916: case 13:
917: # line 38 "expr.y"
918: { yyval = arith(MULT, yypvt[-2], yypvt[-0]); } break;
919: case 14:
920: # line 39 "expr.y"
921: { yyval = arith(DIV, yypvt[-2], yypvt[-0]); } break;
922: case 15:
923: # line 40 "expr.y"
924: { yyval = arith(REM, yypvt[-2], yypvt[-0]); } break;
925: case 16:
926: # line 41 "expr.y"
927: { yyval = match(yypvt[-2], yypvt[-0]); } break;
928: case 17:
929: # line 42 "expr.y"
930: { yyval = match(yypvt[-1], yypvt[-0]); } break;
931: case 18:
932: # line 43 "expr.y"
933: { yyval = substr(yypvt[-2], yypvt[-1], yypvt[-0]); } break;
934: case 19:
935: # line 44 "expr.y"
936: { yyval = length(yypvt[-0]); } break;
937: case 20:
938: # line 45 "expr.y"
939: { yyval = index(yypvt[-1], yypvt[-0]); } break;
940: }
941: goto yystack; /* stack new state and value */
942:
943: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.