|
|
1.1 root 1: /*
2: ** GRAMMAR.Y -- Equel 6.2 grammar
3: **
4: ** Yacc grammar and semantic rules for Quel
5: ** embedded in C.
6: **
7: ** The grammar is organized in the following manner:
8: ** a) control structure
9: ** b) quel statments
10: ** c) equel statements
11: ** d) declaration and use of C vars
12: ** e) special objects
13: ** f) expressions
14: ** g) keywords
15: ** h) noise words and punctuation
16: ** Within a single classification, major objects are ordered
17: ** alphabetically, and minor objects under the major ones they
18: ** are in.
19: **
20: ** Side Effects:
21: ** performs the translation of an Equel program into
22: ** a C program with calls on the Equel run-time
23: ** support
24: **
25: ** NOTE:
26: ** There are two shift/reduce conflicts associated
27: ** with the non-terminals "[o_]gen_while". It is resolved
28: ** correctly by yacc.
29: */
30:
31:
32:
33: %{
34: /* STANDARD SCANNER & PARSER GLOBALS */
35:
36: # include "constants.h"
37: # include <stdio.h>
38: # include "globals.h"
39: # include <sccs.h>
40:
41: SCCSID(@(#)grammar.y 7.1 2/5/81)
42:
43:
44: %}
45: %union
46: {
47: struct disp_node *u_dn;
48: };
49:
50:
51: /* QUEL keywords */
52: %token <u_dn> APPEND COPY CREATE DEFINE
53: %token <u_dn> DELETE DESTROY HELP INDEX
54: %token <u_dn> MODIFY PRINT INTEGRITY RANGE
55: %token <u_dn> REPLACE RETRIEVE SAVE UNIQUE
56: %token <u_dn> PERMIT VIEW
57:
58: /* special embedded QUEL commands */
59: %token <u_dn> INGRES EXIT PARAM
60:
61: /* C variable usages */
62: %token <u_dn> TYPE ALLOC STRUCT STRUCT_VAR
63:
64: /* QUEL noise words */
65: %token <u_dn> ALL BY FROM IN
66: %token <u_dn> INTO IS OF ON
67: %token <u_dn> ONTO TO WHERE UNTIL
68: %token <u_dn> AT
69:
70: /* constants */
71:
72: %token <u_dn> NAME SCONST I2CONST I4CONST
73: %token <u_dn> F8CONST C_CODE
74:
75: /* punctuation */
76: %token <u_dn> COMMA LPAREN RPAREN PERIOD
77: %token <u_dn> QUOTE BGNCMNT ENDCMNT LBRACE
78: %token <u_dn> RBRACE LBRKT RBRKT NONREF
79: %token <u_dn> SEMICOL POINTER COLON
80:
81: /* operator classes */
82: %token <u_dn> UOP
83: %token <u_dn> BOP
84: %token <u_dn> BDOP
85: %token <u_dn> EOP
86: %token <u_dn> LBOP LUOP
87: %token <u_dn> FOP FBOP
88: %token <u_dn> AOP
89:
90: /* define ascending precedence for operators */
91:
92: %left LBOP
93: %left LUOP
94: %left BOP LBRKT
95: %left UOP
96: %nonassoc unaryop
97:
98: /* non-teriminal type info */
99: %type <u_dn> endblock
100: %type <u_dn> c_variable
101: %type <u_dn> cvarx
102: %type <u_dn> struct_var
103: %type <u_dn> ptr
104: %type <u_dn> selector_part
105: %type <u_dn> str_var_key
106: %type <u_dn> id
107:
108:
109:
110: %%
111: %{
112: struct cvar *cvarp;
113: %}
114:
115: /*
116: * Program Control Structure
117: */
118:
119: program: program statement =
120: {
121: /* for each "statement", free the symbol space
122: * used by that query (lookahed space must not
123: * be freed), and catch up on output lines
124: */
125: symspfree();
126: equate_lines();
127: }
128: | ;
129: ;
130: statement: startquel quel_statement =
131: {
132: w_sync();
133: /* the purpose of the actions for startquel
134: * and this action is to make each query
135: * a single compound C statement (if (x) "{query}")
136: */
137: w_op("}");
138: }
139: | startquel equel_statement =
140: {
141: end_quote();
142: w_op("}");
143: }
144: | c_code
145: | declaration
146: | error
147: ;
148: startquel: =
149: w_op("{");
150: ;
151: /*
152: * C_CODE is a token returned by the lexical analyzer
153: * when it recognizes that the following line is not
154: * equel code. On the NEXT call to the lexical analyzer,
155: * the code will be copied from the source to the output file.
156: */
157: c_code: C_CODE
158: | beginblock =
159: Block_level += 1;
160: | endblock =
161: {
162: if (Block_level == 0)
163: yyserror("extra '}'", $1);
164: else if ((Block_level -= 1) == 0)
165: {
166: freecvar(&C_locals);
167: freecvar(&F_locals);
168: }
169: }
170: ;
171:
172: /* the %prec is to resolve conflicts with the { after a
173: * "tupret".
174: */
175: beginblock: LBRACE %prec LBOP =
176: w_op($1->d_elm);
177: ;
178: endblock: RBRACE =
179: w_op($1->d_elm);
180: ;
181: quel_statement: append
182: | copy
183: | create
184: | delete
185: | destroy
186: | help
187: | index
188: | integrity
189: | modify
190: | permit
191: | print
192: | range
193: | replace
194: | retrieve
195: | save
196: | view
197: ;
198:
199: /* commands particular to Equel */
200:
201: equel_statement:append_p
202: | copy_p
203: | create_p
204: | exit
205: | ingres
206: | replace_p
207: | retrieve_p
208: | tupret
209: | view_p
210: ;
211: /*
212: * QUEL statements
213: */
214:
215: append: append_key apclause tlclause qualclause
216: ;
217: apclause: apkword id
218: ;
219:
220: copy: copy_key id lparen ctl rparen cp_kword filename
221: | copy_key id lparen rparen cp_kword filename
222: ;
223: filename: sconst
224: | id
225: ;
226:
227: create: create_key id lparen ctl rparen
228: ;
229:
230: delete: delete_key delclause qualclause
231: ;
232: delclause: delnoise id
233: ;
234:
235: destroy: destroy_key idlist
236: | destroy_key integ_permit id int_list_all
237: ;
238: integ_permit: integ_key
239: | permit_key
240: ;
241: int_list_all: int_list
242: | all
243: ;
244:
245: help: help_key
246: | help_key all
247: | help_key hlist
248: | help_key int_perm_view idlist
249: ;
250: hlist: hparam
251: | hlist comma hparam
252: ;
253: hparam: id
254: | sconst
255: ;
256: int_perm_view: integ_permit
257: | view_key
258: ;
259:
260: index: index_key id is id lparen idlist rparen
261: ;
262:
263: integrity: define_key integ_key integnoise id isnoise qual
264: ;
265:
266: modify: modify_key id to id on modkeylist density
267: | modify_key id to id
268: ;
269: modkeylist: modkey
270: | modkeylist comma modkey
271: ;
272: modkey: id
273: | id colon id
274: ;
275: density: where modfill
276: | ;
277: ;
278: modfill: id is mod_var
279: | modfill comma id is mod_var
280: ;
281: /* mod_var can be an integer constant or var, or a string var
282: * or a quel name
283: */
284: mod_var: I2CONST =
285: w_con(I2CONST, $1->d_elm);
286: | c_variable =
287: {
288: if ($1)
289: {
290: if (!Cvarp)
291: w_key($1->d_elm);
292: else if (Fieldp && Fieldp->c_type == opINT
293: || Cvarp->c_type == opINT)
294: w_var(Cv_display, opINT);
295: else if (Fieldp && Fieldp->c_type == opSTRING
296: || Cvarp->c_type == opSTRING)
297: w_var(Cv_display, opIDSTRING);
298: else
299: yyserror("in MODIFY, qual var must be in or string",
300: $1);
301: }
302: else
303: yyserror("bad modify qualification", 0);
304: free_display(Cv_display);
305: Cvarp = Fieldp = 0;
306: }
307: ;
308:
309: permit: def_perm permit_list on_of_to id perm_tl
310: perm_who perm_term perm_time perm_day qualclause
311: ;
312: def_perm: define_key permit_key
313: ;
314: permit_list: permlistelm
315: | permit_list comma permlistelm
316: ;
317: permlistelm: RETRIEVE =
318: w_key($1->d_elm);
319: | APPEND =
320: w_key($1->d_elm);
321: | DELETE =
322: w_key($1->d_elm);
323: | REPLACE =
324: w_key($1->d_elm);
325: | all
326: ;
327: on_of_to: on
328: | of
329: | to
330: ;
331: perm_tl: lparen idlist rparen
332: | ;
333: ;
334: perm_who: to id
335: | all
336: | ;
337: ;
338: perm_term: at id
339: | at all
340: | ;
341: ;
342: perm_time: from integer colon integer to
343: integer colon integer
344: | ;
345: ;
346: perm_day: on id to id
347: | ;
348: ;
349:
350: print: print_key idlist
351: ;
352:
353: range: range_of id is id
354: ;
355:
356: replace: replace_key repclause tlclause qualclause
357: ;
358: repclause: repkword id
359: ;
360:
361: retrieve: retrieve_key resclause tlclause qualclause
362: ;
363: resclause: retkword id
364: ;
365:
366: save: save_key id until date
367: ;
368: date: id integer integer
369: ;
370:
371: view: define_key view_key id tlclause qualclause
372: ;
373:
374: /*
375: * Statements Particular to Equel
376: */
377:
378: append_p: append_p_key apclause param_tl qualclause
379: ;
380:
381: copy_p: copy_p_key id param_tl fr_in_id filename
382: ;
383: fr_in_id: cp_kword
384: | c_variable =
385: {
386: if ($1 && Cvarp)
387: {
388: if (Fieldp && Fieldp->c_type != opSTRING
389: || !Fieldp && Cvarp->c_type != opSTRING)
390: yyserror("string var expected for from/into in COPY",
391: $1);
392: else
393: w_var(Cv_display, opIDSTRING);
394: }
395: else
396: yyserror("into/from expected in COPY", $1);
397: free_display(Cv_display);
398: Fieldp = Cvarp = 0;
399: }
400: ;
401:
402: create_p: create_p_key id param_tl
403: ;
404:
405: exit: EXIT =
406: {
407: Opflag = mdEXIT;
408: w_new("IIexit();");
409: }
410: ;
411:
412: ingres: ingres_key param_list =
413: w_op(");");
414: ;
415: param_list: param =
416: w_op("0");
417: | param param_list
418: ;
419: param: id =
420: w_op(",");
421: | SCONST =
422: {
423: w_string($1->d_elm, 0);
424: w_op(",");
425: }
426: ;
427:
428: replace_p: replace_p_key repclause param_tl qualclause
429: ;
430:
431: retrieve_p: retrieve_p_key resclause param_tl qualclause
432: ;
433:
434: tupret: tupret_keyw xc_code =
435: w_flush();
436: | tupret_p o_xc_code =
437: w_flush();
438: ;
439: tupret_keyw: retrieve_key unique c_tlclause qualclause =
440: {
441: w_new("IIsetup();");
442: }
443: ;
444: unique: UNIQUE =
445: {
446: Opflag = mdTUPRET;
447: w_key($1->d_elm);
448: }
449: | =
450: Opflag = mdTUPRET;
451: ;
452: c_tlclause: lparen c_tlist rparen
453: ;
454: c_tlist: c_tlelm
455: | c_tlelm comma c_tlist
456: ;
457: c_tlelm: reduc cvar is_key afcn
458: ;
459: reduc: =
460: Opflag = mdCTLELM;
461: ;
462: xc_code: LBRACE gen_while c_code RBRACE %prec LBRACE =
463: w_op("}");
464: | gen_while %prec LBOP =
465: w_op("}");
466: ;
467: gen_while: =
468: {
469: w_new("while(IIn_get(");
470: w_file();
471: w_op(")){");
472: w_ret();
473: free_ret();
474: w_op("if(IIerrtest())continue;");
475: equate_lines();
476: }
477: ;
478: o_xc_code: LBRACE o_gen_while c_code RBRACE %prec LBRACE =
479: w_op("}");
480: | o_gen_while %prec LBOP =
481: w_op("}");
482: ;
483: o_gen_while: =
484: {
485: w_new("while(IIgettup(");
486: w_file();
487: w_op(")){");
488: equate_lines();
489: }
490: ;
491: tupret_p: tupret_p_key unique param_tl qualclause =
492: {
493: w_new("IIsetup();");
494: }
495: ;
496:
497: view_p: PARAM define_key view_key id param_tl qualclause
498: ;
499:
500: /*
501: * Declarations and use of C variables
502: */
503:
504: declaration: decl_specifer declarator_list SEMICOL =
505: {
506: w_op($3->d_elm);
507: Type_spec = 0;
508: }
509: | decl_specifer SEMICOL =
510: {
511: w_op($2->d_elm);
512: Type_spec = 0;
513: }
514: ;
515: decl_specifer: type_specifier
516: | sc_specifier
517: | type_specifier sc_specifier
518: | sc_specifier type_specifier
519: | struct_dec =
520: {
521: Struct_flag = 0;
522: Type_spec = opSTRUCT;
523: }
524: | sc_specifier struct_dec =
525: {
526: Struct_flag = 0;
527: Type_spec = opSTRUCT;
528: }
529: ;
530: sc_specifier: ALLOC =
531: {
532: Opflag = mdDECL;
533: w_key($1->d_elm);
534: /* in case the default "int" should be assumed,
535: * the Type_spec is set up for it, if a previous
536: * type hasn't been given
537: */
538: if (!Type_spec)
539: Type_spec = opINT;
540: }
541: ;
542: type_specifier: TYPE =
543: {
544: Opflag = mdDECL;
545: w_key($1->d_elm);
546: Type_spec = Opcode;
547: }
548: ;
549: struct_dec: struct_name field_declaration
550: | struct_name
551: | struct_key field_declaration
552: ;
553: struct_name: struct_key NAME =
554: w_key($2->d_elm);
555: ;
556: field_declaration: lbrace field_seq RBRACE =
557: {
558: w_op($3->d_elm);
559: Type_spec = 0;
560: }
561: ;
562: field_seq: field_seq field
563: | ;
564: ;
565: field: type_specifier declarator_list SEMICOL =
566: {
567: w_op($3->d_elm);
568: Type_spec = 0;
569: }
570: | C_CODE
571: ;
572: declarator_list: cvar_dec
573: | declarator_list comma cvar_dec
574: ;
575: cvar_dec: cvarx =
576: {
577: if (Type_spec == opSTRING)
578: Indir_level -= 1;
579: if (Struct_flag)
580: decl_field($1->d_elm, Type_spec,
581: Indir_level, Block_level);
582: else
583: decl_cvar($1->d_elm, Type_spec,
584: Indir_level, Block_level);
585: free_display(Cv_display);
586: Indir_level = Field_indir = 0;
587: Fieldp = Cvarp = 0;
588: }
589: ;
590: c_variable: cvarx =
591: {
592: $$ = $1;
593: if (Cvarp && Cvarp->c_indir != Indir_level)
594: {
595: yyserror("bad indirection on a C variable", $1);
596: $$ = 0;
597: }
598: Indir_level = Field_indir = 0;
599: }
600: | NONREF NAME =
601: {
602: enter_display(Cv_display, salloc($1->d_elm));
603: Cvarp = Fieldp = 0;
604: $$ = $2;
605: }
606: | NONREF STRUCT_VAR =
607: {
608: enter_display(Cv_display, salloc($1->d_elm));
609: Cvarp = Fieldp = 0;
610: $$ = $2;
611: }
612: | struct_var =
613: {
614: if (!Fieldp)
615: {
616: yyserror("undeclared field", $1);
617: $$ = $<u_dn>0;
618: }
619: else if (Fieldp->c_indir != Field_indir)
620: {
621: yyserror("bad indirection on a structure's field",
622: $1);
623: $$ = 0;
624: }
625: if (Cvarp->c_indir != Indir_level)
626: {
627: yysemerr("bad indirection a structure variable",
628: Cvarp->c_indir);
629: $$ = 0;
630: }
631: Indir_level = Field_indir = 0;
632: }
633: ;
634: struct_var: ptr struct_var %prec unaryop =
635: {
636: if ($1->d_elm[1] == '*')
637: Field_indir += 1;
638: Field_indir += 1;
639: $$ = $2;
640: }
641: | struct_var arraysub %prec LBRKT =
642: Field_indir += 1;
643: | str_var_key selector_part
644: ;
645: str_var_key: STRUCT_VAR =
646: {
647: Cvarp = getcvar($1->d_elm);
648: enter_display(Cv_display, $1->d_elm);
649: }
650: ;
651: selector_part: arraysub selector_part =
652: {
653: Indir_level += 1;
654: $$ = $2;
655: }
656: | select_op NAME =
657: {
658: enter_display(Cv_display, $2->d_elm);
659: Fieldp = getfield($2->d_elm);
660: $$ = $2;
661: }
662: ;
663: select_op: PERIOD =
664: enter_display(Cv_display, $1->d_elm);
665: | POINTER =
666: {
667: enter_display(Cv_display, $1->d_elm);
668: Indir_level += 1;
669: }
670: ;
671:
672: /* use of a C variable */
673: cvar: c_variable =
674: {
675: if ($1)
676: {
677: if (!Fieldp && ! Cvarp)
678: {
679: if (!Field_indir && !Indir_level
680: && (sequal($1->d_elm, "dba")
681: || sequal($1->d_elm, "usercode")))
682: /* constant operator COP */
683: w_key($1->d_elm);
684: else
685: yyserror("C var expected", $1);
686: }
687: else if (Opflag == mdCTLELM)
688: {
689: w_con(NAME,
690: Fieldp ? Fieldp->c_id: Cvarp->c_id);
691: enter_ret(Cv_display,
692: Fieldp ? Fieldp->c_type: Cvarp->c_type);
693: }
694: else
695: w_var(Cv_display,
696: Fieldp ? Fieldp->c_type: Cvarp->c_type);
697: }
698: free_display(Cv_display);
699: Fieldp = Cvarp = 0;
700: Indir_level = Field_indir = 0;
701: }
702: cvarx: NAME =
703: {
704: if (Opflag == mdDECL)
705: w_con(NAME, $1->d_elm);
706: else
707: {
708: Cvarp = getcvar($1->d_elm);
709: enter_display(Cv_display, salloc($1->d_elm));
710: }
711: }
712: | ptr cvarx %prec unaryop =
713: {
714: if ($1->d_elm [1] == '*')
715: Indir_level += 1;
716: Indir_level += 1;
717: $$ = $2;
718: }
719: | cvarx arraysub %prec LBRKT =
720: {
721: Indir_level += 1;
722: }
723: ;
724: ptr: BOP =
725: {
726: if (!sequal($1->d_elm, "*") && !sequal((struct disp_node *)($1)->d_elm, "**"))
727: yyserror(Opflag == mdDECL ?
728: "invalid operator in declaration":
729: "invalid operator in C variable",
730: $1);
731: if (Opflag == mdDECL)
732: w_op($1->d_elm);
733: else
734: enter_display(Cv_display, salloc($1->d_elm));
735: }
736: ;
737: arraysub: LBRKT =
738: {
739: if (Opflag == mdDECL)
740: eat_display(0, '[', ']');
741: else
742: eat_display(Cv_display, '[', ']');
743: }
744: ;
745:
746: /*
747: * Special Objects used throughout grammar
748: */
749:
750: id: c_variable =
751: {
752: if ($1)
753: {
754: if (Cvarp)
755: {
756: if (Fieldp && Fieldp->c_type != opSTRING
757: || !Fieldp && Cvarp->c_type != opSTRING)
758: yyserror("string var expected", $1);
759: else if (Opflag == mdFILENAME)
760: w_var(Cv_display, opSTRING);
761: else if (Opflag == mdINGRES)
762: w_display(Cv_display);
763: else
764: w_var(Cv_display, opIDSTRING);
765: }
766: else if (Opflag == mdINGRES)
767: w_string($1->d_elm, 0);
768: else if (Opflag == mdFILENAME)
769: yyserror("file for a COPY must be a string or string variable",
770: $1);
771: else
772: w_key($1->d_elm);
773: }
774: free_display(Cv_display);
775: Fieldp = Cvarp = 0;
776: }
777: ;
778:
779: idlist: id
780: | idlist comma id
781: ;
782:
783: integer: I2CONST =
784: w_con(I2CONST, $1->d_elm);
785: | c_variable =
786: {
787: if ($1)
788: {
789: if (Cvarp)
790: if (Fieldp && Fieldp->c_type == opINT
791: || Cvarp->c_type == opINT)
792: w_var(Cv_display, opINT);
793: else
794: yyserror("integer variable required",
795: $1);
796: else
797: yyserror("integer variable required", $1);
798: }
799: free_display(Cv_display);
800: }
801: ;
802:
803: int_list: integer
804: | int_list comma integer
805: ;
806:
807: param_tl: LPAREN =
808: {
809: w_op("(");
810: end_quote();
811: if (Opflag == mdTUPRET)
812: w_key("IIw_left");
813: else
814: w_key("IIw_right");
815: eat_display(0, '(', ')');
816: w_op(";");
817: begin_quote();
818: w_op(")");
819:
820: }
821: ;
822:
823: qualclause: where qual
824: | where c_variable =
825: {
826: if (!$2 || !Cvarp)
827: yyserror("C var (string) expected", $2);
828: else if (Fieldp && Fieldp->c_type == opSTRING
829: || Cvarp->c_type == opSTRING)
830: {
831: end_quote();
832: w_op("IIwrite(");
833: w_display(Cv_display);
834: w_op(");");
835: }
836: else
837: yyserror("var must be string valued for qualification",
838: $2);
839: free_display(Cv_display);
840: Cvarp = Fieldp = 0;
841: }
842: | ;
843: ;
844: qual: lparen qual rparen
845: | luop qual %prec LUOP
846: | qual lbop qual %prec LBOP
847: | clause
848: | ;
849: ;
850: clause: afcn rop afcn
851: | afcn rop afcn bdop afcn
852: ;
853: ctl: id is id
854: | ctl comma id is id
855: ;
856:
857: sconst: SCONST =
858: w_con(SCONST, $1->d_elm);
859: ;
860:
861: tlclause: lparen tlist rparen
862: ;
863: tlist: tlelm
864: | tlelm comma tlist
865: ;
866: tlelm: id is_key afcn
867: | attrib
868: ;
869:
870: /*
871: * Expressions
872: */
873:
874: afcn: aggrfcn
875: | aggr
876: | attribfcn
877: | afcn bop afcn %prec BOP
878: | lparen afcn rparen
879: | uop afcn %prec unaryop
880: | fop lparen afcn rparen
881: | fbop lparen afcn comma afcn rparen
882: ;
883: aggr: aop lparen afcn qualclause rparen
884: ;
885: aggrfcn: aop lparen afcn by aseq qualclause rparen
886: ;
887: attribfcn: I2CONST =
888: w_con(I2CONST, $1->d_elm);
889: | I4CONST =
890: w_con(I4CONST, $1->d_elm);
891: | F8CONST =
892: w_con(F8CONST, $1->d_elm);
893: | SCONST =
894: w_con(SCONST, $1->d_elm);
895: | cvar
896: | attrib
897: ;
898: aseq: aseq comma afcn
899: | afcn
900: ;
901: attrib: id period id
902: | id period all=
903: {
904: if (Opflag != mdVIEW && Opflag != mdRETRIEVE
905: && Opflag != mdAPPEND)
906: yyserror(
907: "'all' applied to this range variable illegal in this kind of statement",
908: $1);
909: }
910: ;
911: lbop: LBOP =
912: w_key($1->d_elm);
913: ;
914: luop: LUOP =
915: w_key($1->d_elm);
916: ;
917: bdop: BDOP =
918: w_op($1->d_elm);
919: ;
920: rop: EOP =
921: w_op($1->d_elm);
922: | BDOP =
923: w_op($1->d_elm);
924: | IS =
925: w_op("=");
926: ;
927: uop: UOP =
928: w_op($1->d_elm);
929: ;
930: fop: FOP =
931: w_key($1->d_elm);
932: ;
933: fbop: FBOP =
934: w_key($1->d_elm);
935: ;
936: bop: BOP =
937: w_op($1->d_elm);
938: | UOP =
939: w_op($1->d_elm);
940: ;
941: by: BY =
942: w_key($1->d_elm);
943: ;
944: aop: AOP =
945: w_key($1->d_elm);
946: ;
947:
948: /*
949: * Keywords
950: */
951:
952: append_p_key: PARAM APPEND =
953: {
954: begin_quote();
955: w_key($2->d_elm);
956: Opflag = mdAPPEND;
957: }
958: ;
959: append_key: APPEND =
960: {
961: Opflag = mdAPPEND;
962: begin_quote();
963: w_key($1->d_elm);
964: }
965: ;
966: copy_key: COPY =
967: {
968: Opflag = mdCOPY;
969: begin_quote();
970: w_key($1->d_elm);
971: }
972: ;
973: copy_p_key: PARAM COPY =
974: {
975: Opflag = mdCOPY;
976: begin_quote();
977: w_key($2->d_elm);
978: }
979: ;
980: cp_kword: INTO =
981: {
982: w_key($1->d_elm);
983: Opflag = mdFILENAME;
984: }
985: | FROM =
986: {
987: w_key($1->d_elm);
988: Opflag = mdFILENAME;
989: }
990: ;
991: create_key: CREATE =
992: {
993: Opflag = mdCREATE;
994: begin_quote();
995: w_key($1->d_elm);
996: }
997: ;
998: create_p_key: PARAM CREATE =
999: {
1000: Opflag = mdCREATE;
1001: begin_quote();
1002: w_key($2->d_elm);
1003: }
1004: ;
1005: define_key: DEFINE =
1006: {
1007: Opflag = mdDEFINE;
1008: begin_quote();
1009: w_key($1->d_elm);
1010: }
1011: ;
1012: delete_key: DELETE =
1013: {
1014: Opflag = mdDELETE;
1015: begin_quote();
1016: w_key($1->d_elm);
1017: }
1018: ;
1019: destroy_key: DESTROY =
1020: {
1021: Opflag = mdDESTROY;
1022: begin_quote();
1023: w_key($1->d_elm);
1024: }
1025: ;
1026: help_key: HELP =
1027: {
1028: Opflag = mdHELP;
1029: begin_quote();
1030: w_key($1->d_elm);
1031: }
1032: ;
1033: index_key: INDEX ON =
1034: {
1035: Opflag = mdINDEX;
1036: begin_quote();
1037: w_key($1->d_elm);
1038: w_key($2->d_elm);
1039: }
1040: ;
1041: ingres_key: INGRES =
1042: {
1043: Opflag = mdINGRES;
1044: w_new("IIingres(");
1045: }
1046: ;
1047: integ_key: INTEGRITY=
1048: {
1049: if (Opflag == mdDEFINE)
1050: Opflag = mdINTEGRITY;
1051: w_key($1->d_elm);
1052: }
1053: ;
1054: is_key: IS =
1055: {
1056: if (Opflag == mdCTLELM)
1057: Opflag = mdTUPRET;
1058: w_op("=");
1059: }
1060: | BY =
1061: w_key($1->d_elm);
1062: ;
1063: modify_key: MODIFY =
1064: {
1065: Opflag = mdMODIFY;
1066: begin_quote();
1067: w_key($1->d_elm);
1068: }
1069: ;
1070: permit_key: PERMIT=
1071: {
1072: if (Opflag == mdDEFINE)
1073: Opflag = mdINTEGRITY;
1074: w_key($1->d_elm);
1075: }
1076: ;
1077: print_key: PRINT =
1078: {
1079: Opflag = mdPRINT;
1080: begin_quote();
1081: w_key($1->d_elm);
1082: }
1083: ;
1084: range_of: RANGE OF =
1085: {
1086: Opflag = mdRANGE;
1087: begin_quote();
1088: w_key($1->d_elm);
1089: w_key($2->d_elm);
1090: }
1091: ;
1092: replace_key: REPLACE =
1093: {
1094: Opflag = mdREPLACE;
1095: begin_quote();
1096: w_key($1->d_elm);
1097: }
1098: ;
1099: replace_p_key: PARAM REPLACE =
1100: {
1101: begin_quote();
1102: Opflag = mdREPLACE;
1103: w_key($2->d_elm);
1104: }
1105: ;
1106: retrieve_key: RETRIEVE =
1107: {
1108: Opflag = mdRETRIEVE;
1109: begin_quote();
1110: w_key($1->d_elm);
1111: }
1112: ;
1113: retrieve_p_key: PARAM RETRIEVE =
1114: {
1115: Opflag = mdRETRIEVE;
1116: begin_quote();
1117: w_key($2->d_elm);
1118: }
1119: ;
1120: save_key: SAVE =
1121: {
1122: Opflag = mdSAVE;
1123: begin_quote();
1124: w_key($1->d_elm);
1125: }
1126: ;
1127: struct_key: STRUCT =
1128: {
1129: Opflag = mdDECL;
1130: Struct_flag = 1;
1131: w_key($1->d_elm);
1132: }
1133: ;
1134: tupret_p_key: PARAM RETRIEVE =
1135: {
1136: begin_quote();
1137: w_key($2->d_elm);
1138: Opflag = mdTUPRET;
1139: }
1140: ;
1141: view_key: VIEW =
1142: {
1143: if (Opflag == mdDEFINE)
1144: Opflag = mdVIEW;
1145: w_key($1->d_elm);
1146: }
1147: ;
1148:
1149: /*
1150: * Noise words and punctuation
1151: */
1152:
1153: all: ALL=
1154: w_key($1->d_elm);
1155: ;
1156: apkword: INTO
1157: | ONTO
1158: | TO
1159: | ON
1160: | ;
1161: ;
1162: at: AT =
1163: w_key($1->d_elm);
1164: ;
1165: colon: COLON =
1166: w_op($1->d_elm);
1167: ;
1168: comma: COMMA =
1169: w_op($1->d_elm);
1170: ;
1171: delnoise: IN
1172: | ON
1173: | FROM
1174: | ;
1175: ;
1176: from: FROM =
1177: w_key($1->d_elm);
1178: ;
1179: integnoise: ON
1180: | ONTO
1181: | IN
1182: | OF
1183: ;
1184: is: IS =
1185: w_op("=");
1186: ;
1187: isnoise: IS
1188: | ;
1189: ;
1190: lbrace: LBRACE =
1191: w_op($1->d_elm);
1192: ;
1193: lparen: LPAREN =
1194: w_op($1->d_elm);
1195: ;
1196: of: OF=
1197: w_key($1->d_elm);
1198: ;
1199: on: ON =
1200: w_key($1->d_elm);
1201: ;
1202: period: PERIOD =
1203: w_op($1->d_elm);
1204: ;
1205: repkword: INTO
1206: | IN
1207: | ON
1208: | ;
1209: ;
1210: rparen: RPAREN =
1211: w_op($1->d_elm);
1212: ;
1213: to: TO =
1214: w_key($1->d_elm);
1215: ;
1216: retkword: INTO
1217: | TO
1218: | ;
1219: ;
1220: until: UNTIL =
1221: w_key($1->d_elm);
1222: ;
1223: where: WHERE =
1224: w_key($1->d_elm);
1225: ;
1226: %%
1227:
1228: # include "tokens.y"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.