Annotation of researchv10no/cmd/visi/parse.y, revision 1.1.1.1

1.1       root        1: %{
                      2: /*
                      3:  *      parse.y 1.7
                      4:  *
                      5:  *     Parser Description File for Spreadsheet Program `vis'
                      6:  *
                      7:  *      A. F. Gettier
                      8:  *      Bell Laboratories
                      9:  *      Update made 11/15/82 10:51:06
                     10:  *      Retrieved 11/15/82 13:22:37
                     11:  */
                     12: 
                     13: #include       <stdio.h>
                     14: #include       <math.h>
                     15: #include       "curses.h"
                     16: #include       "vis.h"
                     17: 
                     18: extern struct qheader  Fixup;
                     19: 
                     20: int    Inrow, Incol;
                     21: %}
                     22: 
                     23: %start lines
                     24: 
                     25: %union {
                     26:        char    *sval;
                     27:        double  dval;
                     28:        int     ival;
                     29:        struct vdef     vval;
                     30:        struct node     nval;
                     31:        struct range    rval;
                     32:        struct colstat  cval;
                     33: }
                     34: 
                     35: %type <ival> amount direc
                     36: %type <nval> expr
                     37: %type <rval> range
                     38: %type <cval> colstat
                     39: 
                     40: %left '+' '-'
                     41: %left '*' '/' '%'
                     42: %left EXPON
                     43: %left UMINUS
                     44: 
                     45: %token PI ABS ACOS ASIN ATAN ATAN2 COS EXP GAMMA HYPOT
                     46: %token INT LOG POW SIN SQRT COL DUP DUPLICATE
                     47: %token EDIT POSITION REDRAW REFRESH REP REPLICATE ROW
                     48: %token SCALE SHIFT SLIDE SHELL SH WIDTH QUIT TERM LIST
                     49: %token ERROR ZERO THRU AT DEBUG VER UP DOWN LEFT RIGHT
                     50: %token HELP 
                     51: %token <sval>  STR LETTERS READ WRITE COPY
                     52: %token <dval>  NUMBER
                     53: %token <ival>  FUNC
                     54: %token <vval>  AVARIABLE
                     55: %token <nval>  VARIABLE
                     56: 
                     57: %%
                     58: 
                     59: lines  :       /* empty */
                     60:        |       lines line
                     61:        ;
                     62: line   :       AVARIABLE '=' expr TERM
                     63:            {
                     64:                struct node     *nt;
                     65:                /*
                     66:                 *      Get the Target Node
                     67:                 */
                     68:                nt = getnode( $1.row, $1.col );
                     69:                /*
                     70:                 *      Assign the String
                     71:                 */
                     72:                if ( nt->def != 0 )
                     73:                        free( nt->def );
                     74:                nt->def = $1.tval;
                     75:                /*
                     76:                 *      Was the Old Value a String?
                     77:                 */
                     78:                if ( nt->type == STRING ) {
                     79:                        free( nt->svalue );
                     80:                        nt->svalue = 0;
                     81:                }
                     82:                /*
                     83:                 *      Do the assignment
                     84:                 */
                     85:                switch ( $3.type ) {
                     86:                case NUM:
                     87:                        if ( nt->type != NUM || nt->value != $3.value ) {
                     88:                                struct qheader  *y;
                     89:                                struct node     *x;
                     90:                                y = qcopy( &(nt->depend) );
                     91:                                while ( (x=qread( y ) ) != 0 )
                     92:                                        qadd( &Fixup, x );
                     93:                                nt->value = $3.value;
                     94:                                free( (char *)y );
                     95:                        }
                     96:                        nt->type = $3.type;
                     97:                        break;
                     98:                        
                     99:                case STRING:
                    100:                        nt->svalue = $3.svalue;
                    101:                        nt->type = $3.type;
                    102:                        break;
                    103:                default:
                    104:                        nt->type = UNRES;
                    105:                }
                    106:                prnode( nt );
                    107:            }
                    108:        |       COPY TERM
                    109:            {
                    110:                FILE    *fp;
                    111:                char    *fn;
                    112:                if ( $1 == 0 )
                    113:                        fn = getfn();
                    114:                else
                    115:                        fn = $1;
                    116:                if ( (fp=fopen( fn, "w" )) == 0 ) {
                    117:                        char    errbuf[64];
                    118:                        (void)sprintf( errbuf, "Cannot open '%s'", fn );
                    119:                        yyerror( errbuf );
                    120:                        lexinit();
                    121:                }
                    122:                else {
                    123:                        move( LINES-2, 0 );
                    124:                        printw( "Copying Screen Image to File '%s'", fn );
                    125:                        clrtoeol();
                    126:                        refresh();
                    127:                        copyfile( fp );
                    128:                        (void)fclose( fp );
                    129:                }
                    130:            }
                    131:        |       DEBUG TERM
                    132:            {
                    133: /*
                    134:                yydebug = 1 - yydebug;
                    135: */
                    136:            }
                    137:        |       DUPLICATE range AT VARIABLE TERM
                    138:            {
                    139:                duplicate( $2.fromrow, $2.fromcol, $2.torow, $2.tocol,
                    140:                    $4.row, $4.col );
                    141:            }
                    142:        |       DUP range AT VARIABLE TERM
                    143:            {
                    144:                duplicate( $2.fromrow, $2.fromcol, $2.torow, $2.tocol,
                    145:                    $4.row, $4.col );
                    146:            }
                    147:        |       EDIT TERM
                    148:            {
                    149:                editfile();
                    150:            }
                    151:        |       HELP TERM
                    152:            {
                    153:                listhelp();
                    154:            }
                    155:        |       LIST TERM
                    156:            {
                    157:                listfile();
                    158:            }
                    159:        |       QUIT TERM
                    160:            {
                    161:                quit();
                    162:            }
                    163:        |       READ TERM
                    164:            {
                    165:                FILE    *fp;
                    166:                char    *fn;
                    167:                if ( $1 == 0 )
                    168:                        fn = getfn();
                    169:                else
                    170:                        fn = $1;
                    171:                if ( (fp=fopen( fn, "r" )) == 0 ) {
                    172:                        char    errbuf[64];
                    173:                        (void)sprintf( errbuf, "Cannot open '%s'", fn );
                    174:                        yyerror( errbuf );
                    175:                        lexinit();
                    176:                }
                    177:                else {
                    178:                        move( LINES-2, 0 );
                    179:                        printw( "Reading from File '%s'", fn );
                    180:                        clrtoeol();
                    181:                        refresh();
                    182:                        readfile( fp );
                    183:                }
                    184:            }
                    185:        |       REDRAW TERM
                    186:            {
                    187:                wrefresh( curscr );
                    188:            }
                    189:        |       REFRESH TERM
                    190:            {
                    191:                wrefresh( curscr );
                    192:            }
                    193:        |       REPLICATE VARIABLE AT range TERM
                    194:            {
                    195:                replicate( $2.row, $2.col, $4.fromrow, $4.fromcol, $4.torow,
                    196:                    $4.tocol );
                    197:            }
                    198:        |       REP VARIABLE AT range TERM
                    199:            {
                    200:                replicate( $2.row, $2.col, $4.fromrow, $4.fromcol, $4.torow,
                    201:                    $4.tocol );
                    202:            }
                    203:        |       SCALE colstat
                    204:            {
                    205:                if ( $2.colnum < 0 )
                    206:                        setscale( $2.number );
                    207:                else
                    208:                        isetscale( $2.colnum, $2.number );
                    209:            }
                    210:        |       SHIFT direc amount
                    211:            {
                    212:                switch( $2 ) {
                    213:                case 1:
                    214:                        scrup( $3 );
                    215:                        break;
                    216:                case 2:
                    217:                        scrdown( $3 );
                    218:                        break;
                    219:                case 3:
                    220:                        scrleft( $3 );
                    221:                        break;
                    222:                case 4:
                    223:                        scrright( $3 );
                    224:                }
                    225:            }
                    226:        |       SH TERM
                    227:            {
                    228:                move( LINES-1, 0 );
                    229:                clrtoeol();
                    230:                refresh();
                    231:                resetty();
                    232:                (void)system( "/bin/sh" );
                    233:                noecho();
                    234:                crmode();
                    235:                wrefresh( curscr );
                    236:            }
                    237:        |       SHELL TERM
                    238:            {
                    239:                move( LINES-1, 0 );
                    240:                clrtoeol();
                    241:                refresh();
                    242:                resetty();
                    243:                (void)system( "/bin/sh" );
                    244:                noecho();
                    245:                crmode();
                    246:                wrefresh( curscr );
                    247:            }
                    248:        |       VER TERM
                    249:            {
                    250:                yyerror("VIS 1.7 11/15/82");
                    251:            }
                    252:        |       WIDTH colstat
                    253:            {
                    254:                if ( $2.colnum < 0 )
                    255:                        setwidth( $2.number );
                    256:                else
                    257:                        isetwidth( $2.colnum, $2.number );
                    258:            }
                    259:        |       WRITE TERM
                    260:            {
                    261:                FILE    *fp;
                    262:                char    *fn;
                    263:                if ( $1 == 0 )
                    264:                        fn = getfn();
                    265:                else
                    266:                        fn = $1;
                    267:                if ( (fp=fopen( fn, "w" )) == 0 ) {
                    268:                        char    errbuf[64];
                    269:                        (void)sprintf( errbuf, "Cannot open '%s'", fn );
                    270:                        yyerror( errbuf );
                    271:                        lexinit();
                    272:                }
                    273:                else {
                    274:                        move( LINES-2, 0 );
                    275:                        printw( "Writing to File '%s'", fn );
                    276:                        clrtoeol();
                    277:                        refresh();
                    278: 
                    279:                        dumpfile( fp );
                    280: 
                    281:                        (void)fclose( fp );
                    282:                }
                    283:            }
                    284:        |       ZERO TERM
                    285:            {
                    286:                /*
                    287:                 *      zero out the current definitions
                    288:                 */
                    289:                zerodef();
                    290:                zeroscreen();
                    291:            }
                    292:        |       error TERM
                    293:        ;
                    294: expr   :       '(' expr ')'
                    295:            {
                    296:                $$ = $2;
                    297:            }
                    298:        |       expr '+' expr
                    299:            {
                    300:                $$ = mathop( &($1), &($3) );
                    301:                if ( $$.type == NUM )  $$.value = $1.value + $3.value;
                    302:            }
                    303:        |       expr '-' expr
                    304:            {
                    305:                $$ = mathop( &($1), &($3) );
                    306:                if ( $$.type == NUM )  $$.value = $1.value - $3.value;
                    307:            }
                    308:        |       expr '*' expr
                    309:            {
                    310:                $$ = mathop( &($1), &($3) );
                    311:                if ( $$.type == NUM )  $$.value = $1.value * $3.value;
                    312:            }
                    313:        |       expr '/' expr
                    314:            {
                    315:                $$ = mathop( &($1), &($3) );
                    316:                if ( $$.type == NUM ) {
                    317:                        if ( $3.value == 0 ) $$.value = BIG;
                    318:                        else $$.value = $1.value / $3.value;
                    319:                }
                    320:            }
                    321:        |       expr EXPON expr
                    322:            {
                    323:                $$ = mathop( &($1), &($3) );
                    324:                if ( $$.type == NUM )  $$.value = pow( $1.value, $3.value );
                    325:            }
                    326:        |       '-' expr %prec UMINUS
                    327:            {
                    328:                $$ = $2;
                    329:                $$.value = - $2.value;
                    330:            }
                    331:        |       '+' expr %prec UMINUS
                    332:            {
                    333:                $$ = $2;
                    334:            }
                    335:        |       FUNC '(' expr ')'
                    336:            {
                    337:                double  xval;
                    338:                $$ = mathop( &($3), &($3) );
                    339:                if ( $$.type == NUM ) {
                    340:                        xval = $3.value;
                    341:                        switch( $1 ) {
                    342:                        case ABS:
                    343:                                if ( xval < 0 )  $$.value = -xval;
                    344:                                else $$.value = xval;
                    345:                                break;
                    346:                        case ACOS:
                    347:                                $$.value = acos( xval );
                    348:                                break;
                    349:                        case ASIN:
                    350:                                $$.value = asin( xval );
                    351:                                break;
                    352:                        case ATAN:
                    353:                                $$.value = atan( xval );
                    354:                                break;
                    355:                        case COS:
                    356:                                $$.value = cos( xval );
                    357:                                break;
                    358:                        case EXP:
                    359:                                $$.value = exp( xval );
                    360:                                break;
                    361:                        case GAMMA:
                    362:                                $$.value = gamma( xval );
                    363:                                break;
                    364:                        case INT:
                    365:                                $$.value = (double)((int)xval);
                    366:                                break;
                    367:                        case LOG:
                    368:                                $$.value = log( xval );
                    369:                                break;
                    370:                        case SIN:
                    371:                                $$.value = sin( xval );
                    372:                                break;
                    373:                        case SQRT:
                    374:                                $$.value = sqrt( xval );
                    375:                                break;
                    376:                        default:
                    377:                                lexinit();
                    378:                                unput( '\n' );
                    379:                                yyerror( "Incorrect Function Call" );
                    380:                        }
                    381:                }
                    382:            }
                    383:        |       FUNC '(' expr ',' expr ')'
                    384:            {
                    385:                double  xval, yval;
                    386:                $$ = mathop( &($3), &($5) );
                    387:                if ( $$.type == NUM ) {
                    388:                        xval = $3.value;
                    389:                        yval = $5.value;
                    390:                        switch( $1 ) {
                    391:                        case ATAN2:
                    392:                                $$.value = atan2( xval, yval );
                    393:                                break;
                    394:                        case HYPOT:
                    395:                                $$.value = hypot( xval, yval );
                    396:                                break;
                    397:                        case POW:
                    398:                                $$.value = pow( xval, yval );
                    399:                                break;
                    400:                        default:
                    401:                                lexinit();
                    402:                                unput( '\n' );
                    403:                                yyerror( "Incorrect Function Call" );
                    404:                        }
                    405:                }
                    406:            }
                    407:        |       POSITION '[' expr ',' expr ']'
                    408:            {
                    409:                struct node     *n;
                    410:                $$ = mathop( &($3), &($5) );
                    411:                if ( $$.type == NUM ) {
                    412:                        int     i, j;
                    413:                        i = (int)$3.value-1;
                    414:                        j = (int)$5.value-1;
                    415:                        if ( i < 0 || j < 0 ) {
                    416:                                char    bfr[128];
                    417:                                lexinit();
                    418:                                (void)sprintf( bfr,
                    419:                                    "Illegal Request for Position[ %d, %d ]",
                    420:                                    i+1, j+1 );
                    421:                                yyerror( bfr );
                    422:                                $$.type = UNDEF;
                    423:                                unput( '\n' );
                    424:                        }
                    425:                        else {
                    426:                                n = getnode( i, j );
                    427:                                prnode( n );
                    428:                                qadd( &(n->depend), getnode( Inrow, Incol ) );
                    429:                                $$ = *n;
                    430:                                if ( $$.type == STRING )
                    431:                                        $$.svalue = copystr( $$.svalue );
                    432:                                $$.row = -1;
                    433:                                $$.col = -1;
                    434:                        }
                    435:                }
                    436:                else
                    437:                        $$.type = UNRES;
                    438:            }
                    439:        |       COL
                    440:            {
                    441:                $$.svalue = 0;
                    442:                $$.def = 0;
                    443:                $$.type = NUM;
                    444:                $$.value = (float)(Incol + 1);
                    445:                $$.row = -1;
                    446:                $$.col = -1;
                    447:            }
                    448:        |       ROW
                    449:            {
                    450:                $$.svalue = 0;
                    451:                $$.def = 0;
                    452:                $$.type = NUM;
                    453:                $$.value = (float)(Inrow+1);
                    454:                $$.row = -1;
                    455:                $$.col = -1;
                    456:            }
                    457:        |       VARIABLE
                    458:            {
                    459:                struct node     *x;
                    460:                x = getnode( $1.row, $1.col );
                    461:                $$ = *x;
                    462:                /*  If it is a string, patch it up  */
                    463:                if ( x->type == STRING ) {
                    464:                        $$.svalue = copystr( x->svalue );
                    465:                        $$.row = $$.col = (-1);
                    466:                }
                    467:                /*  Mark The Screen That it is Undef  */
                    468:                if ( x->type == UNDEF )  prnode( x );
                    469:                /*  Set up the Dependency List  */
                    470:                (void)qadd( &(x->depend), getnode( Inrow, Incol ) );
                    471:            }
                    472:        |       STR
                    473:            {
                    474:                $$.row = -1;
                    475:                $$.col = -1;
                    476:                $$.type = STRING;
                    477:                $$.svalue = $1;
                    478:            }
                    479:        |       NUMBER
                    480:            {
                    481:                $$.row = -1;
                    482:                $$.col = -1;
                    483:                $$.type = NUM;
                    484:                $$.value = $1;
                    485:                $$.svalue = 0;
                    486:                $$.def = 0;
                    487:            }
                    488:        ;
                    489: range  :       VARIABLE THRU VARIABLE
                    490:            {
                    491:                $$.fromrow = $1.row;
                    492:                $$.fromcol = $1.col;
                    493:                $$.torow = $3.row;
                    494:                $$.tocol = $3.col;
                    495:            }
                    496:        |       VARIABLE
                    497:            {
                    498:                $$.fromrow = $$.torow = $1.row;
                    499:                $$.fromcol = $$.tocol = $1.col;
                    500:            }
                    501:        ;
                    502: direc  :       UP
                    503:            {
                    504:                $$ = 1;
                    505:            }
                    506:        |       DOWN
                    507:            {
                    508:                $$ = 2;
                    509:            }
                    510:        |       LEFT
                    511:            {
                    512:                $$ = 3;
                    513:            }
                    514:        |       RIGHT
                    515:            {
                    516:                $$ = 4;
                    517:            }
                    518:        ;
                    519: amount :       TERM
                    520:            {
                    521:                $$ = 1;
                    522:            }
                    523:        |       NUMBER TERM
                    524:            {
                    525:                $$ = (int)$1;
                    526:            }
                    527:        ;
                    528: colstat        :       NUMBER TERM
                    529:            {
                    530:                $$.colnum = -1;
                    531:                $$.number = (int)$1;
                    532:            }
                    533:        |       LETTERS NUMBER TERM
                    534:            {
                    535:                $$.colnum = colval( foldup( $1 ) );
                    536:                $$.number = (int)$2;
                    537:                free( $1 );
                    538:            }
                    539:        ;
                    540: %%
                    541: 
                    542: char *
                    543: getfn()
                    544: {
                    545:        static char     chrbuf[64];
                    546:        char            *tbuf;
                    547:        move( 22, 0 );
                    548:        printw("Enter File Name:  " );
                    549:        refresh();
                    550: 
                    551: 
                    552:        tbuf = chrbuf;
                    553:        loop {
                    554:                *tbuf = getch();
                    555:                addch( *tbuf );
                    556:                refresh();
                    557:                if ( *(tbuf++) == '\n' ) break;
                    558:        }
                    559:         *(--tbuf) = '\0';
                    560: 
                    561:        return( chrbuf );
                    562: }
                    563: 
                    564: colval( string )
                    565: char   *string;
                    566: {
                    567:        int     i;
                    568:        i = -1;
                    569:        while ( *string != '\0' ) {
                    570:                i = (i + 1) * 26 + *string - 'A';
                    571:                string++;
                    572:        }
                    573:        return( i );
                    574: }

unix.superglobalmegacorp.com

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