Annotation of researchv10dc/cmd/icon/src/tran/icon.g, revision 1.1.1.1

1.1       root        1: /*     Grammar for Icon Version 5.10.  */
                      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           /* >= */
                     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: int cstack[50];                        /* context stack expression lists */
                    138: int stacktop = 0;              /* stack top */
                    139: nodeptr cswitch();
                    140: %}
                    141: 
                    142: program        : decls EOFX {gout(globfile);} ;
                    143: 
                    144: decls  : ;     
                    145:        | decls decl ;
                    146: 
                    147: decl   : record {
                    148:                if (!nocode)
                    149:                        rout(globfile, Str0($1));
                    150:                nocode = 0;
                    151:                loc_init();
                    152:                } ;
                    153:        | proc  {
                    154:                if (!nocode)
                    155:                        codegen($1);
                    156:                nocode = 0;
                    157:                treeinit();
                    158:                loc_init();
                    159:                } ;
                    160:        | global ;
                    161:        | LINK lnklist ;
                    162: 
                    163: lnklist        : lnkfile       ;
                    164:        | lnklist COMMA lnkfile;
                    165: 
                    166: lnkfile        : IDENT {addlfile(Str0($1));} ;
                    167:        | STRINGLIT {addlfile(Str0($1));} ;
                    168: 
                    169: global : GLOBAL {idflag = F_Global;} idlist ;
                    170: 
                    171: record : RECORD {idflag = F_Argument;} IDENT LPAREN arglist RPAREN {
                    172:                install(Str0($3),F_Record|F_Global,(int)$5);
                    173:                $$ = $3;
                    174:                } ;
                    175: 
                    176: proc   : prochead SEMICOL locals initial procbody END {
                    177:                $$ = (nodeptr)ProcNode($1,$4,$5,$6);
                    178:                } ;
                    179: 
                    180: prochead: PROCEDURE {idflag = F_Argument;} IDENT LPAREN arglist RPAREN {
                    181:                $$ = $3;
                    182:                install(Str0($3),F_Proc|F_Global,(int)$5);
                    183:                } ;
                    184: 
                    185: arglist        : {$$ = (int)0;} ;
                    186:        | idlist {$$ = (nodeptr)$1;} ;
                    187: 
                    188: 
                    189: idlist : IDENT {
                    190:                install(Str0($1),idflag,0);
                    191:                $$ = (nodeptr)1;
                    192:                } ;
                    193:        | idlist COMMA IDENT {
                    194:                install(Str0($3),idflag,0);
                    195:                $$ = (nodeptr)((int)$1 + 1);
                    196:                } ;
                    197: 
                    198: locals : ;
                    199:        | locals retention idlist SEMICOL ;
                    200: 
                    201: retention: LOCAL {idflag = F_Dynamic;} ;
                    202:        |       STATIC {idflag = F_Static;} ;
                    203:        |       DYNAMIC {idflag = F_Dynamic;} ;
                    204: 
                    205: initial        : {$$ = EmptyNode;} ;
                    206:        | INITIAL expr SEMICOL {$$ = $2;} ;
                    207: 
                    208: procbody: {$$ = EmptyNode;} ;
                    209:        | nexpr SEMICOL procbody {$$ = SListNode($2, $1, $3);} ;
                    210: 
                    211: nexpr  : {$$ = EmptyNode;} ;
                    212:        | expr ;
                    213: 
                    214: expr   : expr1a        ;
                    215:        | expr CONJUNC expr1a   {$$ = ConjNode($2,$1,$3);} ;
                    216: 
                    217: expr1a : expr1 ;
                    218:        | expr1a QMARK expr1    {$$ = ScanNode($2,$1,$3);} ;
                    219: 
                    220: expr1  : expr2 ;
                    221:        | expr2 op1 expr1 {binop: $$ = BinopNode($2,$1,$3);} ;
                    222:        | expr2 op1a expr1 {$$ = AugopNode($2,$1,$3);} ;
                    223:        | expr2 SCANASGN expr1 {$$ = ScanNode($2,$1,$3);} ;
                    224:        | expr2 AUGAND expr1 {$$ = ConjNode($2,$1,$3);} ;
                    225:        | expr2 AUGACT expr1 {$$ = ActivNode($2,$3,$1);} ;
                    226: 
                    227: op1    : SWAP ;
                    228:        | ASSIGN ;
                    229:        | REVSWAP ;
                    230:        | REVASSIGN ;
                    231: 
                    232: op1a   : CONCATASGN ;
                    233:        | LCONCATASGN ;
                    234:        | DIFFASGN ;
                    235:        | UNIONASGN ;
                    236:        | PLUSASGN ;
                    237:        | MINUSASGN ;
                    238:        | STARASGN ;
                    239:        | INTERASGN ;
                    240:        | SLASHASGN ;
                    241:        | MODASGN ;
                    242:        | CARETASGN ;
                    243:        | AUGEQ ;
                    244:        | AUGEQV ;
                    245:        | AUGGE ;
                    246:        | AUGGT ;
                    247:        | AUGLE ;
                    248:        | AUGLT ;
                    249:        | AUGNE ;
                    250:        | AUGNEQV ;
                    251:        | AUGSEQ ;
                    252:        | AUGSGE ;
                    253:        | AUGSGT ;
                    254:        | AUGSLE ;
                    255:        | AUGSLT ;
                    256:        | AUGSNE ;
                    257: 
                    258: expr2  : expr3 ;
                    259:        | expr2 TO expr3 {$$ = ToNode($2,$1,$3);} ;
                    260:        | expr2 TO expr3 BY expr3 {$$ = ToByNode($2,$1,$3,$5);} ;
                    261: 
                    262: expr3  : expr4 ;
                    263:        | expr4 BAR expr3 {$$ = AltNode($2,$1,$3);} ;
                    264: 
                    265: expr4  : expr5 ;
                    266:        | expr4 op4 expr5 {goto binop;} ;
                    267: 
                    268: op4    : LEXEQ ;
                    269:        | LEXGE ;
                    270:        | LEXGT ;
                    271:        | LEXLE ;
                    272:        | LEXLT ;
                    273:        | LEXNE ;
                    274:        | NUMEQ ;
                    275:        | NUMGE ;
                    276:        | NUMGT ;
                    277:        | NUMLE ;
                    278:        | NUMLT ;
                    279:        | NUMNE ;
                    280:        | EQUIV ;
                    281:        | NOTEQUIV ;
                    282: 
                    283: expr5  : expr6 ;
                    284:        | expr5 op5 expr6 {goto binop;} ;
                    285: 
                    286: op5    : CONCAT ;
                    287:        | LCONCAT ;
                    288: 
                    289: expr6  : expr7 ;
                    290:        | expr6 op6 expr7 {goto binop;} ;
                    291: 
                    292: op6    : PLUS ;
                    293:        | DIFF ;
                    294:        | UNION ;
                    295:        | MINUS ;
                    296: 
                    297: expr7  : expr8 ;
                    298:        | expr7 op7 expr8 {goto binop;} ;
                    299: 
                    300: op7    : STAR ;
                    301:        | INTER ;
                    302:        | SLASH ;
                    303:        | MOD ;
                    304: 
                    305: expr8  : expr9 ;
                    306:        | expr9 CARET expr8 {goto binop;} ;
                    307: 
                    308: expr9  : expr10 ;
                    309:        | expr9 BACKSLASH expr10 {$$ = LimitNode($1,$3);} ;
                    310:        | expr9 AT expr10 {$$ = ActivNode($2, $3, $1);};
                    311: 
                    312: expr10 : expr11 ;
                    313:        | AT expr10 {$$ = ActivNode($1, $2, EmptyNode);} ;
                    314:        | NOT expr10 {$$ = NotNode($2);} ;
                    315:        | BAR expr10 {$$ = BarNode($2);} ;
                    316:        | CONCAT expr10 {$$ = BarNode($2);} ;
                    317:        | LCONCAT expr10 {$$ = BarNode($2);} ;
                    318:        | op10 expr10 {$$ = UnopNode($1,$2);} ;
                    319: 
                    320: op10   : DOT ;
                    321:        | BANG ;
                    322:        | DIFF ;
                    323:        | PLUS ;
                    324:        | STAR ;
                    325:        | SLASH ;
                    326:        | CARET ;
                    327:        | INTER ;
                    328:        | TILDE ;
                    329:        | MINUS ;
                    330:        | NUMEQ ;
                    331:        | NUMNE ;
                    332:        | LEXEQ ;
                    333:        | LEXNE ;
                    334:        | EQUIV ;
                    335:        | UNION ;
                    336:        | QMARK ;
                    337:        | NOTEQUIV ;
                    338:        | BACKSLASH ;
                    339: 
                    340: expr11 : literal ;
                    341:        | section ;
                    342:        | return ;
                    343:        | if ;
                    344:        | case ;
                    345:        | while ;
                    346:        | until ;
                    347:        | every ;
                    348:        | repeat ;
                    349:        | CREATE expr {$$ = CreateNode($1,$2);} ;
                    350:        | IDENT {Val0($1) = putloc(Str0($1),0);} ;
                    351:        | NEXT {$$ = NextNode($1);} ;
                    352:        | BREAK nexpr {$$ = BreakNode($1,$2);} ;
                    353:        | LPAREN {
                    354:                pushcs(0);
                    355:                } exprlist {
                    356:                popcs();
                    357:                } RPAREN {
                    358:                        if (($3)->n_type == N_Elist)
                    359:                        $$ = InvokNode($1,EmptyNode,$3);
                    360:                        else
                    361:                        $$ = $3; } ;
                    362:        | LBRACE compound RBRACE {$$ = $2;} ;
                    363:        | LBRACK {
                    364:                pushcs(0);
                    365:                } exprlist {
                    366:                popcs();
                    367:                } RBRACK {
                    368:                $$ = ListNode($1,$3);} ;
                    369:        | expr11 LBRACK nexpr RBRACK {$$ = BinopNode($2,$1,$3);} ;
                    370:        | expr11 LBRACE RBRACE {$$ = InvokNode($2,$1,ListNode($2,EmptyNode));} ;
                    371:        | expr11 LBRACE {
                    372:                pushcs(1);
                    373:                } exprlist {
                    374:                popcs();
                    375:                } RBRACE {
                    376:                $$ = InvokNode($2,$1,ListNode($2,$4));
                    377:                } ;
                    378:        | expr11 LPAREN {
                    379:                pushcs(0);
                    380:                } exprlist {
                    381:                popcs();
                    382:                } RPAREN {
                    383:                $$ = InvokNode($2,$1,$4);
                    384:                } ;
                    385:        | expr11 DOT IDENT {$$ = FieldNode($2,$1,$3);} ;
                    386:        | CONJUNC FAIL {$$ = KeyNode($1, K_FAIL);} ;
                    387:        | CONJUNC IDENT {
                    388:                if ((i = klocate(Str0($2))) == NULL)
                    389:                        err("invalid keyword",Str0($2));
                    390:                $$ = KeyNode($1, i);
                    391:                } ;
                    392: 
                    393: while  : WHILE expr {$$ = LoopNode($1,$2,EmptyNode);} ;
                    394:        | WHILE expr DO expr {$$ = LoopNode($1,$2,$4);} ;
                    395: 
                    396: until  : UNTIL expr {$$ = LoopNode($1,$2,EmptyNode);} ;
                    397:        | UNTIL expr DO expr {$$ = LoopNode($1,$2,$4);} ;
                    398: 
                    399: every  : EVERY expr {$$ = LoopNode($1,$2,EmptyNode);} ;
                    400:        | EVERY expr DO expr {$$ = LoopNode($1,$2,$4);} ;
                    401: 
                    402: repeat : REPEAT expr {$$ = LoopNode($1,$2,EmptyNode);} ;
                    403: 
                    404: return : FAIL {$$ = RetNode($1,EmptyNode);} ;
                    405:        | RETURN nexpr {$$ = RetNode($1,$2);} ;
                    406:        | SUSPEND nexpr {$$ = SuspNode($1,$2);} ;
                    407: 
                    408: if     : IF expr THEN expr {$$ = IfNode($1,$2,$4,EmptyNode);} ;
                    409:        | IF expr THEN expr ELSE expr {$$ = IfNode($1,$2,$4,$6);} ;
                    410: 
                    411: case   : CASE expr OF LBRACE caselist RBRACE {$$ = CaseNode($1,$2,$5);} ;
                    412: 
                    413: caselist: cclause ;
                    414:        | caselist SEMICOL cclause {$$ = ClistNode($2,$1,$3);} ;
                    415: 
                    416: cclause        : DEFAULT COLON expr {$$ = CclsNode($2,$1,$3);} ;
                    417:        | expr COLON expr {$$ = CclsNode($2,$1,$3);} ;
                    418: 
                    419: exprlist: nexpr {
                    420:                $$ = cswitch($1,$1);
                    421:                } ;
                    422:        | exprlist COMMA nexpr {
                    423:                $$ = ElistNode($2,$1,cswitch($3,$2));
                    424:                } ;
                    425: 
                    426: literal        : INTLIT {Val0($1) = putlit(Str0($1),F_IntLit,0);} ;
                    427:        | REALLIT {Val0($1) = putlit(Str0($1),F_RealLit,0);} ;
                    428:        | STRINGLIT {Val0($1) = putlit(Str0($1),F_StrLit,Val1($1));} ;
                    429:        | CSETLIT {Val0($1) = putlit(Str0($1),F_CsetLit,Val1($1));} ;
                    430: 
                    431: section        : expr11 LBRACK expr sectop expr RBRACK {$$ = (nodeptr)SectNode($4,$1,$3,$5);} ;
                    432: 
                    433: sectop : COLON ;
                    434:        | PCOLON ;
                    435:        | MCOLON ;
                    436: 
                    437: compound: nexpr ;
                    438:        | nexpr SEMICOL compound {$$ = SListNode($2, $1, $3);} ;
                    439: 
                    440: program        : error decls EOFX ;
                    441: proc   : prochead error procbody END ;
                    442: expr   : error ;
                    443: %%
                    444: 
                    445: pushcs(val)
                    446: int val;
                    447: {
                    448:        stacktop = stacktop + 1;
                    449:        cstack[stacktop] = val;
                    450: }
                    451: 
                    452: popcs()
                    453: {
                    454:        stacktop = stacktop - 1;
                    455: }
                    456: 
                    457: nodeptr cswitch(x,y)
                    458:        nodeptr x, y;
                    459:        {
                    460:        if (cstack[stacktop]) return(CreateNode(y,x));
                    461:        else return(x);
                    462: }

unix.superglobalmegacorp.com

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