Annotation of 42BSD/ucb/dbx/commands.y, revision 1.1.1.1

1.1       root        1: %{
                      2: 
                      3: /* Copyright (c) 1982 Regents of the University of California */
                      4: 
                      5: static char sccsid[] = "@(#)commands.y 1.9 8/17/83";
                      6: 
                      7: /*
                      8:  * Yacc grammar for debugger commands.
                      9:  */
                     10: 
                     11: #include "defs.h"
                     12: #include "symbols.h"
                     13: #include "operators.h"
                     14: #include "tree.h"
                     15: #include "process.h"
                     16: #include "source.h"
                     17: #include "scanner.h"
                     18: #include "names.h"
                     19: #include "lists.h"
                     20: 
                     21: private String curformat = "X";
                     22: 
                     23: %}
                     24: 
                     25: %term
                     26:     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP
                     27:     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
                     28:     PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
                     29:     STOP STOPI TRACE TRACEI
                     30:     USE WHATIS WHEN WHERE WHEREIS WHICH
                     31: 
                     32: %term INT REAL NAME STRING
                     33: %term LFORMER RFORMER ABSTRACTION ARROW
                     34: 
                     35: %right INT
                     36: %binary REDIRECT
                     37: %binary '<' '=' '>' '!' IN
                     38: %left '+' '-' OR
                     39: %left UNARYSIGN
                     40: %left '*' '/' DIV MOD AND
                     41: %left NOT '(' '[' '.' '^' ARROW
                     42: %left '\\'
                     43: 
                     44: %union {
                     45:     Name y_name;
                     46:     Symbol y_sym;
                     47:     Node y_node;
                     48:     Integer y_int;
                     49:     Operator y_op;
                     50:     long y_long;
                     51:     double y_real;
                     52:     String y_string;
                     53:     Boolean y_bool;
                     54:     Cmdlist y_cmdlist;
                     55:     List y_list;
                     56: };
                     57: 
                     58: %type <y_op>       trace stop
                     59: %type <y_long>     INT count
                     60: %type <y_real>     REAL
                     61: %type <y_string>    STRING redirectout filename opt_filename mode
                     62: %type <y_name>     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP
                     63: %type <y_name>     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
                     64: %type <y_name>     NEXT NEXTI NIL NOT OR
                     65: %type <y_name>     PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
                     66: %type <y_name>     STOP STOPI TRACE TRACEI
                     67: %type <y_name>     USE WHATIS WHEN WHERE WHEREIS WHICH
                     68: %type <y_name>     name NAME keyword
                     69: %type <y_node>      symbol
                     70: %type <y_node>     command rcommand cmd step what where examine
                     71: %type <y_node>     event opt_exp_list opt_cond
                     72: %type <y_node>     exp_list exp term boolean_exp constant address
                     73: %type <y_node>     alias_command list_command line_number
                     74: %type <y_cmdlist>   actions
                     75: %type <y_list>      sourcepath
                     76: 
                     77: %%
                     78: 
                     79: input:
                     80:     input command_nl
                     81: |
                     82:     /* empty */
                     83: ;
                     84: command_nl:
                     85:     command_line '\n'
                     86: |
                     87:     command_line ';'
                     88: |
                     89:     '\n'
                     90: ;
                     91: 
                     92: command_line:
                     93:     command
                     94: {
                     95:        if ($1 != nil) {
                     96:             if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
                     97:            eval($1);
                     98:        }
                     99: }
                    100: |
                    101:     rcommand redirectout
                    102: {
                    103:        if ($1 != nil) {
                    104:            if ($2 != nil) {
                    105:                setout($2);
                    106:                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
                    107:                eval($1);
                    108:                unsetout();
                    109:            } else {
                    110:                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
                    111:                eval($1);
                    112:            }
                    113:        }
                    114: }
                    115: ;
                    116: redirectout:
                    117:     '>' shellmode NAME
                    118: {
                    119:        $$ = ident($3);
                    120: }
                    121: |
                    122:     /* empty */
                    123: {
                    124:        $$ = nil;
                    125: }
                    126: ;
                    127: 
                    128: /*
                    129:  * Non-redirectable commands.
                    130:  */
                    131: command:
                    132:     alias_command
                    133: {
                    134:        $$ = $1;
                    135: }
                    136: |
                    137:     ASSIGN term '=' exp
                    138: {
                    139:        $$ = build(O_ASSIGN, $2, $4);
                    140: }
                    141: |
                    142:     CATCH INT
                    143: {
                    144:        $$ = build(O_CATCH, $2);
                    145: }
                    146: |
                    147:     CONT
                    148: {
                    149:        $$ = build(O_CONT, (long) DEFSIG);
                    150: }
                    151: |
                    152:     CONT INT
                    153: {
                    154:        $$ = build(O_CONT, $2);
                    155: }
                    156: |
                    157:     DELETE INT
                    158: {
                    159:        $$ = build(O_DELETE, $2);
                    160: }
                    161: |
                    162:     EDIT shellmode opt_filename
                    163: {
                    164:        $$ = build(O_EDIT, $3);
                    165: }
                    166: |
                    167:     FILE shellmode opt_filename
                    168: {
                    169:        $$ = build(O_CHFILE, $3);
                    170: }
                    171: |
                    172:     FUNC
                    173: {
                    174:        $$ = build(O_FUNC, nil);
                    175: }
                    176: |
                    177:     FUNC symbol
                    178: {
                    179:        $$ = build(O_FUNC, $2);
                    180: }
                    181: |
                    182:     GRIPE
                    183: {
                    184:        $$ = build(O_GRIPE);
                    185: }
                    186: |
                    187:     HELP
                    188: {
                    189:        $$ = build(O_HELP);
                    190: }
                    191: |
                    192:     IGNORE INT
                    193: {
                    194:        $$ = build(O_IGNORE, $2);
                    195: }
                    196: |
                    197:     list_command
                    198: {
                    199:        $$ = $1;
                    200: }
                    201: |
                    202:     PSYM term
                    203: {
                    204:        $$ = build(O_PSYM, $2);
                    205: }
                    206: |
                    207:     QUIT
                    208: {
                    209:        if (not popinput()) {
                    210:            quit(0);
                    211:        } else {
                    212:            $$ = nil;
                    213:        }
                    214: }
                    215: |
                    216:     runcommand
                    217: {
                    218:        run();
                    219:        /* NOTREACHED */
                    220: }
                    221: |
                    222:     SH
                    223: {
                    224:        shellline();
                    225:        $$ = nil;
                    226: }
                    227: |
                    228:     SOURCE shellmode filename
                    229: {
                    230:        $$ = build(O_SOURCE, $3);
                    231: }
                    232: |
                    233:     step
                    234: {
                    235:        $$ = $1;
                    236: }
                    237: |
                    238:     stop where opt_cond
                    239: {
                    240:        $$ = build($1, nil, $2, $3);
                    241: }
                    242: |
                    243:     stop what opt_cond
                    244: {
                    245:        $$ = build($1, $2, nil, $3);
                    246: }
                    247: |
                    248:     stop IF boolean_exp
                    249: {
                    250:        $$ = build($1, nil, nil, $3);
                    251: }
                    252: |
                    253:     trace what where opt_cond
                    254: {
                    255:        $$ = build($1, $2, $3, $4);
                    256: }
                    257: |
                    258:     trace where opt_cond
                    259: {
                    260:        $$ = build($1, nil, $2, $3);
                    261: }
                    262: |
                    263:     trace what opt_cond
                    264: {
                    265:        $$ = build($1, $2, nil, $3);
                    266: }
                    267: |
                    268:     trace opt_cond
                    269: {
                    270:        $$ = build($1, nil, nil, $2);
                    271: }
                    272: |
                    273:     WHATIS term
                    274: {
                    275:        $$ = build(O_WHATIS, $2);
                    276: }
                    277: |
                    278:     WHEN event '{' actions '}'
                    279: {
                    280:        $$ = build(O_ADDEVENT, $2, $4);
                    281: }
                    282: |
                    283:     WHEREIS symbol
                    284: {
                    285:        $$ = build(O_WHEREIS, $2);
                    286: }
                    287: |
                    288:     WHICH symbol
                    289: {
                    290:        $$ = build(O_WHICH, $2);
                    291: }
                    292: |
                    293:     USE shellmode sourcepath
                    294: {
                    295:        String dir;
                    296: 
                    297:        $$ = nil;
                    298:        if (list_size($3) == 0) {
                    299:            foreach (String, dir, sourcepath)
                    300:                printf("%s ", dir);
                    301:            endfor
                    302:            printf("\n");
                    303:        } else {
                    304:            foreach (String, dir, sourcepath)
                    305:                list_delete(list_curitem(sourcepath), sourcepath);
                    306:            endfor
                    307:            sourcepath = $3;
                    308:        }
                    309: }
                    310: ;
                    311: runcommand:
                    312:     run { arginit(); } arglist
                    313: |
                    314:     run
                    315: ;
                    316: run:
                    317:     RUN shellmode
                    318: {
                    319:        fflush(stdout);
                    320: }
                    321: ;
                    322: arglist:
                    323:     arglist arg
                    324: |
                    325:     arg
                    326: ;
                    327: arg:
                    328:     NAME
                    329: {
                    330:        newarg(ident($1));
                    331: }
                    332: |
                    333:     '<' NAME
                    334: {
                    335:        inarg(ident($2));
                    336: }
                    337: |
                    338:     '>' NAME
                    339: {
                    340:        outarg(ident($2));
                    341: }
                    342: ;
                    343: step:
                    344:     STEP
                    345: {
                    346:        $$ = build(O_STEP, true, false);
                    347: }
                    348: |
                    349:     STEPI
                    350: {
                    351:        $$ = build(O_STEP, false, false);
                    352: }
                    353: |
                    354:     NEXT
                    355: {
                    356:        $$ = build(O_STEP, true, true);
                    357: }
                    358: |
                    359:     NEXTI
                    360: {
                    361:        $$ = build(O_STEP, false, true);
                    362: }
                    363: ;
                    364: shellmode:
                    365:     /* empty */
                    366: {
                    367:        beginshellmode();
                    368: }
                    369: ;
                    370: sourcepath:
                    371:     sourcepath NAME
                    372: {
                    373:        $$ = $1;
                    374:        list_append(list_item(ident($2)), nil, $$);
                    375: }
                    376: |
                    377:     /* empty */
                    378: {
                    379:        $$ = list_alloc();
                    380: }
                    381: ;
                    382: event:
                    383:     where
                    384: |
                    385:     exp
                    386: ;
                    387: actions:
                    388:     actions cmd ';'
                    389: {
                    390:        $$ = $1;
                    391:        cmdlist_append($2, $$);
                    392: }
                    393: |
                    394:     cmd ';'
                    395: {
                    396:        $$ = list_alloc();
                    397:        cmdlist_append($1, $$);
                    398: }
                    399: ;
                    400: cmd:
                    401:     command
                    402: |
                    403:     rcommand
                    404: ;
                    405: 
                    406: /*
                    407:  * Redirectable commands.
                    408:  */
                    409: rcommand:
                    410:     PRINT exp_list
                    411: {
                    412:        $$ = build(O_PRINT, $2);
                    413: }
                    414: |
                    415:     WHERE
                    416: {
                    417:        $$ = build(O_WHERE);
                    418: }
                    419: |
                    420:     examine
                    421: {
                    422:        $$ = $1;
                    423: }
                    424: |
                    425:     CALL term
                    426: {
                    427:        $$ = $2;
                    428: }
                    429: |
                    430:     DEBUG INT
                    431: {
                    432:        $$ = build(O_DEBUG, $2);
                    433: }
                    434: |
                    435:     DUMP
                    436: {
                    437:        $$ = build(O_DUMP);
                    438: }
                    439: |
                    440:     STATUS
                    441: {
                    442:        $$ = build(O_STATUS);
                    443: }
                    444: ;
                    445: alias_command:
                    446:     ALIAS name name
                    447: {
                    448:        $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
                    449: }
                    450: |
                    451:     ALIAS name
                    452: {
                    453:        $$ = build(O_ALIAS, build(O_NAME, $2), nil);
                    454: }
                    455: |
                    456:     ALIAS
                    457: {
                    458:        $$ = build(O_ALIAS, nil, nil);
                    459: }
                    460: ;
                    461: trace:
                    462:     TRACE
                    463: {
                    464:        $$ = O_TRACE;
                    465: }
                    466: |
                    467:     TRACEI
                    468: {
                    469:        $$ = O_TRACEI;
                    470: }
                    471: ;
                    472: stop:
                    473:     STOP
                    474: {
                    475:        $$ = O_STOP;
                    476: }
                    477: |
                    478:     STOPI
                    479: {
                    480:        $$ = O_STOPI;
                    481: }
                    482: ;
                    483: what:
                    484:     exp
                    485: {
                    486:        $$ = $1;
                    487: }
                    488: |
                    489:     STRING ':' line_number
                    490: {
                    491:        $$ = build(O_QLINE, build(O_SCON, $1), $3);
                    492: }
                    493: ;
                    494: where:
                    495:     IN term
                    496: {
                    497:        $$ = $2;
                    498: }
                    499: |
                    500:     AT line_number
                    501: {
                    502:        $$ = build(O_QLINE, build(O_SCON, cursource), $2);
                    503: }
                    504: |
                    505:     AT STRING ':' line_number
                    506: {
                    507:        $$ = build(O_QLINE, build(O_SCON, $2), $4);
                    508: }
                    509: ;
                    510: filename:
                    511:     NAME
                    512: {
                    513:        $$ = ident($1);
                    514: }
                    515: ;
                    516: opt_filename:
                    517:     /* empty */
                    518: {
                    519:        $$ = nil;
                    520: }
                    521: |
                    522:     filename
                    523: {
                    524:        $$ = $1;
                    525: }
                    526: ;
                    527: opt_exp_list:
                    528:     exp_list
                    529: {
                    530:        $$ = $1;
                    531: }
                    532: |
                    533:     /* empty */
                    534: {
                    535:        $$ = nil;
                    536: }
                    537: ;
                    538: list_command:
                    539:     LIST
                    540: {
                    541:        $$ = build(O_LIST,
                    542:            build(O_LCON, (long) cursrcline),
                    543:            build(O_LCON, (long) cursrcline + 9)
                    544:        );
                    545: }
                    546: |
                    547:     LIST line_number
                    548: {
                    549:        $$ = build(O_LIST, $2, $2);
                    550: }
                    551: |
                    552:     LIST line_number ',' line_number
                    553: {
                    554:        $$ = build(O_LIST, $2, $4);
                    555: }
                    556: |
                    557:     LIST symbol
                    558: {
                    559:        $$ = build(O_LIST, $2);
                    560: }
                    561: ;
                    562: line_number:
                    563:     INT
                    564: {
                    565:        $$ = build(O_LCON, $1);
                    566: }
                    567: |
                    568:     '$'
                    569: {
                    570:        $$ = build(O_LCON, (long) LASTLINE);
                    571: }
                    572: ;
                    573: examine:
                    574:     address '/' count mode
                    575: {
                    576:        $$ = build(O_EXAMINE, $4, $1, nil, $3);
                    577: }
                    578: |
                    579:     address ',' address '/' mode
                    580: {
                    581:        $$ = build(O_EXAMINE, $5, $1, $3, 0);
                    582: }
                    583: |
                    584:     '/' count mode
                    585: {
                    586:        $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
                    587: }
                    588: |
                    589:     address '=' mode
                    590: {
                    591:        $$ = build(O_EXAMINE, $3, $1, nil, 0);
                    592: }
                    593: ;
                    594: address:
                    595:     INT
                    596: {
                    597:        $$ = build(O_LCON, $1);
                    598: }
                    599: |
                    600:     '&' term
                    601: {
                    602:        $$ = amper($2);
                    603: }
                    604: |
                    605:     address '+' address
                    606: {
                    607:        $$ = build(O_ADD, $1, $3);
                    608: }
                    609: |
                    610:     address '-' address
                    611: {
                    612:        $$ = build(O_SUB, $1, $3);
                    613: }
                    614: |
                    615:     address '*' address
                    616: {
                    617:        $$ = build(O_MUL, $1, $3);
                    618: }
                    619: |
                    620:     '*' address %prec UNARYSIGN
                    621: {
                    622:        $$ = build(O_INDIR, $2);
                    623: }
                    624: |
                    625:     '(' exp ')'
                    626: {
                    627:        $$ = $2;
                    628: }
                    629: ;
                    630: count:
                    631:     /* empty */
                    632: {
                    633:        $$ = 1;
                    634: }
                    635: |
                    636:     INT
                    637: {
                    638:        $$ = $1;
                    639: }
                    640: ;
                    641: mode:
                    642:     name
                    643: {
                    644:        $$ = ident($1);
                    645:        curformat = $$;
                    646: }
                    647: |
                    648:     /* empty */
                    649: {
                    650:        $$ = curformat;
                    651: }
                    652: ;
                    653: opt_cond:
                    654:     /* empty */
                    655: {
                    656:        $$ = nil;
                    657: }
                    658: |
                    659:     IF boolean_exp
                    660: {
                    661:        $$ = $2;
                    662: }
                    663: ;
                    664: exp_list:
                    665:     exp
                    666: {
                    667:        $$ = build(O_COMMA, $1, nil);
                    668: }
                    669: |
                    670:     exp ',' exp_list
                    671: {
                    672:        $$ = build(O_COMMA, $1, $3);
                    673: }
                    674: ;
                    675: exp:
                    676:     term
                    677: {
                    678:        $$ = build(O_RVAL, $1);
                    679: }
                    680: |
                    681:     constant
                    682: {
                    683:        $$ = $1;
                    684: }
                    685: |
                    686:     exp '\\' symbol
                    687: {
                    688:        $$ = build(O_TYPERENAME, $1, $3);
                    689: }
                    690: |
                    691:     '+' exp %prec UNARYSIGN
                    692: {
                    693:        $$ = $2;
                    694: }
                    695: |
                    696:     '-' exp %prec UNARYSIGN
                    697: {
                    698:        $$ = build(O_NEG, $2);
                    699: }
                    700: |
                    701:     '&' exp %prec UNARYSIGN
                    702: {
                    703:        $$ = amper($2);
                    704: }
                    705: |
                    706:     exp '+' exp
                    707: {
                    708:        $$ = build(O_ADD, $1, $3);
                    709: }
                    710: |
                    711:     exp '-' exp
                    712: {
                    713:        $$ = build(O_SUB, $1, $3);
                    714: }
                    715: |
                    716:     exp '*' exp
                    717: {
                    718:        $$ = build(O_MUL, $1, $3);
                    719: }
                    720: |
                    721:     exp '/' exp
                    722: {
                    723:        $$ = build(O_DIVF, $1, $3);
                    724: }
                    725: |
                    726:     exp DIV exp
                    727: {
                    728:        $$ = build(O_DIV, $1, $3);
                    729: }
                    730: |
                    731:     exp MOD exp
                    732: {
                    733:        $$ = build(O_MOD, $1, $3);
                    734: }
                    735: |
                    736:     exp AND exp
                    737: {
                    738:        $$ = build(O_AND, $1, $3);
                    739: }
                    740: |
                    741:     exp OR exp
                    742: {
                    743:        $$ = build(O_OR, $1, $3);
                    744: }
                    745: |
                    746:     exp '<' exp
                    747: {
                    748:        $$ = build(O_LT, $1, $3);
                    749: }
                    750: |
                    751:     exp '<' '=' exp
                    752: {
                    753:        $$ = build(O_LE, $1, $4);
                    754: }
                    755: |
                    756:     exp '>' exp
                    757: {
                    758:        $$ = build(O_GT, $1, $3);
                    759: }
                    760: |
                    761:     exp '>' '=' exp
                    762: {
                    763:        $$ = build(O_GE, $1, $4);
                    764: }
                    765: |
                    766:     exp '=' exp
                    767: {
                    768:        $$ = build(O_EQ, $1, $3);
                    769: }
                    770: |
                    771:     exp '=' '=' exp
                    772: {
                    773:        $$ = build(O_EQ, $1, $4);
                    774: }
                    775: |
                    776:     exp '<' '>' exp
                    777: {
                    778:        $$ = build(O_NE, $1, $4);
                    779: }
                    780: |
                    781:     exp '!' '=' exp
                    782: {
                    783:        $$ = build(O_NE, $1, $4);
                    784: }
                    785: |
                    786:     '(' exp ')'
                    787: {
                    788:        $$ = $2;
                    789: }
                    790: ;
                    791: term:
                    792:     symbol
                    793: {
                    794:        $$ = $1;
                    795: }
                    796: |
                    797:     term '[' exp_list ']'
                    798: {
                    799:        $$ = subscript($1, $3);
                    800: }
                    801: |
                    802:     term '.' name
                    803: {
                    804:        $$ = dot($1, $3);
                    805: }
                    806: |
                    807:     term ARROW name
                    808: {
                    809:        $$ = dot($1, $3);
                    810: }
                    811: |
                    812:     '*' term %prec UNARYSIGN
                    813: {
                    814:        $$ = build(O_INDIR, $2);
                    815: }
                    816: |
                    817:     '*' '(' exp ')' %prec UNARYSIGN
                    818: {
                    819:        $$ = build(O_INDIR, $3);
                    820: }
                    821: |
                    822:     term '^' %prec UNARYSIGN
                    823: {
                    824:        $$ = build(O_INDIR, $1);
                    825: }
                    826: |
                    827:     '#' term %prec UNARYSIGN
                    828: {
                    829:        $$ = concrete($2);
                    830: }
                    831: |
                    832:     term '(' opt_exp_list ')'
                    833: {
                    834:        $$ = build(O_CALL, $1, $3);
                    835: }
                    836: ;
                    837: boolean_exp:
                    838:     exp
                    839: {
                    840:        chkboolean($1);
                    841:        $$ = $1;
                    842: }
                    843: ;
                    844: constant:
                    845:     INT
                    846: {
                    847:        $$ = build(O_LCON, $1);
                    848: }
                    849: |
                    850:     REAL
                    851: {
                    852:        $$ = build(O_FCON, $1);
                    853: }
                    854: |
                    855:     STRING
                    856: {
                    857:        $$ = build(O_SCON, $1);
                    858: }
                    859: ;
                    860: symbol:
                    861:     name
                    862: {
                    863:        $$ = build(O_SYM, which($1));
                    864: }
                    865: ;
                    866: name:
                    867:     NAME
                    868: {
                    869:        $$ = $1;
                    870: }
                    871: |
                    872:     keyword
                    873: {
                    874:        $$ = $1;
                    875: }
                    876: keyword:
                    877:     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 
                    878:     DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
                    879:     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
                    880:     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
                    881:     STOP | STOPI | TRACE | TRACEI |
                    882:     USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH
                    883: ;

unix.superglobalmegacorp.com

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