|
|
1.1 ! root 1: ! 2: /* ! 3: ** GRAMMAR.Y ! 4: ** ! 5: ** This file contains a grammar for ingres parsing. It is setup ! 6: ** for the (7-31-78) version of yacc. ! 7: ** ! 8: ** Use: ! 9: ** to use for non-distributed ingres: ! 10: ** grep -v "DDD" > grammar.y ! 11: ** ! 12: ** Trace Flags: ! 13: ** Grammar.y ~~ 38, 39 ! 14: */ ! 15: ! 16: %{ ! 17: /* SCANNER/PARSER GLOBALS & TABLES */ ! 18: # include <ingres.h> ! 19: # include <aux.h> ! 20: # include <tree.h> ! 21: # include <symbol.h> ! 22: # include <pv.h> ! 23: # include "parser.h" ! 24: # include <sccs.h> ! 25: # include <errors.h> ! 26: ! 27: SCCSID(@(#)grammar.y 8.4 3/2/85) ! 28: ! 29: # ifdef xPTR1 ! 30: # define YYDEBUG ! 31: # endif ! 32: ! 33: int i; ! 34: struct atstash *aptr; ! 35: char permbuf[3]; ! 36: /* space for two names, their null bytes and the seperator */ ! 37: char modbuf[(2 * (MAXNAME + 1)) + 1]; ! 38: static char hqmbuf[2]; ! 39: ! 40: extern DESC Reldesc; ! 41: extern int Opflag; ! 42: extern QTREE *Lastree; ! 43: extern QTREE *Tidnode; ! 44: extern int Rsdmno; ! 45: extern int Resrng; ! 46: extern int Qrymod; ! 47: extern int Permcomd; ! 48: extern char *Trname; ! 49: extern int Qlflag; ! 50: extern struct atstash Faketid; ! 51: extern char *Tuple; ! 52: extern TID tid; ! 53: ! 54: # ifdef DISTRIB ! 55: extern struct atstash Fakesid; ! 56: # endif ! 57: ! 58: extern char *Indexname; ! 59: ! 60: extern QTREE *tree(); ! 61: extern QTREE *tlprepend(); ! 62: extern QTREE *addresdom(); ! 63: extern QTREE *xdot(); ! 64: extern QTREE *norml(); ! 65: extern struct atstash *attlookup(); ! 66: extern int rngent(); ! 67: extern int rnglook(); ! 68: extern PARRNG Parrng[]; ! 69: extern STRKEEPER *substring(),*endvals(); ! 70: %} ! 71: ! 72: /* NEW BEGIN-END THINGS */ ! 73: %start program ! 74: ! 75: /* UNION YYSTYPE DEFINED */ ! 76: %union ! 77: { ! 78: int type_type; /* OPERATOR TYPES ETC. */ ! 79: QTREE *tree_type; ! 80: int rng_type; ! 81: char char_type; ! 82: int int_type; ! 83: short *I2_type; ! 84: long *I4_type; ! 85: float *F4_type; ! 86: double *F8_type; ! 87: char *string_type; ! 88: STRKEEPER *substr_type; ! 89: } ! 90: ! 91: /* COMMANDS */ ! 92: %token APPEND COPY CREATE DELETE DESTROY HELP INDEX MODIFY ! 93: %token PRINT RANGE REPLACE RETRIEVE SAVE ! 94: %token DEFINE PERMIT VIEW INTEGRITY ! 95: %token DELIM USE UNUSE ! 96: /*DDD*/%token DISTRIBUTE ! 97: ! 98: /* 'NOISE' WORDS */ ! 99: %token ALL BY FROM IN INTO UNIQUE AT ! 100: %token IS OF ON ONTO TO UNTIL WHERE ! 101: /*DDD*/%token DISTRD ! 102: ! 103: /* CONSTANTS */ ! 104: %token NAME SCONST I2CONST I4CONST F4CONST F8CONST ! 105: ! 106: /* PUNCTUATION */ ! 107: %token COMMA LPAREN PERIOD RPAREN COLON BGNCMNT ENDCMNT ! 108: %token LBRAC RBRAC DOLLAR PCT ! 109: ! 110: /* UNARY ARITHMETIC OPERATORS */ ! 111: %token UAOP ! 112: ! 113: /* BINARY ARITHMETIC OPERATORS */ ! 114: %token BAOP BAOPH ! 115: ! 116: /* BOUNDS OPERATORS */ ! 117: %token BDOP ! 118: ! 119: /* EQUALITY OPERATORS */ ! 120: %token EOP ! 121: ! 122: /* LOGICAL OPERATORS */ ! 123: %token LBOP LUOP ! 124: ! 125: /* FUNCTIONAL OPERATORS */ ! 126: %token FOP FBOP ! 127: ! 128: /* AGGREGATE OPERATORS */ ! 129: %token AGOP ! 130: ! 131: /* TYPES FOR INGRES TOKENS */ ! 132: %type <type_type> IS ! 133: %type <string_type> NAME SCONST ! 134: %type <I2_type> I2CONST ! 135: %type <I4_type> I4CONST ! 136: %type <F4_type> F4CONST ! 137: %type <F8_type> F8CONST ! 138: %type <type_type> UAOP ! 139: %type <type_type> BAOP BAOPH ! 140: %type <type_type> BDOP ! 141: %type <type_type> EOP ! 142: %type <type_type> LBOP LUOP ! 143: %type <type_type> FOP FBOP ! 144: %type <type_type> AGOP ! 145: %type <char_type> LPAREN RPAREN LBRAC RBRAC PCT ! 146: ! 147: /* TYPES FOR INGRES NON-TERMINALS */ ! 148: %type <tree_type> permtarg permtlist permtlelm ! 149: /*DDD*/%type <tree_type> distribute distcrits dcriterion ! 150: %type <tree_type> tlclause tlist tlelm ! 151: %type <tree_type> qualclause qual clause afcn aggrfcn ! 152: %type <type_type> relop ! 153: %type <tree_type> domseq targdom attrib ! 154: %type <rng_type> var ! 155: %type <tree_type> attribfcn ! 156: %type <type_type> uop ! 157: %type <string_type> alias ! 158: %type <substr_type> subelm stringpart grpelm nameprt ! 159: %type <char_type> leftclose rightclose ! 160: ! 161: /* DEFINE ASCENDING PRECEDENCE FOR OPERATORS */ ! 162: %left LBOP ! 163: %left LUOP ! 164: %left UAOP ! 165: %left BAOP ! 166: %left BAOPH ! 167: %nonassoc unaryop ! 168: ! 169: %% ! 170: program: program stmnt = ! 171: { ! 172: # ifdef xPTR1 ! 173: tTfp(38, 0, "*** [program stmnt] parsed.\n"); ! 174: # endif ! 175: ! 176: if (endquelst(Opflag) < 0) ! 177: return (-1); ! 178: } ! 179: | stmnt = ! 180: { ! 181: # ifdef xPTR1 ! 182: tTfp(38, 1, "*** [stmnt] parsed.\n"); ! 183: # endif ! 184: ! 185: if (endquelst(Opflag) < 0) ! 186: return (-1); ! 187: } ! 188: | ! 189: { ! 190: # ifdef xPTR1 ! 191: tTfp(38, 2, "*** [(NULL)] parsed.\n"); ! 192: # endif ! 193: } ! 194: ; ! 195: stmnt: append ! 196: | copy ! 197: | create ! 198: | delete ! 199: | destroy ! 200: /*DDD*/ | distribute ! 201: | help ! 202: | index ! 203: | integrity ! 204: | modify ! 205: | permit ! 206: | print ! 207: | range ! 208: | replace ! 209: | retrieve ! 210: | save ! 211: | view ! 212: | use ! 213: | unuse ! 214: | delim ! 215: | error ! 216: { ! 217: # ifdef xPTR1 ! 218: tTfp(38, 0, "*** [error] parsed.\n"); ! 219: # endif ! 220: } ! 221: ! 222: ; ! 223: range: rngstmnt OF NAME IS NAME = ! 224: { ! 225: if ((i = openr(&Reldesc, OR_RELTID, $5)) < 0) ! 226: syserr("relname: error in openr '%d'", i); ! 227: if (i > 0) ! 228: { ! 229: /* invalid relation name */ ! 230: par_error(RNGEXIST, WARN, $5, 0); ! 231: YYERROR; ! 232: } ! 233: else ! 234: rngent(R_EXTERNAL, $3, &Reldesc); ! 235: } ! 236: ; ! 237: rngstmnt: RANGE = ! 238: { ! 239: Opflag = mdRANGE; ! 240: } ! 241: ; ! 242: append: apstmnt apto relation tlclause qualclause = ! 243: { ! 244: /* make root node */ ! 245: Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1); ! 246: } ! 247: ; ! 248: apstmnt: APPEND = ! 249: { ! 250: Opflag = mdAPP; ! 251: } ! 252: ; ! 253: apto: INTO ! 254: | ONTO ! 255: | TO ! 256: | ON ! 257: | ; ! 258: ; ! 259: delete: delstmnt delwd relation qualclause = ! 260: { ! 261: /* make root node for delete, with a TIDNODE at leftmost */ ! 262: Lastree = tree(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), NULL), $4, ROOT, sizeof(struct rootnode), 1); ! 263: } ! 264: ; ! 265: delstmnt: DELETE = ! 266: { ! 267: Opflag = mdDEL; ! 268: } ! 269: ; ! 270: delwd: IN ! 271: | ON ! 272: | FROM ! 273: | ; ! 274: ; ! 275: replace: repstmnt repkwd relation tlclause qualclause = ! 276: { ! 277: /* make root node for replace */ ! 278: Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1); ! 279: } ! 280: ; ! 281: repstmnt: REPLACE = ! 282: { ! 283: Opflag = mdREPL; ! 284: } ! 285: ; ! 286: repkwd: INTO ! 287: | IN ! 288: | ON ! 289: | ; ! 290: ; ! 291: retrieve: retstmnt retclause tlclause qualclause = ! 292: { ! 293: /* make root node for retrieve */ ! 294: Lastree = tree($3, $4, ROOT, sizeof(struct rootnode), 1); ! 295: } ! 296: ; ! 297: retstmnt: RETRIEVE = ! 298: { ! 299: Opflag = mdRETR; ! 300: } ! 301: ; ! 302: retclause: retkwd relation = ! 303: { ! 304: /* set up pipe block and save relname for create */ ! 305: # ifdef xPTR2 ! 306: tTfp(38, 4, "retclause: Rsdmno %d", Rsdmno); ! 307: # endif ! 308: Rsdmno = 0; ! 309: setp(PV_STR, "0"); /* relstat = nil */ ! 310: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid)); ! 311: } ! 312: | = ! 313: { ! 314: /* no result relation, output to terminal */ ! 315: Rsdmno = 0; ! 316: Resrng = -1; ! 317: } ! 318: | UNIQUE = ! 319: { ! 320: Opflag = mdRET_UNI; ! 321: Rsdmno = 0; ! 322: Resrng = -1; ! 323: } ! 324: ; ! 325: retkwd: INTO ! 326: | TO ! 327: | ; ! 328: ; ! 329: ! 330: delim: DEFINE DELIM NAME LPAREN NAME COMMA SCONST RPAREN = ! 331: { ! 332: Opflag = mdSTOP; ! 333: if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0) ! 334: syserr("relname: error in openr '%d'", i); ! 335: if (i > 0) ! 336: { ! 337: /* invalid relation name */ ! 338: par_error(RNGEXIST, WARN, "rdelim", 0); ! 339: YYERROR; ! 340: } ! 341: else ! 342: { ! 343: if (( i = make_tuples(&Reldesc, $3, $5, $7)) < 0) ! 344: { ! 345: closer(&Reldesc); ! 346: par_error(BADBNF, WARN, "rdelim", 0); ! 347: } ! 348: } ! 349: closer(&Reldesc); ! 350: } ! 351: ; ! 352: use: USE NAME = ! 353: { ! 354: Opflag = mdSTOP; ! 355: if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0) ! 356: syserr("relname: error in openr '%d'", i); ! 357: if (i > 0) ! 358: { ! 359: /* invalid relation name */ ! 360: par_error(RNGEXIST, WARN, "rdelim", 0); ! 361: YYERROR; ! 362: } ! 363: else ! 364: { ! 365: if ((i = make_list(&Reldesc, $2)) < 0) ! 366: { ! 367: closer(&Reldesc); ! 368: par_error(DELEXIST, WARN, 0); ! 369: } ! 370: } ! 371: closer(&Reldesc); ! 372: } ! 373: ; ! 374: unuse: UNUSE NAME = ! 375: { ! 376: Opflag = mdSTOP; ! 377: if ( i = shrink_list($2) < 0) ! 378: { ! 379: par_error(NOGRP,WARN,0); ! 380: } ! 381: } ! 382: ; ! 383: ! 384: view: viewclause tlclause qualclause = ! 385: { ! 386: Lastree = tree($2, $3, ROOT, sizeof(struct rootnode), 1); ! 387: } ! 388: ; ! 389: viewclause: viewstmnt relation = ! 390: { ! 391: Rsdmno = 0; ! 392: setp(PV_STR, "0040"); /* relstat = S_VIEW */ ! 393: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid)); ! 394: } ! 395: ; ! 396: viewstmnt: DEFINE VIEW = ! 397: { ! 398: Opflag = mdVIEW; ! 399: if (!Qrymod) ! 400: { ! 401: /* no qrymod in database */ ! 402: par_error(NOQRYMOD, WARN, 0); ! 403: } ! 404: } ! 405: ; ! 406: permit: permstmnt permlist permrel permtarg permwho permplace permtd qualclause = ! 407: { ! 408: Lastree = tree($4, $8, ROOT, sizeof(struct rootnode), 1); ! 409: } ! 410: ; ! 411: permstmnt: DEFINE PERMIT = ! 412: { ! 413: Opflag = mdPROT; ! 414: if (!Qrymod) ! 415: { ! 416: /* no qrymod in database */ ! 417: par_error(NOQRYMOD, WARN, 0); ! 418: } ! 419: } ! 420: ; ! 421: permlist: permxlist ! 422: | permlist COMMA permxlist ! 423: ; ! 424: permxlist: ALL = ! 425: { ! 426: permcom(-1); /* means 'all' commands */ ! 427: } ! 428: | RETRIEVE = ! 429: { ! 430: permcom(mdRETR); ! 431: } ! 432: | DELETE = ! 433: { ! 434: permcom(mdDEL); ! 435: } ! 436: | APPEND = ! 437: { ! 438: permcom(mdAPP); ! 439: } ! 440: | REPLACE = ! 441: { ! 442: permcom(mdREPL); ! 443: } ! 444: ; ! 445: permrel: permword relation = ! 446: { ! 447: /* put command vector into list now since this always happens */ ! 448: setp(PV_INT, Permcomd); ! 449: Permcomd = 0; /* reset command map */ ! 450: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid)); ! 451: bmove(Parrng[Resrng].vardesc.reldum.relowner, permbuf, 2); ! 452: permbuf[2] = 0; ! 453: setp(PV_STR, permbuf); ! 454: } ! 455: ; ! 456: permword: ON ! 457: | OF ! 458: | TO ! 459: ; ! 460: permtarg: LPAREN permtlist RPAREN = ! 461: { ! 462: $$ = $2; ! 463: } ! 464: | = ! 465: { ! 466: $$ = NULL; ! 467: } ! 468: ; ! 469: permtlist: permtlelm ! 470: | permtlist COMMA permtlelm = ! 471: { ! 472: /* ! 473: ** attach bulk of permit tl to leftmost node of new elem ! 474: */ ! 475: if (!Err_current) ! 476: $$ = tlprepend($1, $3); ! 477: } ! 478: ; ! 479: permtlelm: NAME = ! 480: { ! 481: /* Resrng is set by the "relation" production */ ! 482: if (!Err_current) ! 483: { ! 484: Trname = $1; ! 485: aptr = attlookup(Resrng, Trname); ! 486: $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, aptr); ! 487: $$ = addresdom(NULL, $$); ! 488: } ! 489: } ! 490: ; ! 491: permwho: TO NAME = ! 492: { ! 493: setp(PV_STR, $2); ! 494: } ! 495: | TO ALL = ! 496: { ! 497: setp(PV_STR, "all"); ! 498: } ! 499: ; ! 500: permplace: AT NAME = ! 501: { ! 502: setp(PV_STR, $2); ! 503: } ! 504: | AT ALL = ! 505: { ! 506: setp(PV_STR, "all"); ! 507: } ! 508: | = ! 509: { ! 510: setp(PV_STR, "all"); /* default is all */ ! 511: } ! 512: ; ! 513: permtd: permtime permday ! 514: | permdeftime permday ! 515: | permtime permdefday ! 516: | permdeftime permdefday ! 517: ; ! 518: permdeftime: = ! 519: { ! 520: setp(PV_INT, 0); ! 521: setp(PV_INT, 1440); ! 522: } ! 523: ; ! 524: permdefday: = ! 525: { ! 526: setp(PV_STR, "sun"); ! 527: setp(PV_STR, "sat"); ! 528: } ! 529: ; ! 530: permtime: FROM I2CONST COLON I2CONST TO I2CONST COLON I2CONST = ! 531: { ! 532: setp(PV_INT, timeofday($2, $4)); ! 533: setp(PV_INT, timeofday($6, $8)); ! 534: } ! 535: ; ! 536: permday: ON NAME TO NAME = ! 537: { ! 538: setp(PV_STR, $2); ! 539: setp(PV_STR, $4); ! 540: } ! 541: ; ! 542: integrity: integstmnt integnoise relation integis qual = ! 543: { ! 544: Lastree = tree(NULL, norml($5), ROOT, sizeof(struct rootnode), 1); ! 545: Qlflag--; /* turn off here */ ! 546: } ! 547: ; ! 548: integstmnt: DEFINE INTEGRITY = ! 549: { ! 550: Opflag = mdINTEG; ! 551: Qlflag++; /* OK to turn on here because integrity doesn't have a targ list */ ! 552: if (!Qrymod) ! 553: { ! 554: /* no qrymod in database */ ! 555: par_error(NOQRYMOD, WARN, 0); ! 556: } ! 557: } ! 558: ; ! 559: integnoise: ON ! 560: | ONTO ! 561: | IN ! 562: | OF ! 563: | /* null */ ! 564: ; ! 565: integis: IS ! 566: | /* null*/ ! 567: ; ! 568: /*DDD*/distribute: diststmnt relation AT distcrits = ! 569: /*DDD*/ { ! 570: /*DDD*/ if (!Err_current) ! 571: /*DDD*/ { ! 572: /*DDD*/ $$ = tree(NULL, NULL, QLEND, 0); ! 573: /*DDD*/ Lastree = tree($4, $$, ROOT, sizeof(struct rootnode), 1); ! 574: /*DDD*/ } ! 575: /*DDD*/ } ! 576: /*DDD*/; ! 577: /*DDD*/diststmnt: DISTRIBUTE = ! 578: /*DDD*/ Opflag = mdDISTRIB; ! 579: /*DDD*/; ! 580: /*DDD*/distcrits: dcriterion = ! 581: /*DDD*/ { ! 582: /*DDD*/ $$ = $1; ! 583: /*DDD*/ } ! 584: /*DDD*/ | distcrits dcriterion = ! 585: /*DDD*/ { ! 586: /*DDD*/ $$ = tlprepend($1, $2); ! 587: /*DDD*/ } ! 588: /*DDD*/; ! 589: /*DDD*/dcriterion: NAME where qual = ! 590: /*DDD*/ { ! 591: /*DDD*/ Qlflag--; ! 592: /*DDD*/ syserr("Warning this node may be the wrong size\n"); ! 593: /*DDD*/ if (!Err_current) ! 594: /*DDD*/ $$ = tree(NULL, norml($3), SITE, 2, $1); ! 595: /*DDD*/ } ! 596: /*DDD*/; ! 597: relation: NAME = ! 598: { ! 599: # ifdef xPTR2 ! 600: tTfp(38, 3, "res rel name/var: '%s'\n", $1); ! 601: # endif ! 602: switch (Opflag) ! 603: { ! 604: case mdRETR: ! 605: case mdVIEW: ! 606: /* result better not be a rel name */ ! 607: if ((i = openr(&Reldesc, OR_RELTID, $1)) < 0) ! 608: syserr("relation: err openr '%d'", i); ! 609: if (i == 0) ! 610: { ! 611: /* reln exists */ ! 612: if (bequal(Reldesc.reldum.relowner, Usercode, UCODE_SZ)) ! 613: { ! 614: /* same owner, can't duplicate name */ ! 615: par_error(RESEXIST, WARN, $1, 0); ! 616: YYERROR; ! 617: } ! 618: else if (!Err_current) ! 619: { ! 620: /* owned by dba -- purge range table */ ! 621: rngdel($1); ! 622: } ! 623: } ! 624: if (!Err_current) ! 625: { ! 626: bmove(Usercode, Reldesc.reldum.relowner, UCODE_SZ); ! 627: pmove($1, Reldesc.reldum.relid, MAXNAME, ' '); ! 628: Resrng = rngent(R_INTERNAL, "", &Reldesc); ! 629: } ! 630: break; ! 631: ! 632: case mdAPP: ! 633: /* result is a rel name */ ! 634: if (!Err_current) ! 635: { ! 636: Resrng = rnglook($1, LOOKREL); ! 637: if (Resrng < 0) ! 638: { ! 639: if ((i = openr(&Reldesc, OR_RELTID, $1)) < 0) ! 640: syserr("relation: err openr '%d'", i); ! 641: if (i) ! 642: { ! 643: /* invalid relation name */ ! 644: par_error(RESAPPEX, WARN, $1, 0); ! 645: YYERROR; ! 646: } ! 647: Resrng = rngent(R_INTERNAL, "", &Reldesc); ! 648: } ! 649: else ! 650: ctlmod_decl(Resrng); ! 651: checkupd(Resrng); ! 652: } ! 653: break; ! 654: ! 655: case mdPROT: ! 656: case mdINTEG: ! 657: # ifdef DISTRIB ! 658: case mdDISTRIB: ! 659: # endif ! 660: /* the result is a tuple variable */ ! 661: Resrng = rnglook($1, LOOKVAR); ! 662: if (Resrng < 0) ! 663: { ! 664: /* variable not declared */ ! 665: par_error(NOVBLE, WARN, $1, 0); ! 666: YYERROR; ! 667: } ! 668: else ! 669: ctlmod_decl(Resrng); ! 670: break; ! 671: ! 672: case mdREPL: ! 673: case mdDEL: ! 674: /* the result is a tuple variable */ ! 675: Resrng = rnglook($1, LOOKVAR); ! 676: if (Resrng < 0) ! 677: /* variable not declared */ ! 678: { ! 679: par_error(NOVBLE, WARN, $1, 0); ! 680: YYERROR; ! 681: } ! 682: else ! 683: ctlmod_decl(Resrng); ! 684: ! 685: checkupd(Resrng); ! 686: Tidnode = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, &Faketid); ! 687: break; ! 688: default: ! 689: ; ! 690: } ! 691: } ! 692: ; ! 693: tlclause: LPAREN tlist RPAREN = ! 694: { ! 695: $$ = $2; ! 696: ! 697: /* ! 698: ** replace must have tid node as left branch ! 699: ** (so does delete but it doesn't have a targ list) ! 700: */ ! 701: if (Opflag == mdREPL && !Err_current) ! 702: { ! 703: $$ = tlprepend(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), 0), $$); ! 704: } ! 705: } ! 706: ; ! 707: tlist: tlelm ! 708: | tlist COMMA tlelm = ! 709: { ! 710: /* ! 711: ** attach bulk of targ list to leftmost node ! 712: ** of new element ! 713: */ ! 714: if (!Err_current) ! 715: $$ = tlprepend($1, $3); ! 716: } ! 717: ; ! 718: tlelm: NAME is afcn = ! 719: { ! 720: Trname = $1; ! 721: /* make a new resdom entry for targ list */ ! 722: if (!Err_current) ! 723: $$ = addresdom(NULL, $3); ! 724: } ! 725: | attrib = ! 726: { ! 727: /* makes a new resdom entry for targ list */ ! 728: if (!Err_current) ! 729: $$ = addresdom(NULL, $1); ! 730: } ! 731: | var PERIOD ALL = ! 732: { ! 733: if (Opflag == mdREPL) ! 734: { ! 735: /* ALL not defined for REPLACE */ ! 736: par_error(REPALL, WARN, ! 737: trim_relname(Qt.qt_rangev[$1].rngvdesc->relvname), 0); ! 738: YYERROR; ! 739: } ! 740: /* makes set of new resdom entries for targ list */ ! 741: else if (!Err_current) ! 742: $$ = xdot($1); ! 743: } ! 744: ; ! 745: is: IS ! 746: | BY ! 747: ; ! 748: qualclause: where qual = ! 749: { ! 750: $$ = norml($2); ! 751: Qlflag--; ! 752: if (Opflag == mdREPL) ! 753: qualindex(); ! 754: } ! 755: | = ! 756: { ! 757: /* null qualification */ ! 758: if (Opflag == mdREPL) ! 759: qualindex(); ! 760: $$ = norml(NULL); ! 761: } ! 762: ; ! 763: where: WHERE = ! 764: { ! 765: Qlflag++; ! 766: } ! 767: ; ! 768: qual: LPAREN qual RPAREN = ! 769: { ! 770: $$ = $2; ! 771: } ! 772: | LUOP qual = ! 773: { ! 774: $$ = tree(NULL, $2, UOP, 2, $1); ! 775: } ! 776: | qual LBOP qual = ! 777: { ! 778: $$ = tree($1, $3, $2, sizeof (struct rootnode) -2, 0); ! 779: } ! 780: | clause ! 781: ; ! 782: clause: afcn relop afcn = ! 783: { ! 784: $$ = tree($1, $3, BOP, 2, $2); ! 785: } ! 786: ; ! 787: relop: EOP ! 788: | IS ! 789: | BDOP ! 790: ; ! 791: afcn: aggrfcn ! 792: | attribfcn ! 793: | afcn BAOPH afcn = ! 794: { ! 795: $$ = tree($1, $3, BOP, 2, $2); ! 796: } ! 797: | afcn BAOP afcn = ! 798: { ! 799: $$ = tree($1, $3, BOP, 2, $2); ! 800: } ! 801: | afcn UAOP afcn = ! 802: { ! 803: $$ = tree($1, $3, BOP, 2, $2); ! 804: } ! 805: | LPAREN afcn RPAREN = ! 806: { ! 807: $$ = $2; ! 808: } ! 809: | uop afcn %prec unaryop = ! 810: { ! 811: $$ = tree(NULL, $2, UOP, 2, $1); ! 812: } ! 813: | FOP LPAREN afcn RPAREN = ! 814: { ! 815: $$ = tree($3, NULL, UOP, 2, $1); ! 816: } ! 817: | FBOP LPAREN afcn COMMA afcn RPAREN = ! 818: { ! 819: $$ = tree($3, $5, BOP, 2, $1); ! 820: } ! 821: ; ! 822: aggrfcn: AGOP LPAREN afcn BY domseq qualclause RPAREN = ! 823: { ! 824: # ifdef xPTR2 ! 825: tTfp(39, 0, "agg func\n"); ! 826: # endif ! 827: windup($5); ! 828: $$ = tree(tree($5, tree(NULL, $3, AOP, 6, $1), BYHEAD, sizeof(struct resdomnode), 0), $6, AGHEAD, sizeof(struct rootnode), 0); ! 829: tlprepend(tree(NULL, NULL, TREE, 0), $$); ! 830: } ! 831: | AGOP LPAREN afcn qualclause RPAREN = ! 832: { ! 833: $$ = tree(tree(NULL, $3, AOP, 6, $1), $4, AGHEAD, sizeof(struct rootnode), 0); ! 834: } ! 835: ; ! 836: domseq: targdom ! 837: | domseq COMMA targdom = ! 838: { ! 839: $$ = tlprepend($1, $3); ! 840: } ! 841: ; ! 842: targdom: afcn = ! 843: { ! 844: $$ = tree(NULL, $1, RESDOM, sizeof(struct resdomnode), Rsdmno); ! 845: } ! 846: ; ! 847: nameprt: NAME = ! 848: { ! 849: $$ = substring($1,1); ! 850: } ! 851: | SCONST = ! 852: { ! 853: $$ = substring($1,0); ! 854: } ! 855: ; ! 856: subelm: DOLLAR = ! 857: { ! 858: $$ = substring(NULL,0); ! 859: } ! 860: | nameprt DOLLAR = ! 861: { ! 862: $1->flag[0] |= 2; ! 863: $$ = $1; ! 864: } ! 865: | nameprt = ! 866: { ! 867: $$ = $1; ! 868: } ! 869: | I2CONST subelm = ! 870: { ! 871: setnumber($2,$1); ! 872: $$ = $2; ! 873: } ! 874: ; ! 875: grpelm: subelm COMMA subelm = ! 876: { ! 877: groupstrings($1,$3); ! 878: $$ = $1; ! 879: } ! 880: ; ! 881: leftclose: PCT = ! 882: { ! 883: $$ = $1; ! 884: } ! 885: | LPAREN = ! 886: { ! 887: $$ = $1; ! 888: } ! 889: ; ! 890: rightclose: PCT = ! 891: { ! 892: $$ = $1; ! 893: } ! 894: | RPAREN = ! 895: { ! 896: $$ = $1; ! 897: } ! 898: ; ! 899: stringpart: leftclose subelm rightclose = ! 900: { ! 901: $$ = endvals($2,$1,$3); ! 902: } ! 903: | leftclose grpelm rightclose = ! 904: { ! 905: $$ = endvals($2,$1,$3); ! 906: } ! 907: ; ! 908: attrib: var PERIOD NAME = ! 909: { ! 910: # ifdef xPTR2 ! 911: tTfp(39, 1, "attrib %12s.%12s found\n", ! 912: Qt.qt_rangev[$1].rngvdesc->relvname, $3); ! 913: # endif ! 914: ! 915: /* remember attribute name */ ! 916: Trname = $3; ! 917: ! 918: /* look up attribute */ ! 919: aptr = attlookup($1, Trname); ! 920: $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), $1, aptr); ! 921: } ! 922: | attrib stringpart = ! 923: { ! 924: $1->sym.value.sym_var.varstr = $2; ! 925: $$ = $1; ! 926: } ! 927: ; ! 928: var: NAME = ! 929: { ! 930: $$ = rnglook($1, LOOKVAR); ! 931: if ($$ < 0) ! 932: { ! 933: /* variable not declared */ ! 934: par_error(NOVBLE, WARN, $1, 0); ! 935: YYERROR; ! 936: } ! 937: else ! 938: ctlmod_decl($$); ! 939: } ! 940: ; ! 941: attribfcn: I2CONST = ! 942: { ! 943: $$ = tree(NULL, NULL, INT, 2, $1); ! 944: } ! 945: | I4CONST = ! 946: { ! 947: $$ = tree(NULL, NULL, INT, 4, $1); ! 948: } ! 949: | F4CONST = ! 950: { ! 951: $$ = tree(NULL, NULL, FLOAT, 4, $1); ! 952: } ! 953: | F8CONST = ! 954: { ! 955: $$ = tree(NULL, NULL, FLOAT, 8, $1); ! 956: } ! 957: | SCONST = ! 958: { ! 959: patmat($1); ! 960: $$ = tree(NULL, NULL, CHAR, length($1), $1); ! 961: } ! 962: | NAME = ! 963: { ! 964: $$ = tree(NULL, NULL, COP, 2, $1); ! 965: } ! 966: | attrib ! 967: ; ! 968: uop: UAOP %prec unaryop = ! 969: { ! 970: if ($1 == opADD) ! 971: $$ = opPLUS; ! 972: else ! 973: if ($1 == opSUB) ! 974: $$ = opMINUS; ! 975: } ! 976: ; ! 977: copy: copstmnt alias LPAREN coparam RPAREN keywd SCONST = ! 978: { ! 979: # ifdef xPTR2 ! 980: tTfp(39, 3, "copy %12s,%12s\n", $2, $7); ! 981: # endif ! 982: ! 983: setp(PV_STR, $7); ! 984: } ! 985: ; ! 986: copstmnt: COPY = ! 987: { ! 988: Opflag = mdCOPY; ! 989: } ! 990: ; ! 991: coparam: cospecs ! 992: | ; ! 993: ; ! 994: cospecs: alias is coent ! 995: | cospecs COMMA alias is coent ! 996: ; ! 997: coent: alias ! 998: | SCONST = ! 999: { ! 1000: setp(PV_STR, $1); ! 1001: } ! 1002: ; ! 1003: alias: NAME = ! 1004: { ! 1005: if (!Err_current) ! 1006: { ! 1007: setp(PV_STR, $1); ! 1008: if (Opflag == mdDESTROY || Opflag == mdCREATE ! 1009: # ifdef DISTRIB ! 1010: || Opflag == mdDCREATE ! 1011: # endif ! 1012: ) ! 1013: rngdel($1); ! 1014: } ! 1015: } ! 1016: ; ! 1017: specs: alias is alias ! 1018: | specs COMMA alias is alias ! 1019: ; ! 1020: keywd: INTO = ! 1021: { ! 1022: setp(PV_STR, "\0"); ! 1023: setp(PV_STR, "i"); ! 1024: } ! 1025: | FROM = ! 1026: { ! 1027: setp(PV_STR, "\0"); ! 1028: setp(PV_STR, "f"); ! 1029: } ! 1030: ; ! 1031: create: crestmnt alias LPAREN specs RPAREN ! 1032: ; ! 1033: crestmnt: CREATE = ! 1034: { ! 1035: Opflag = mdCREATE; ! 1036: ! 1037: /* set up parameters for regular create */ ! 1038: setp(PV_STR, "0"); /* relstat = nil */ ! 1039: } ! 1040: /*DDD*/ | CREATE DISTRD = ! 1041: /*DDD*/ { ! 1042: /*DDD*/ Opflag = mdDCREATE; ! 1043: /*DDD*/ ! 1044: /*DDD*/ /* setup parameters for distributed create */ ! 1045: /*DDD*/ setp(PV_STR, "U"); ! 1046: /*DDD*/ setp(PV_STR, ""); ! 1047: /*DDD*/ setp(PV_STR, "01000"); /* relstat = S_DISTRIBUTED */ ! 1048: /*DDD*/ } ! 1049: ; ! 1050: destroy: destmnt keys ! 1051: | destqm destlist ! 1052: | destmnt DELIM NAME = ! 1053: { ! 1054: Opflag = mdSTOP; ! 1055: if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0) ! 1056: syserr("relname: error in openr '%d'", i); ! 1057: if (i > 0) ! 1058: { ! 1059: /* invalid relation name */ ! 1060: par_error(RNGEXIST, WARN, "rdelim", 0); ! 1061: YYERROR; ! 1062: } ! 1063: else ! 1064: { ! 1065: if ( i = destroy_delim(&Reldesc, $3) < 0) ! 1066: { ! 1067: closer(&Reldesc); ! 1068: par_error(DELEXIST, WARN, "rdelim",0); ! 1069: } ! 1070: } ! 1071: closer(&Reldesc); ! 1072: } ! 1073: ; ! 1074: destmnt: DESTROY = ! 1075: { ! 1076: Opflag = mdDESTROY; ! 1077: } ! 1078: ; ! 1079: destqm: destmnt INTEGRITY NAME = ! 1080: { ! 1081: Opflag = mdREMQM; ! 1082: if (!Qrymod) ! 1083: /* no qrymod in database */ ! 1084: par_error(NOQRYMOD, WARN, 0); ! 1085: setp(PV_STR, "6"); ! 1086: setp(PV_STR, $3); ! 1087: } ! 1088: | destmnt PERMIT NAME = ! 1089: { ! 1090: Opflag = mdREMQM; ! 1091: if (!Qrymod) ! 1092: /* no qrymod in database */ ! 1093: par_error(NOQRYMOD, WARN, 0); ! 1094: setp(PV_STR, "5"); ! 1095: setp(PV_STR, $3); ! 1096: } ! 1097: ; ! 1098: destlist: I2CONST = ! 1099: { ! 1100: i = iocv(*($1)); ! 1101: setp(PV_STR, i); ! 1102: } ! 1103: | destlist COMMA I2CONST = ! 1104: { ! 1105: i = iocv(*($3)); ! 1106: setp(PV_STR, i); ! 1107: } ! 1108: | ALL ! 1109: ; ! 1110: help: helstmnt hlist ! 1111: | helstmnt = ! 1112: { ! 1113: setp(PV_INT, RELIST); /* all relns */ ! 1114: } ! 1115: | helqmstmnt hqmlist ! 1116: | heldelstmnt = ! 1117: { ! 1118: setp(PV_INT, ALLDELLIST); /* all delims */ ! 1119: } ! 1120: | heldelstmnt dlist ! 1121: ; ! 1122: helstmnt: HELP = ! 1123: { ! 1124: Opflag = mdHELP; ! 1125: } ! 1126: ; ! 1127: heldelstmnt: HELP DELIM = ! 1128: { ! 1129: Opflag = mdHELP; ! 1130: } ! 1131: ; ! 1132: helqmstmnt: HELP VIEW = ! 1133: { ! 1134: Opflag = mdDISPLAY; ! 1135: if (!Qrymod) ! 1136: /* no qrymod in database */ ! 1137: par_error(NOQRYMOD, WARN, 0); ! 1138: smove("4", hqmbuf); ! 1139: } ! 1140: | HELP PERMIT = ! 1141: { ! 1142: Opflag = mdDISPLAY; ! 1143: if (!Qrymod) ! 1144: /* no qrymod in database */ ! 1145: par_error(NOQRYMOD, WARN, 0); ! 1146: smove("5", hqmbuf); ! 1147: } ! 1148: | HELP INTEGRITY = ! 1149: { ! 1150: Opflag = mdDISPLAY; ! 1151: if (!Qrymod) ! 1152: /* no qrymod in database */ ! 1153: par_error(NOQRYMOD, WARN, 0); ! 1154: smove("6", hqmbuf); ! 1155: } ! 1156: ! 1157: ; ! 1158: hlist: hparam ! 1159: | hlist COMMA hparam ! 1160: | ALL = ! 1161: { ! 1162: setp(PV_INT, ALLRELINFO); ! 1163: } ! 1164: ; ! 1165: dlist: dparam ! 1166: | dlist COMMA dparam ! 1167: ; ! 1168: dparam: NAME = ! 1169: { ! 1170: /* relation */ ! 1171: setp(PV_INT, DELLIST); ! 1172: setp(PV_STR, $1); ! 1173: } ! 1174: ; ! 1175: hparam: NAME = ! 1176: { ! 1177: /* relation */ ! 1178: setp(PV_INT, RELINFO); ! 1179: setp(PV_STR, $1); ! 1180: } ! 1181: | SCONST = ! 1182: { ! 1183: /* manual page */ ! 1184: setp(PV_INT, MANSEC); ! 1185: setp(PV_STR, $1); ! 1186: } ! 1187: ; ! 1188: hqmlist: NAME = ! 1189: { ! 1190: setp(PV_STR, hqmbuf); ! 1191: setp(PV_STR, $1); ! 1192: } ! 1193: | hqmlist COMMA NAME = ! 1194: { ! 1195: setp(PV_STR, hqmbuf); ! 1196: setp(PV_STR, $3); ! 1197: } ! 1198: ; ! 1199: index: instmnt LPAREN keys RPAREN = ! 1200: { ! 1201: if (Rsdmno > MAXKEYS) ! 1202: /* too many attributes in key */ ! 1203: par_error(INDEXTRA, WARN, 0); ! 1204: } ! 1205: ; ! 1206: instmnt: indexq ON NAME IS NAME = ! 1207: { ! 1208: /* init INDEX command */ ! 1209: Rsdmno = 0; ! 1210: setp(PV_STR, $3); ! 1211: setp(PV_STR, $5); ! 1212: Indexname = $5; ! 1213: } ! 1214: ; ! 1215: indexq: INDEX = ! 1216: { ! 1217: Opflag = mdINDEX; ! 1218: } ! 1219: ; ! 1220: modify: modstmnt alias TO modstorage modkeys modqual ! 1221: ; ! 1222: modstmnt: MODIFY = ! 1223: { ! 1224: Opflag = mdMODIFY; ! 1225: Rsdmno = 0; ! 1226: } ! 1227: ; ! 1228: modstorage: NAME = ! 1229: { ! 1230: setp(PV_STR, $1); ! 1231: } ! 1232: modkeys: modstkey modrptkey ! 1233: | ; ! 1234: ; ! 1235: modstkey: ON = ! 1236: { ! 1237: setp(PV_STR, "name"); ! 1238: } ! 1239: ; ! 1240: modrptkey: modbasekey ! 1241: | modrptkey COMMA modbasekey ! 1242: ; ! 1243: modbasekey: NAME = ! 1244: { ! 1245: setp(PV_STR, $1); ! 1246: } ! 1247: | NAME COLON NAME = ! 1248: { ! 1249: concat($1, ztack(":", $3), modbuf); ! 1250: setp(PV_STR, modbuf); ! 1251: } ! 1252: ; ! 1253: modqual: modcond modfill ! 1254: | ; ! 1255: ; ! 1256: modcond: WHERE = ! 1257: { ! 1258: setp(PV_STR, "\0"); ! 1259: } ! 1260: ; ! 1261: modfill: modfillnum ! 1262: | modfill COMMA modfillnum ! 1263: ; ! 1264: modfillnum: NAME IS I2CONST = ! 1265: { ! 1266: setp(PV_STR, $1); ! 1267: i = iocv(*($3)); ! 1268: setp(PV_STR, i); ! 1269: } ! 1270: | NAME IS NAME = ! 1271: { ! 1272: setp(PV_STR, $1); ! 1273: setp(PV_STR, $3); ! 1274: } ! 1275: ; ! 1276: keys: alias = ! 1277: { ! 1278: Rsdmno++; ! 1279: } ! 1280: | keys COMMA alias = ! 1281: { ! 1282: Rsdmno++; ! 1283: } ! 1284: ; ! 1285: print: prinstmnt keys ! 1286: ; ! 1287: prinstmnt: PRINT = ! 1288: { ! 1289: Opflag = mdPRINT; ! 1290: } ! 1291: ; ! 1292: save: savstmnt alias UNTIL date ! 1293: ; ! 1294: savstmnt: SAVE = ! 1295: { ! 1296: Opflag = mdSAVE; ! 1297: } ! 1298: ; ! 1299: date: month day_year day_year ! 1300: ; ! 1301: month: alias ! 1302: | day_year ! 1303: ; ! 1304: day_year: I2CONST = ! 1305: { ! 1306: i = iocv(*($1)); ! 1307: ! 1308: # ifdef xPTR3 ! 1309: tTfp(39, 4, "day_year: %s\n", i); ! 1310: # endif ! 1311: ! 1312: setp(PV_STR, i); ! 1313: } ! 1314: ; ! 1315: %% ! 1316: # include "scanner.h" ! 1317: # include "tables.y" ! 1318: # include "yyerror.y"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.