Annotation of 43BSD/ingres/source/equel/grammar.y, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.