Annotation of 42BSD/ucb/pascal/src/pas.y, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: /*
                      4:  * Yacc grammar for UNIX Pascal
                      5:  *
                      6:  * This grammar is processed by the commands in the shell script
                      7:  * "gram" to yield parse tables and semantic routines in the file
                      8:  * "y.tab.c" and a header defining the lexical tokens in "yy.h".
                      9:  *
                     10:  * In order for the syntactic error recovery possible with this
                     11:  * grammar to work, the grammar must be processed by a yacc which
                     12:  * has been modified to fully enumerate possibilities in states
                     13:  * which involve the symbol "error".
                     14:  * The parser used for Pascal also uses a different encoding of
                     15:  * the test entries in the action table which speeds the parse.
                     16:  * A version of yacc which will work for Pascal is included on
                     17:  * the distribution table as "eyacc".
                     18:  *
                     19:  * The "gram" script also makes the following changes to the "y.tab.c"
                     20:  * file:
                     21:  *
                     22:  *     1) Causes yyval to be declared int *.
                     23:  *
                     24:  *     2) Loads the variable yypv into a register as yyYpv so that
                     25:  *        the arguments $1, ... are available as yyYpv[1] etc.
                     26:  *        This produces much smaller code in the semantic actions.
                     27:  *
                     28:  *     3) Deletes the unused array yysterm.
                     29:  *
                     30:  *     4) Moves the declarations up to the flag line containing
                     31:  *        '##' to the file yy.h so that the routines which use
                     32:  *        these "magic numbers" don't have to all be compiled at
                     33:  *        the same time.
                     34:  *
                     35:  *     5) Creates the semantic restriction checking routine yyEactr
                     36:  *        by processing action lines containing `@@'.
                     37:  *
                     38:  * This compiler uses a different version of the yacc parser, a
                     39:  * different yyerror which is called yerror, and requires more
                     40:  * lookahead sets than normally provided by yacc.
                     41:  *
                     42:  * Source for the yacc used with this grammar is included on
                     43:  * distribution tapes.
                     44:  */
                     45: 
                     46: /*
                     47:  * TERMINAL DECLARATIONS
                     48:  *
                     49:  * Some of the terminal declarations are out of the most natural
                     50:  * alphabetic order because the error recovery
                     51:  * will guess the first of equal cost non-terminals.
                     52:  * This makes, e.g. YTO preferable to YDOWNTO.
                     53:  */
                     54: 
                     55: %term
                     56:        YAND            YARRAY          YBEGIN          YCASE
                     57:        YCONST          YDIV            YDO             YDOTDOT
                     58:        YTO             YELSE           YEND            YFILE
                     59:        YFOR            YFORWARD        YPROCEDURE      YGOTO
                     60:        YID             YIF             YIN             YINT
                     61:        YLABEL          YMOD            YNOT            YNUMB
                     62:        YOF             YOR             YPACKED         YNIL
                     63:        YFUNCTION       YPROG           YRECORD         YREPEAT
                     64:        YSET            YSTRING         YTHEN           YDOWNTO
                     65:        YTYPE           YUNTIL          YVAR            YWHILE
                     66:        YWITH           YBINT           YOCT            YHEX
                     67:        YCASELAB        YILLCH          YEXTERN         YLAST
                     68: 
                     69: /*
                     70:  * PRECEDENCE DECLARATIONS
                     71:  *
                     72:  * Highest precedence is the unary logical NOT.
                     73:  * Next are the multiplying operators, signified by '*'.
                     74:  * Lower still are the binary adding operators, signified by '+'.
                     75:  * Finally, at lowest precedence and non-associative are the relationals.
                     76:  */
                     77: 
                     78: %binary        '<'     '='     '>'     YIN
                     79: %left  '+'     '-'     YOR     '|'
                     80: %left  UNARYSIGN
                     81: %left  '*'     '/'     YDIV    YMOD    YAND    '&'
                     82: %left  YNOT
                     83: 
                     84: %{
                     85: /*
                     86:  * GLOBALS FOR ACTIONS
                     87:  */
                     88: 
                     89: /* Copyright (c) 1979 Regents of the University of California */
                     90: 
                     91: /* static      char sccsid[] = "@(#)pas.y 1.10 6/6/83"; */
                     92: 
                     93: /*
                     94:  * The following line marks the end of the yacc
                     95:  * Constant definitions which are removed from
                     96:  * y.tab.c and placed in the file y.tab.h.
                     97:  */
                     98: ##
                     99: /* Copyright (c) 1979 Regents of the University of California */
                    100: 
                    101: static char sccsid[] = "@(#)pas.y 1.10 6/6/83";
                    102: 
                    103: #include "whoami.h"
                    104: #include "0.h"
                    105: #include "yy.h"
                    106: #include "tree.h"
                    107: 
                    108: #ifdef PI
                    109: #define        lineof(l)       l
                    110: #define        line2of(l)      l
                    111: #endif
                    112: 
                    113: %}
                    114: 
                    115: %%
                    116: 
                    117: /*
                    118:  * PRODUCTIONS
                    119:  */
                    120: 
                    121: goal:
                    122:        prog_hedr decls block '.'
                    123:                = funcend($1, $3, lineof($4));
                    124:                |
                    125:        decls
                    126:                = segend();
                    127:                ;
                    128:        
                    129: 
                    130: prog_hedr:
                    131:        YPROG YID '(' id_list ')' ';' 
                    132:                = $$ = funcbody(funchdr(tree5(T_PROG, lineof($1), $2, fixlist($4), NIL)));
                    133:                |
                    134:        YPROG YID ';'
                    135:                = $$ = funcbody(funchdr(tree5(T_PROG, lineof($1), $2, NIL, NIL)));
                    136:                |
                    137:        YPROG error
                    138:                = {
                    139:                        yyPerror("Malformed program statement", PPROG);
                    140:                        /*
                    141:                         * Should make a program statement
                    142:                         * with "input" and "output" here.
                    143:                         */
                    144:                        $$ = funcbody(funchdr(tree5(T_PROG, lineof($1), NIL, NIL, NIL)));
                    145:                  }
                    146:                ;
                    147: block:
                    148:        YBEGIN stat_list YEND
                    149:                = {
                    150:                        $$ = tree3(T_BSTL, lineof($1), fixlist($2));
                    151:                        if ($3 < 0)
                    152:                                brerror($1, "begin");
                    153:                  }
                    154:                ;
                    155: 
                    156: 
                    157: /*
                    158:  * DECLARATION PART
                    159:  */
                    160: decls:
                    161:        decls decl
                    162:                = trfree();
                    163:                |
                    164:        decls error
                    165:                = {
                    166: Derror:
                    167:                        constend(), typeend(), varend(), trfree();
                    168:                        yyPerror("Malformed declaration", PDECL);
                    169:                  }
                    170:                |
                    171:        /* lambda */
                    172:                = trfree();
                    173:                ;
                    174: 
                    175: decl:
                    176:        labels
                    177:                |
                    178:        const_decl
                    179:                = constend();
                    180:                |
                    181:        type_decl
                    182:                = typeend();
                    183:                |
                    184:        var_decl
                    185:                = varend();
                    186:                |
                    187:        proc_decl
                    188:                ;
                    189: 
                    190: /*
                    191:  * LABEL PART
                    192:  */
                    193: 
                    194: labels:
                    195:        YLABEL label_decl ';'
                    196:                = label(fixlist($2), lineof($1));
                    197:                ;
                    198: label_decl:
                    199:        YINT
                    200:                = $$ = newlist($1 == NIL ? NIL : *hash($1, 1));
                    201:                |
                    202:        label_decl ',' YINT
                    203:                = $$ = addlist($1, $3 == NIL ? NIL : *hash($3, 1));
                    204:                ;
                    205: 
                    206: /*
                    207:  * CONST PART
                    208:  */
                    209: 
                    210: const_decl:
                    211:        YCONST YID '=' const ';'
                    212:                = constbeg($1, line2of($2)), const(lineof($3), $2, $4);
                    213:                |
                    214:        const_decl YID '=' const ';'
                    215:                = const(lineof($3), $2, $4);
                    216:                |
                    217:        YCONST error
                    218:                = {
                    219:                        constbeg($1, line2of($1));
                    220: Cerror:
                    221:                        yyPerror("Malformed const declaration", PDECL);
                    222:                  }
                    223:                |
                    224:        const_decl error
                    225:                = goto Cerror;
                    226:                ;
                    227: 
                    228: /*
                    229:  * TYPE PART
                    230:  */
                    231: 
                    232: type_decl:
                    233:        YTYPE YID '=' type ';'
                    234:                = typebeg($1, line2of($2)), type(lineof($3), $2, $4);
                    235:                |
                    236:        type_decl YID '=' type ';'
                    237:                = type(lineof($3), $2, $4);
                    238:                |
                    239:        YTYPE error
                    240:                = {
                    241:                        typebeg($1, line2of($1));
                    242: Terror:
                    243:                        yyPerror("Malformed type declaration", PDECL);
                    244:                  }
                    245:                |
                    246:        type_decl error
                    247:                = goto Terror;
                    248:                ;
                    249: 
                    250: /*
                    251:  * VAR PART
                    252:  */
                    253: 
                    254: var_decl:
                    255:        YVAR id_list ':' type ';'
                    256:                = varbeg($1, line2of($3)), var(lineof($3), fixlist($2), $4);
                    257:                |
                    258:        var_decl id_list ':' type ';'
                    259:                = var(lineof($3), fixlist($2), $4);
                    260:                |
                    261:        YVAR error 
                    262:                = {
                    263:                        varbeg($1, line2of($1));
                    264: Verror:
                    265:                        yyPerror("Malformed var declaration", PDECL);
                    266:                  }
                    267:                |
                    268:        var_decl error
                    269:                = goto Verror;
                    270:                ;
                    271: 
                    272: /*
                    273:  * PROCEDURE AND FUNCTION DECLARATION PART
                    274:  */
                    275: 
                    276: proc_decl:
                    277:        phead YFORWARD ';'
                    278:                = funcfwd($1);
                    279:                |
                    280:        phead YEXTERN ';'
                    281:                = funcext($1);
                    282:                |
                    283:        pheadres decls block ';'
                    284:                = funcend($1, $3, lineof($4));
                    285:                |
                    286:        phead error
                    287:                ;
                    288: pheadres:
                    289:        phead
                    290:                = funcbody($1);
                    291:                ;
                    292: phead:
                    293:        porf YID params ftype ';'
                    294:                = $$ = funchdr(tree5($1, lineof($5), $2, $3, $4));
                    295:                ;
                    296: porf:
                    297:        YPROCEDURE
                    298:                = $$ = T_PDEC;
                    299:                |
                    300:        YFUNCTION
                    301:                = $$ = T_FDEC;
                    302:                ;
                    303: params:
                    304:        '(' param_list ')'
                    305:                = $$ = fixlist($2);
                    306:                |
                    307:        /* lambda */
                    308:                = $$ = NIL;
                    309:                ;
                    310: 
                    311: /*
                    312:  * PARAMETERS
                    313:  */
                    314: 
                    315: param:
                    316:        id_list ':' type
                    317:                = $$ = tree3(T_PVAL, fixlist($1), $3);
                    318:                |
                    319:        YVAR id_list ':' type
                    320:                = $$ = tree3(T_PVAR, fixlist($2), $4);
                    321:                |
                    322:        YFUNCTION id_list params ftype
                    323:                = $$ = tree5(T_PFUNC, fixlist($2), $4, $3, lineof($1));
                    324:                |
                    325:        YPROCEDURE id_list params ftype
                    326:                = $$ = tree5(T_PPROC, fixlist($2), $4, $3, lineof($1));
                    327:                ;
                    328: ftype:
                    329:        ':' type
                    330:                = $$ = $2;
                    331:                |
                    332:        /* lambda */
                    333:                = $$ = NIL;
                    334:                ;
                    335: param_list:
                    336:        param
                    337:                = $$ = newlist($1);
                    338:                |
                    339:        param_list ';' param
                    340:                = $$ = addlist($1, $3);
                    341:                ;
                    342: 
                    343: /*
                    344:  * CONSTANTS
                    345:  */
                    346: 
                    347: const:
                    348:        YSTRING
                    349:                = $$ = tree2(T_CSTRNG, $1);
                    350:                |
                    351:        number
                    352:                |
                    353:        '+' number
                    354:                = $$ = tree2(T_PLUSC, $2);
                    355:                |
                    356:        '-' number
                    357:                = $$ = tree2(T_MINUSC, $2);
                    358:                ;
                    359: number:
                    360:        const_id
                    361:                = $$ = tree2(T_ID, $1);
                    362:                |
                    363:        YINT
                    364:                = $$ = tree2(T_CINT, $1);
                    365:                |
                    366:        YBINT
                    367:                = $$ = tree2(T_CBINT, $1);
                    368:                |
                    369:        YNUMB
                    370:                = $$ = tree2(T_CFINT, $1);
                    371:                ;
                    372: const_list:
                    373:        const
                    374:                = $$ = newlist($1);
                    375:                |
                    376:        const_list ',' const
                    377:                = $$ = addlist($1, $3);
                    378:                ;
                    379: 
                    380: /*
                    381:  * TYPES
                    382:  */
                    383: 
                    384: type:
                    385:        simple_type
                    386:                |
                    387:        '^' YID
                    388:                = $$ = tree3(T_TYPTR, lineof($1), tree2(T_ID, $2));
                    389:                |
                    390:        struct_type
                    391:                |
                    392:        YPACKED struct_type
                    393:                = $$ = tree3(T_TYPACK, lineof($1), $2);
                    394:                ;
                    395: simple_type:
                    396:        type_id
                    397:                |
                    398:        '(' id_list ')'
                    399:                = $$ = tree3(T_TYSCAL, lineof($1), fixlist($2));
                    400:                |
                    401:        const YDOTDOT const
                    402:                = $$ = tree4(T_TYRANG, lineof($2), $1, $3);
                    403:                ;
                    404: struct_type:
                    405:        YARRAY '[' simple_type_list ']' YOF type
                    406:                = $$ = tree4(T_TYARY, lineof($1), fixlist($3), $6);
                    407:                |
                    408:        YFILE YOF type
                    409:                = $$ = tree3(T_TYFILE, lineof($1), $3);
                    410:                |
                    411:        YSET YOF simple_type
                    412:                = $$ = tree3(T_TYSET, lineof($1), $3);
                    413:                |
                    414:        YRECORD field_list YEND
                    415:                = {
                    416:                        $$ = setuptyrec( lineof( $1 ) , $2 );
                    417:                        if ($3 < 0)
                    418:                                brerror($1, "record");
                    419:                  }
                    420:                ;
                    421: simple_type_list:
                    422:        simple_type
                    423:                = $$ = newlist($1);
                    424:                |
                    425:        simple_type_list ',' simple_type
                    426:                = $$ = addlist($1, $3);
                    427:                ;
                    428: 
                    429: /*
                    430:  * RECORD TYPE
                    431:  */
                    432: field_list:
                    433:        fixed_part variant_part
                    434:                = $$ = tree4(T_FLDLST, lineof(NIL), fixlist($1), $2);
                    435:                ;
                    436: fixed_part:
                    437:        field
                    438:                = $$ = newlist($1);
                    439:                |
                    440:        fixed_part ';' field
                    441:                = $$ = addlist($1, $3);
                    442:                |
                    443:        fixed_part error
                    444:                = yyPerror("Malformed record declaration", PDECL);
                    445:                ;
                    446: field:
                    447:        /* lambda */
                    448:                = $$ = NIL;
                    449:                |
                    450:        id_list ':' type
                    451:                = $$ = tree4(T_RFIELD, lineof($2), fixlist($1), $3);
                    452:                ;
                    453: 
                    454: variant_part:
                    455:        /* lambda */
                    456:                = $$ = NIL;
                    457:                |
                    458:        YCASE type_id YOF variant_list
                    459:                = $$ = tree5(T_TYVARPT, lineof($1), NIL, $2, fixlist($4));
                    460:                |
                    461:        YCASE YID ':' type_id YOF variant_list
                    462:                = $$ = tree5(T_TYVARPT, lineof($1), $2, $4, fixlist($6));
                    463:                ;
                    464: variant_list:
                    465:        variant
                    466:                = $$ = newlist($1);
                    467:                |
                    468:        variant_list ';' variant
                    469:                = $$ = addlist($1, $3);
                    470:                |
                    471:        variant_list error
                    472:                = yyPerror("Malformed record declaration", PDECL);
                    473:                ;
                    474: variant:
                    475:        /* lambda */
                    476:                = $$ = NIL;
                    477:                |
                    478:        const_list ':' '(' field_list ')'
                    479:                = $$ = tree4(T_TYVARNT, lineof($2), fixlist($1), $4);
                    480:                ;
                    481: 
                    482: /*
                    483:  * STATEMENT LIST
                    484:  */
                    485: 
                    486: stat_list:
                    487:        stat
                    488:                = $$ = newlist($1);
                    489:                |
                    490:        stat_lsth stat
                    491:                = {
                    492:                        if ((p = $1) != NIL && (q = p[1])[0] == T_IFX) {
                    493:                                q[0] = T_IFEL;
                    494:                                q[4] = $2;
                    495:                        } else
                    496:                                $$ = addlist($1, $2);
                    497:                  }
                    498:                ;
                    499: 
                    500: stat_lsth:
                    501:        stat_list ';'
                    502:                = if ((q = $1) != NIL && (p = q[1]) != NIL && p[0] == T_IF) {
                    503:                        if (yychar < 0)
                    504:                                yychar = yylex();
                    505:                        if (yyshifts >= 2 && yychar == YELSE) {
                    506:                                recovered();
                    507:                                copy(&Y, &OY, sizeof Y);
                    508:                                yerror("Deleted ';' before keyword else");
                    509:                                yychar = yylex();
                    510:                                p[0] = T_IFX;
                    511:                        }
                    512:                  }
                    513:                ;
                    514: 
                    515: /*
                    516:  * CASE STATEMENT LIST
                    517:  */
                    518: 
                    519: cstat_list:
                    520:        cstat
                    521:                = $$ = newlist($1);
                    522:                |
                    523:        cstat_list ';' cstat
                    524:                = $$ = addlist($1, $3);
                    525:                |
                    526:        error
                    527:                = {
                    528:                        $$ = NIL;
                    529: Kerror:
                    530:                        yyPerror("Malformed statement in case", PSTAT);
                    531:                  }
                    532:                |
                    533:        cstat_list error
                    534:                = goto Kerror;
                    535:                ;
                    536: 
                    537: cstat:
                    538:        const_list ':' stat
                    539:                = $$ = tree4(T_CSTAT, lineof($2), fixlist($1), $3);
                    540:                |
                    541:        YCASELAB stat
                    542:                = $$ = tree4(T_CSTAT, lineof($1), NIL, $2);
                    543:                |
                    544:        /* lambda */
                    545:                = $$ = NIL;
                    546:                ;
                    547: 
                    548: /*
                    549:  * STATEMENT
                    550:  */
                    551: 
                    552: stat:
                    553:        /* lambda */
                    554:                = $$ = NIL;
                    555:                |
                    556:        YINT ':' stat
                    557:                = $$ = tree4(T_LABEL, lineof($2), $1 == NIL ? NIL : *hash($1, 1), $3);
                    558:                |
                    559:        proc_id
                    560:                = $$ = tree4(T_PCALL, lineof(yyline), $1, NIL);
                    561:                |
                    562:        proc_id '(' wexpr_list ')'
                    563:                = $$ = tree4(T_PCALL, lineof($2), $1, fixlist($3));
                    564:                |
                    565:        YID error
                    566:                = goto NSerror;
                    567:                |
                    568:        assign
                    569:                |
                    570:        YBEGIN stat_list YEND
                    571:                = {
                    572:                        $$ = tree3(T_BLOCK, lineof($1), fixlist($2));
                    573:                        if ($3 < 0)
                    574:                                brerror($1, "begin");
                    575:                  }
                    576:                |
                    577:        YCASE expr YOF cstat_list YEND
                    578:                = {
                    579:                        $$ = tree4(T_CASE, lineof($1), $2, fixlist($4));
                    580:                        if ($5 < 0)
                    581:                                brerror($1, "case");
                    582:                  }
                    583:                |
                    584:        YWITH var_list YDO stat
                    585:                = $$ = tree4(T_WITH, lineof($1), fixlist($2), $4);
                    586:                |
                    587:        YWHILE expr YDO stat
                    588:                = $$ = tree4(T_WHILE, lineof($1), $2, $4);
                    589:                |
                    590:        YREPEAT stat_list YUNTIL expr
                    591:                = $$ = tree4(T_REPEAT, lineof($3), fixlist($2), $4);
                    592:                |
                    593:        YFOR assign YTO expr YDO stat
                    594:                = $$ = tree5(T_FORU, lineof($1), $2, $4, $6);
                    595:                |
                    596:        YFOR assign YDOWNTO expr YDO stat
                    597:                = $$ = tree5(T_FORD, lineof($1), $2, $4, $6);
                    598:                |
                    599:        YGOTO YINT
                    600:                = $$ = tree3(T_GOTO, lineof($1), *hash($2, 1));
                    601:                |
                    602:        YIF expr YTHEN stat
                    603:                = $$ = tree5(T_IF, lineof($1), $2, $4, NIL);
                    604:                |
                    605:        YIF expr YTHEN stat YELSE stat
                    606:                = $$ = tree5(T_IFEL, lineof($1), $2, $4, $6);
                    607:                |
                    608:        error
                    609:                = {
                    610: NSerror:
                    611:                        $$ = NIL;
                    612: Serror:
                    613:                        yyPerror("Malformed statement", PSTAT);
                    614:                  }
                    615:                ;
                    616: assign:
                    617:        variable ':' '=' expr
                    618:                = $$ = tree4(T_ASGN, lineof($2), $1, $4);
                    619:                ;
                    620: 
                    621: /*
                    622:  * EXPRESSION
                    623:  */
                    624: 
                    625: expr:
                    626:        error
                    627:                = {
                    628: NEerror:
                    629:                        $$ = NIL;
                    630: Eerror:
                    631:                        yyPerror("Missing/malformed expression", PEXPR);
                    632:                  }
                    633:                |
                    634:        expr relop expr                 %prec '<'
                    635:                = $$ = tree4($2, $1[1] == SAWCON ? $3[1] : $1[1], $1, $3);
                    636:                |
                    637:        '+' expr                        %prec UNARYSIGN
                    638:                = $$ = tree3(T_PLUS, $2[1], $2);
                    639:                |
                    640:        '-' expr                        %prec UNARYSIGN
                    641:                = $$ = tree3(T_MINUS, $2[1], $2);
                    642:                |
                    643:        expr addop expr                 %prec '+'
                    644:                = $$ = tree4($2, $1[1] == SAWCON ? $3[1] : $1[1], $1, $3);
                    645:                |
                    646:        expr divop expr                 %prec '*'
                    647:                = $$ = tree4($2, $1[1] == SAWCON ? $3[1] : $1[1], $1, $3);
                    648:                |
                    649:        YNIL
                    650:                = $$ = tree2(T_NIL, NOCON);
                    651:                |
                    652:        YSTRING
                    653:                = $$ = tree3(T_STRNG, SAWCON, $1);
                    654:                |
                    655:        YINT
                    656:                = $$ = tree3(T_INT, NOCON, $1);
                    657:                |
                    658:        YBINT
                    659:                = $$ = tree3(T_BINT, NOCON, $1);
                    660:                |
                    661:        YNUMB
                    662:                = $$ = tree3(T_FINT, NOCON, $1);
                    663:                |
                    664:        variable
                    665:                |
                    666:        YID error
                    667:                = goto NEerror;
                    668:                |
                    669:        func_id '(' wexpr_list ')'
                    670:                = $$ = tree4(T_FCALL, NOCON, $1, fixlist($3));
                    671:                |
                    672:        '(' expr ')'
                    673:                = $$ = $2;
                    674:                |
                    675:        negop expr                      %prec YNOT
                    676:                = $$ = tree3(T_NOT, NOCON, $2);
                    677:                |
                    678:        '[' element_list ']'
                    679:                = $$ = tree3(T_CSET, SAWCON, fixlist($2));
                    680:                |
                    681:        '[' ']'
                    682:                = $$ = tree3(T_CSET, SAWCON, NIL);
                    683:                ;
                    684: 
                    685: element_list:
                    686:        element
                    687:                = $$ = newlist($1);
                    688:                |
                    689:        element_list ',' element
                    690:                = $$ = addlist($1, $3);
                    691:                ;
                    692: element:
                    693:        expr
                    694:                |
                    695:        expr YDOTDOT expr
                    696:                = $$ = tree3(T_RANG, $1, $3);
                    697:                ;
                    698: 
                    699: /*
                    700:  * QUALIFIED VARIABLES
                    701:  */
                    702: 
                    703: variable:
                    704:        YID
                    705:                = {
                    706:                        @@ return (identis(var, VAR));
                    707:                        $$ = setupvar($1, NIL);
                    708:                  }
                    709:                |
                    710:        qual_var
                    711:                = $1[3] = fixlist($1[3]);
                    712:                ;
                    713: qual_var:
                    714:        array_id '[' expr_list ']'
                    715:                = $$ = setupvar($1, tree2(T_ARY, fixlist($3)));
                    716:                |
                    717:        qual_var '[' expr_list ']'
                    718:                = $1[3] = addlist($1[3], tree2(T_ARY, fixlist($3)));
                    719:                |
                    720:        record_id '.' field_id
                    721:                = $$ = setupvar($1, setupfield($3, NIL));
                    722:                |
                    723:        qual_var '.' field_id
                    724:                = $1[3] = addlist($1[3], setupfield($3, NIL));
                    725:                |
                    726:        ptr_id '^'
                    727:                = $$ = setupvar($1, tree1(T_PTR));
                    728:                |
                    729:        qual_var '^'
                    730:                = $1[3] = addlist($1[3], tree1(T_PTR));
                    731:                ;
                    732: 
                    733: /*
                    734:  * Expression with write widths
                    735:  */
                    736: wexpr:
                    737:        expr
                    738:                |
                    739:        expr ':' expr
                    740:                = $$ = tree4(T_WEXP, $1, $3, NIL);
                    741:                |
                    742:        expr ':' expr ':' expr
                    743:                = $$ = tree4(T_WEXP, $1, $3, $5);
                    744:                |
                    745:        expr octhex
                    746:                = $$ = tree4(T_WEXP, $1, NIL, $2);
                    747:                |
                    748:        expr ':' expr octhex
                    749:                = $$ = tree4(T_WEXP, $1, $3, $4);
                    750:                ;
                    751: octhex:
                    752:        YOCT
                    753:                = $$ = OCT;
                    754:                |
                    755:        YHEX
                    756:                = $$ = HEX;
                    757:                ;
                    758: 
                    759: expr_list:
                    760:        expr
                    761:                = $$ = newlist($1);
                    762:                |
                    763:        expr_list ',' expr
                    764:                = $$ = addlist($1, $3);
                    765:                ;
                    766: 
                    767: wexpr_list:
                    768:        wexpr
                    769:                = $$ = newlist($1);
                    770:                |
                    771:        wexpr_list ',' wexpr
                    772:                = $$ = addlist($1, $3);
                    773:                ;
                    774: 
                    775: /*
                    776:  * OPERATORS
                    777:  */
                    778: 
                    779: relop:
                    780:        '='     = $$ = T_EQ;
                    781:                |
                    782:        '<'     = $$ = T_LT;
                    783:                |
                    784:        '>'     = $$ = T_GT;
                    785:                |
                    786:        '<' '>' = $$ = T_NE;
                    787:                |
                    788:        '<' '=' = $$ = T_LE;
                    789:                |
                    790:        '>' '=' = $$ = T_GE;
                    791:                |
                    792:        YIN     = $$ = T_IN;
                    793:                ;
                    794: addop:
                    795:        '+'     = $$ = T_ADD;
                    796:                |
                    797:        '-'     = $$ = T_SUB;
                    798:                |
                    799:        YOR     = $$ = T_OR;
                    800:                |
                    801:        '|'     = $$ = T_OR;
                    802:                ;
                    803: divop:
                    804:        '*'     = $$ = T_MULT;
                    805:                |
                    806:        '/'     = $$ = T_DIVD;
                    807:                |
                    808:        YDIV    = $$ = T_DIV;
                    809:                |
                    810:        YMOD    = $$ = T_MOD;
                    811:                |
                    812:        YAND    = $$ = T_AND;
                    813:                |
                    814:        '&'     = $$ = T_AND;
                    815:                ;
                    816: 
                    817: negop:
                    818:        YNOT
                    819:                |
                    820:        '~'
                    821:                ;
                    822: 
                    823: /*
                    824:  * LISTS
                    825:  */
                    826: 
                    827: var_list:
                    828:        variable
                    829:                = $$ = newlist($1);
                    830:                |
                    831:        var_list ',' variable
                    832:                = $$ = addlist($1, $3);
                    833:                ;
                    834: 
                    835: id_list:
                    836:        YID
                    837:                = $$ = newlist($1);
                    838:                |
                    839:        id_list ',' YID
                    840:                = $$ = addlist($1, $3);
                    841:                ;
                    842: 
                    843: /*
                    844:  * Identifier productions with semantic restrictions
                    845:  *
                    846:  * For these productions, the characters @@ signify
                    847:  * that the associated C statement is to provide
                    848:  * the semantic restriction for this reduction.
                    849:  * These lines are made into a procedure yyEactr, similar to
                    850:  * yyactr, which determines whether the corresponding reduction
                    851:  * is permitted, or whether an error is to be signaled.
                    852:  * A zero return from yyEactr is considered an error.
                    853:  * YyEactr is called with an argument "var" giving the string
                    854:  * name of the variable in question, essentially $1, although
                    855:  * $1 will not work because yyEactr is called from loccor in
                    856:  * the recovery routines.
                    857:  */
                    858: 
                    859: const_id:
                    860:        YID
                    861:                = @@ return (identis(var, CONST));
                    862:                ;
                    863: type_id:
                    864:        YID
                    865:                = {
                    866:                        @@ return (identis(var, TYPE));
                    867:                        $$ = tree3(T_TYID, lineof(yyline), $1);
                    868:                  }
                    869:                ;
                    870: var_id:
                    871:        YID
                    872:                = @@ return (identis(var, VAR));
                    873:                ;
                    874: array_id:
                    875:        YID
                    876:                = @@ return (identis(var, ARRAY));
                    877:                ;
                    878: ptr_id:
                    879:        YID
                    880:                = @@ return (identis(var, PTRFILE));
                    881:                ;
                    882: record_id:
                    883:        YID
                    884:                = @@ return (identis(var, RECORD));
                    885:                ;
                    886: field_id:
                    887:        YID
                    888:                = @@ return (identis(var, FIELD));
                    889:                ;
                    890: proc_id:
                    891:        YID
                    892:                = @@ return (identis(var, PROC));
                    893:                ;
                    894: func_id:
                    895:        YID
                    896:                = @@ return (identis(var, FUNC));
                    897:                ;

unix.superglobalmegacorp.com

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