Annotation of 43BSD/contrib/icon/tran/icon.g, revision 1.1.1.1

1.1       root        1: /*     Grammar for Icon Version 5.9, including extensions.     */
                      2: 
                      3: /* primitive tokens */
                      4: 
                      5: %token CSETLIT
                      6:        EOFX
                      7:        IDENT
                      8:        INTLIT
                      9:        REALLIT
                     10:        STRINGLIT
                     11: 
                     12: /* reserved words */
                     13: 
                     14: %token BREAK           /* break */
                     15:        BY              /* by */
                     16:        CASE            /* case */
                     17:        CREATE          /* create */
                     18:        DEFAULT         /* default */
                     19:        DO              /* do */
                     20:        DYNAMIC         /* dynamic */
                     21:        ELSE            /* else */
                     22:        END             /* end */
                     23:        EVERY           /* every */
                     24:        FAIL            /* fail */
                     25:        GLOBAL          /* global */
                     26:        IF              /* if */
                     27:        INITIAL         /* initial */
                     28:        LINK            /* link */
                     29:        LOCAL           /* link */
                     30:        NEXT            /* next */
                     31:        NOT             /* not */
                     32:        OF              /* of */
                     33:        PROCEDURE       /* procedure */
                     34:        RECORD          /* record */
                     35:        REPEAT          /* repeat */
                     36:        RETURN          /* return */
                     37:        STATIC          /* static */
                     38:        SUSPEND         /* suspend */
                     39:        THEN            /* then */
                     40:        TO              /* to */
                     41:        UNTIL           /* until */
                     42:        WHILE           /* while */
                     43: 
                     44: /* operators */
                     45: 
                     46: %token ASSIGN          /* := */
                     47:        AT              /* @ */
                     48:        AUGACT          /* @:= */
                     49:        AUGAND          /* &:= */
                     50:        AUGEQ           /* =:= */
                     51:        AUGEQV          /* ===:= */
                     52:        AUGGE           /* >=:= */
                     53:        AUGGT           /* >:= */
                     54:        AUGLE           /* <=:= */
                     55:        AUGLT           /* <:= */
                     56:        AUGNE           /* ~=:= */
                     57:        AUGNEQV         /* ~===:= */
                     58:        AUGSEQ          /* ==:= */
                     59:        AUGSGE          /* >>=:= */
                     60:        AUGSGT          /* >>:= */
                     61:        AUGSLE          /* <<=:= */
                     62:        AUGSLT          /* <<:= */
                     63:        AUGSNE          /* ~==:= */
                     64:        BACKSLASH       /* \ */
                     65:        BANG            /* ! */
                     66:        BAR             /* | */
                     67:        CARET           /* ^ */
                     68:        CARETASGN       /* ^:= */
                     69:        COLON           /* : */
                     70:        COMMA           /* , */
                     71:        CONCAT          /* || */
                     72:        CONCATASGN      /* ||:= */
                     73:        CONJUNC         /* & */
                     74:        DIFF            /* -- */
                     75:        DIFFASGN        /* --:= */
                     76:        DOT             /* . */
                     77:        EQUIV           /* === */
                     78:        INTER           /* ** */
                     79:        INTERASGN       /* **:= */
                     80:        LBRACE          /* { */
                     81:        LBRACK          /* [ */
                     82:        LCONCAT         /* ||| */
                     83:        LCONCATASGN     /* |||:= */
                     84:        LEXEQ           /* == */
                     85:        LEXGE           /* >>= */
                     86:        LEXGT           /* >> */
                     87:        LEXLE           /* <<= */
                     88:        LEXLT           /* << */
                     89:        LEXNE           /* ~== */
                     90:        LPAREN          /* ( */
                     91:        MCOLON          /* -: */
                     92:        MINUS           /* - */
                     93:        MINUSASGN       /* -:= */
                     94:        MOD             /* % */
                     95:        MODASGN         /* %:= */
                     96:        NOTEQUIV        /* ~=== */
                     97:        NUMEQ           /* = */
                     98:        NUMGE           /* >e */
                     99:        NUMGT           /* > */
                    100:        NUMLE           /* <= */
                    101:        NUMLT           /* > */
                    102:        NUMNE           /* ~= */
                    103:        PCOLON          /* +: */
                    104:        PLUS            /* + */
                    105:        PLUSASGN        /* +:= */
                    106:        QMARK           /* ? */
                    107:        RBRACE          /* } */
                    108:        RBRACK          /* ] */
                    109:        REVASSIGN       /* <- */
                    110:        REVSWAP         /* <-> */
                    111:        RPAREN          /* ) */
                    112:        SCANASGN        /* ?:= */
                    113:        SEMICOL         /* ; */
                    114:        SLASH           /* / */
                    115:        SLASHASGN       /* /:= */
                    116:        STAR            /* * */
                    117:        STARASGN        /* *:= */
                    118:        SWAP            /* :=: */
                    119:        TILDE           /* ~ */
                    120:        UNION           /* ++ */
                    121:        UNIONASGN       /* ++:= */
                    122: %{
                    123: #include "itran.h"
                    124: #include "sym.h"
                    125: #include "tree.h"
                    126: #include "../h/keyword.h"
                    127: #define YYSTYPE nodeptr
                    128: #define YYMAXDEPTH 500
                    129: %}
                    130: 
                    131: %%
                    132: 
                    133: %{
                    134: int argcnt;
                    135: int idflag;
                    136: int i;
                    137: #ifdef XPX
                    138: int cstack[50];                        /* context stack expression lists */
                    139: int stacktop = 0;              /* stack top */
                    140: nodeptr cswitch();
                    141: #endif XPX
                    142: %}
                    143: 
                    144: program        : decls EOFX {gout(globfile);} ;
                    145: 
                    146: decls  : ;     
                    147:        | decls decl ;
                    148: 
                    149: decl   : record {
                    150:                if (!nocode)
                    151:                        rout(globfile, STR0($1));
                    152:                nocode = 0;
                    153:                loc_init();
                    154:                } ;
                    155:        | proc  {
                    156:                if (!nocode)
                    157:                        codegen($1);
                    158:                nocode = 0;
                    159:                treeinit();
                    160:                loc_init();
                    161:                } ;
                    162:        | global ;
                    163:        | LINK lnklist ;
                    164: 
                    165: lnklist        : lnkfile       ;
                    166:        | lnklist COMMA lnkfile;
                    167: 
                    168: lnkfile        : IDENT {addlfile(STR0($1));} ;
                    169:        | STRINGLIT {addlfile(STR0($1));} ;
                    170: 
                    171: global : GLOBAL {idflag = F_GLOBAL;} idlist ;
                    172: 
                    173: record : RECORD {idflag = F_ARGUMENT;} IDENT LPAREN arglist RPAREN {
                    174:                install(STR0($3),F_RECORD|F_GLOBAL,(int)$5);
                    175:                $$ = $3;
                    176:                } ;
                    177: 
                    178: proc   : prochead SEMICOL locals initial procbody END {
                    179:                $$ = (nodeptr)PROCNODE($1,$4,$5,$6);
                    180:                } ;
                    181: 
                    182: prochead: PROCEDURE {idflag = F_ARGUMENT;} IDENT LPAREN arglist RPAREN {
                    183:                $$ = $3;
                    184:                install(STR0($3),F_PROC|F_GLOBAL,(int)$5);
                    185:                } ;
                    186: 
                    187: arglist        : {$$ = (int)0;} ;
                    188:        | idlist {$$ = (nodeptr)$1;} ;
                    189: 
                    190: 
                    191: idlist : IDENT {
                    192:                install(STR0($1),idflag,0);
                    193:                $$ = (nodeptr)1;
                    194:                } ;
                    195:        | idlist COMMA IDENT {
                    196:                install(STR0($3),idflag,0);
                    197:                $$ = (nodeptr)((int)$1 + 1);
                    198:                } ;
                    199: 
                    200: locals : ;
                    201:        | locals retention idlist SEMICOL ;
                    202: 
                    203: retention: LOCAL {idflag = F_DYNAMIC;} ;
                    204:        |       STATIC {idflag = F_STATIC;} ;
                    205:        |       DYNAMIC {idflag = F_DYNAMIC;} ;
                    206: 
                    207: initial        : {$$ = EMPTYNODE;} ;
                    208:        | INITIAL expr SEMICOL {$$ = $2;} ;
                    209: 
                    210: procbody: {$$ = EMPTYNODE;} ;
                    211:        | nexpr SEMICOL procbody {$$ = SLISTNODE($2, $1, $3);} ;
                    212: 
                    213: nexpr  : {$$ = EMPTYNODE;} ;
                    214:        | expr ;
                    215: 
                    216: expr   : expr1a        ;
                    217:        | expr CONJUNC expr1a   {$$ = CONJNODE($2,$1,$3);} ;
                    218: 
                    219: expr1a : expr1 ;
                    220:        | expr1a QMARK expr1    {$$ = SCANNODE($2,$1,$3);} ;
                    221: 
                    222: expr1  : expr2 ;
                    223:        | expr2 op1 expr1 {binop: $$ = BINOPNODE($2,$1,$3);} ;
                    224:        | expr2 op1a expr1 {$$ = AUGOPNODE($2,$1,$3);} ;
                    225:        | expr2 SCANASGN expr1 {$$ = SCANNODE($2,$1,$3);} ;
                    226:        | expr2 AUGAND expr1 {$$ = CONJNODE($2,$1,$3);} ;
                    227:        | expr2 AUGACT expr1 {$$ = ACTIVNODE($2,$3,$1);} ;
                    228: 
                    229: op1    : SWAP ;
                    230:        | ASSIGN ;
                    231:        | REVSWAP ;
                    232:        | REVASSIGN ;
                    233: 
                    234: op1a   : CONCATASGN ;
                    235:        | LCONCATASGN ;
                    236:        | DIFFASGN ;
                    237:        | UNIONASGN ;
                    238:        | PLUSASGN ;
                    239:        | MINUSASGN ;
                    240:        | STARASGN ;
                    241:        | INTERASGN ;
                    242:        | SLASHASGN ;
                    243:        | MODASGN ;
                    244:        | CARETASGN ;
                    245:        | AUGEQ ;
                    246:        | AUGEQV ;
                    247:        | AUGGE ;
                    248:        | AUGGT ;
                    249:        | AUGLE ;
                    250:        | AUGLT ;
                    251:        | AUGNE ;
                    252:        | AUGNEQV ;
                    253:        | AUGSEQ ;
                    254:        | AUGSGE ;
                    255:        | AUGSGT ;
                    256:        | AUGSLE ;
                    257:        | AUGSLT ;
                    258:        | AUGSNE ;
                    259: 
                    260: expr2  : expr3 ;
                    261:        | expr2 TO expr3 {$$ = TONODE($2,$1,$3);} ;
                    262:        | expr2 TO expr3 BY expr3 {$$ = TOBYNODE($2,$1,$3,$5);} ;
                    263: 
                    264: expr3  : expr4 ;
                    265:        | expr4 BAR expr3 {$$ = ALTNODE($2,$1,$3);} ;
                    266: 
                    267: expr4  : expr5 ;
                    268:        | expr4 op4 expr5 {goto binop;} ;
                    269: 
                    270: op4    : LEXEQ ;
                    271:        | LEXGE ;
                    272:        | LEXGT ;
                    273:        | LEXLE ;
                    274:        | LEXLT ;
                    275:        | LEXNE ;
                    276:        | NUMEQ ;
                    277:        | NUMGE ;
                    278:        | NUMGT ;
                    279:        | NUMLE ;
                    280:        | NUMLT ;
                    281:        | NUMNE ;
                    282:        | EQUIV ;
                    283:        | NOTEQUIV ;
                    284: 
                    285: expr5  : expr6 ;
                    286:        | expr5 op5 expr6 {goto binop;} ;
                    287: 
                    288: op5    : CONCAT ;
                    289:        | LCONCAT ;
                    290: 
                    291: expr6  : expr7 ;
                    292:        | expr6 op6 expr7 {goto binop;} ;
                    293: 
                    294: op6    : PLUS ;
                    295:        | DIFF ;
                    296:        | UNION ;
                    297:        | MINUS ;
                    298: 
                    299: expr7  : expr8 ;
                    300:        | expr7 op7 expr8 {goto binop;} ;
                    301: 
                    302: op7    : STAR ;
                    303:        | INTER ;
                    304:        | SLASH ;
                    305:        | MOD ;
                    306: 
                    307: expr8  : expr9 ;
                    308:        | expr9 CARET expr8 {goto binop;} ;
                    309: 
                    310: expr9  : expr10 ;
                    311:        | expr9 BACKSLASH expr10 {$$ = LIMITNODE($1,$3);} ;
                    312:        | expr9 AT expr10 {$$ = ACTIVNODE($2, $3, $1);};
                    313: 
                    314: expr10 : expr11 ;
                    315:        | AT expr10 {$$ = ACTIVNODE($1, $2, EMPTYNODE);} ;
                    316:        | NOT expr10 {$$ = NOTNODE($2);} ;
                    317:        | BAR expr10 {$$ = BARNODE($2);} ;
                    318:        | CONCAT expr10 {$$ = BARNODE($2);} ;
                    319:        | LCONCAT expr10 {$$ = BARNODE($2);} ;
                    320:        | op10 expr10 {$$ = UNOPNODE($1,$2);} ;
                    321: 
                    322: op10   : DOT ;
                    323:        | BANG ;
                    324:        | DIFF ;
                    325:        | PLUS ;
                    326:        | STAR ;
                    327:        | SLASH ;
                    328:        | CARET ;
                    329:        | INTER ;
                    330:        | TILDE ;
                    331:        | MINUS ;
                    332:        | NUMEQ ;
                    333:        | NUMNE ;
                    334:        | LEXEQ ;
                    335:        | LEXNE ;
                    336:        | EQUIV ;
                    337:        | UNION ;
                    338:        | QMARK ;
                    339:        | NOTEQUIV ;
                    340:        | BACKSLASH ;
                    341: 
                    342: expr11 : literal ;
                    343:        | section ;
                    344:        | return ;
                    345:        | if ;
                    346:        | case ;
                    347:        | while ;
                    348:        | until ;
                    349:        | every ;
                    350:        | repeat ;
                    351:        | CREATE expr {$$ = CREATENODE($1,$2);} ;
                    352:        | IDENT {VAL0($1) = putloc(STR0($1),0);} ;
                    353:        | NEXT {$$ = NEXTNODE($1);} ;
                    354:        | BREAK nexpr {$$ = BREAKNODE($1,$2);} ;
                    355:        | LPAREN {
                    356: #ifdef XPX
                    357:                pushcs(0);
                    358: #endif XPX
                    359:                } exprlist {
                    360: #ifdef XPX
                    361:                popcs();
                    362: #endif XPX
                    363:                } RPAREN {
                    364:                        if (($3)->n_type == N_ELIST)
                    365:                        $$ = INVOKNODE($1,EMPTYNODE,$3);
                    366:                        else
                    367:                        $$ = $3; } ;
                    368:        | LBRACE compound RBRACE {$$ = $2;} ;
                    369:        | LBRACK {
                    370: #ifdef XPX
                    371:                pushcs(0);
                    372: #endif XPX
                    373:                } exprlist {
                    374: #ifdef XPX
                    375:                popcs();
                    376: #endif XPX
                    377:                } RBRACK {
                    378:                $$ = LISTNODE($1,$3);} ;
                    379:        | expr11 LBRACK nexpr RBRACK {$$ = BINOPNODE($2,$1,$3);} ;
                    380:        | expr11 LBRACE RBRACE {$$ = INVOKNODE($2,$1,LISTNODE($2,EMPTYNODE));} ;
                    381:        | expr11 LBRACE {
                    382: #ifdef XPX
                    383:                pushcs(1);
                    384: #endif XPX
                    385:                } exprlist {
                    386: #ifdef XPX
                    387:                popcs();
                    388: #else XPX
                    389:                  err("missing semicolon or operator", 0);
                    390: #endif XPX
                    391:                } RBRACE {
                    392:                $$ = INVOKNODE($2,$1,LISTNODE($2,$4));
                    393:                } ;
                    394:        | expr11 LPAREN {
                    395: #ifdef XPX
                    396:                pushcs(0);
                    397: #endif XPX
                    398:                } exprlist {
                    399: #ifdef XPX
                    400:                popcs();
                    401: #endif XPX
                    402:                } RPAREN {
                    403:                $$ = INVOKNODE($2,$1,$4);
                    404:                } ;
                    405:        | expr11 DOT IDENT {$$ = FIELDNODE($2,$1,$3);} ;
                    406:        | CONJUNC FAIL {$$ = KEYNODE($1, K_FAIL);} ;
                    407:        | CONJUNC IDENT {
                    408:                if ((i = klocate(STR0($2))) == NULL)
                    409:                        err("invalid keyword",STR0($2));
                    410:                $$ = KEYNODE($1, i);
                    411:                } ;
                    412: 
                    413: while  : WHILE expr {$$ = LOOPNODE($1,$2,EMPTYNODE);} ;
                    414:        | WHILE expr DO expr {$$ = LOOPNODE($1,$2,$4);} ;
                    415: 
                    416: until  : UNTIL expr {$$ = LOOPNODE($1,$2,EMPTYNODE);} ;
                    417:        | UNTIL expr DO expr {$$ = LOOPNODE($1,$2,$4);} ;
                    418: 
                    419: every  : EVERY expr {$$ = LOOPNODE($1,$2,EMPTYNODE);} ;
                    420:        | EVERY expr DO expr {$$ = LOOPNODE($1,$2,$4);} ;
                    421: 
                    422: repeat : REPEAT expr {$$ = LOOPNODE($1,$2,EMPTYNODE);} ;
                    423: 
                    424: return : FAIL {$$ = RETNODE($1,EMPTYNODE);} ;
                    425:        | RETURN nexpr {$$ = RETNODE($1,$2);} ;
                    426:        | SUSPEND nexpr {$$ = SUSPNODE($1,$2);} ;
                    427: 
                    428: if     : IF expr THEN expr {$$ = IFNODE($1,$2,$4,EMPTYNODE);} ;
                    429:        | IF expr THEN expr ELSE expr {$$ = IFNODE($1,$2,$4,$6);} ;
                    430: 
                    431: case   : CASE expr OF LBRACE caselist RBRACE {$$ = CASENODE($1,$2,$5);} ;
                    432: 
                    433: caselist: cclause ;
                    434:        | caselist SEMICOL cclause {$$ = CLISTNODE($2,$1,$3);} ;
                    435: 
                    436: cclause        : DEFAULT COLON expr {$$ = CCLSNODE($2,$1,$3);} ;
                    437:        | expr COLON expr {$$ = CCLSNODE($2,$1,$3);} ;
                    438: 
                    439: exprlist: nexpr {
                    440: #ifdef XPX
                    441:                $$ = cswitch($1,$1);
                    442: #endif XPX
                    443:                } ;
                    444:        | exprlist COMMA nexpr {
                    445: #ifdef XPX
                    446:                $$ = ELISTNODE($2,$1,cswitch($3,$2));
                    447: #else XPX
                    448:                 $$ = ELISTNODE($2,$1,$3);
                    449: #endif XPX
                    450:                } ;
                    451: 
                    452: literal        : INTLIT {VAL0($1) = putlit(STR0($1),F_INTLIT,0);} ;
                    453:        | REALLIT {VAL0($1) = putlit(STR0($1),F_REALLIT,0);} ;
                    454:        | STRINGLIT {VAL0($1) = putlit(STR0($1),F_STRLIT,VAL1($1));} ;
                    455:        | CSETLIT {VAL0($1) = putlit(STR0($1),F_CSETLIT,VAL1($1));} ;
                    456: 
                    457: section        : expr11 LBRACK expr sectop expr RBRACK {$$ = (nodeptr)SECTNODE($4,$1,$3,$5);} ;
                    458: 
                    459: sectop : COLON ;
                    460:        | PCOLON ;
                    461:        | MCOLON ;
                    462: 
                    463: compound: nexpr ;
                    464:        | nexpr SEMICOL compound {$$ = SLISTNODE($2, $1, $3);} ;
                    465: 
                    466: program        : error decls EOFX ;
                    467: proc   : prochead error procbody END ;
                    468: expr   : error ;
                    469: %%
                    470: 
                    471: #ifdef XPX
                    472: pushcs(val)
                    473: int val;
                    474: {
                    475:        stacktop = stacktop + 1;
                    476:        cstack[stacktop] = val;
                    477: }
                    478: 
                    479: popcs()
                    480: {
                    481:        stacktop = stacktop - 1;
                    482: }
                    483: 
                    484: nodeptr cswitch(x,y)
                    485:        nodeptr x, y;
                    486:        {
                    487:        if (cstack[stacktop]) return(CREATENODE(y,x));
                    488:        else return(x);
                    489: }
                    490: #endif XPX

unix.superglobalmegacorp.com

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