Annotation of 40BSD/cmd/pxp/pas.y, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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