Annotation of researchv8dc/cmd/awk/awk.g.y, revision 1.1

1.1     ! root        1: %token FIRSTTOKEN      /* must be first */
        !             2: %token FATAL
        !             3: %token PROGRAM PASTAT PASTAT2 XBEGIN XEND
        !             4: %token NL
        !             5: %token LT LE GT GE EQ NE APPEND
        !             6: %token MATCH NOTMATCH
        !             7: %token FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS
        !             8: %token ADD MINUS MULT DIVIDE MOD
        !             9: %token ASSIGN ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ
        !            10: %token PRINT PRINTF
        !            11: %token DELETE
        !            12: %token IF ELSE WHILE FOR IN INTEST NEXT EXIT BREAK CONTINUE
        !            13: 
        !            14: %right ASGNOP
        !            15: %left  BOR
        !            16: %left  AND
        !            17: %nonassoc RELOP MATCHOP
        !            18: %left  CAT
        !            19: %left  '+' '-'
        !            20: %left  '*' '/' '%'
        !            21: %left  NOT UMINUS
        !            22: %right POWER
        !            23: %left  POSTINCR PREINCR POSTDECR PREDECR INCR DECR
        !            24: %left  FIELD INDIRECT SUB GSUB SUBSTR LSUBSTR INDEX CALL RETURN FUNC BLTIN
        !            25: %left  SPRINTF GETLINE CLOSE
        !            26: %token STRING NUMBER REGEXPR VAR ARG VARNF ARRAY SPLIT
        !            27: 
        !            28: %token LASTTOKEN       /* must be last */
        !            29: 
        !            30: %{
        !            31: #include "awk.h"
        !            32: yywrap() { return(1); }
        !            33: #ifndef        DEBUG
        !            34: #      define  PUTS(x)
        !            35: #endif
        !            36: Node   *beginloc = 0, *endloc = 0;
        !            37: int    infunc  = 0;    /* = 1 if in arglist or body of func */
        !            38: char   *curfname = 0;
        !            39: Node   *arglist = 0;   /* list of args for current function */
        !            40: %}
        !            41: %%
        !            42: 
        !            43: program:
        !            44:          pa_stats { if (errorflag==0)
        !            45:                        winner = (Node *)stat3(PROGRAM, beginloc, $1, endloc); }
        !            46:        | error    { yyclearin; bracecheck(); yyerror("bailing out"); }
        !            47:        ;
        !            48: 
        !            49: andNL:
        !            50:          AND | andNL NL
        !            51:        ;
        !            52: 
        !            53: begin:
        !            54:          XBEGIN '{' stmtlist '}'       { beginloc = (Node*) linkum(beginloc,(Node *) $3); }
        !            55:        ;
        !            56: 
        !            57: borNL:
        !            58:          BOR | borNL NL
        !            59:        ;
        !            60: 
        !            61: commaNL:
        !            62:          ',' | commaNL NL
        !            63:        ;
        !            64: 
        !            65: compound_conditional:
        !            66:          conditional borNL conditional { $$ = op2(BOR, $1, $3); }
        !            67:        | conditional andNL conditional { $$ = op2(AND, $1, $3); }
        !            68:        | NOT conditional               { $$ = op1(NOT, $2); }
        !            69:        | '(' compound_conditional ')'  { $$ = $2; }
        !            70:        ;
        !            71: 
        !            72: compound_pattern:
        !            73:          pattern borNL pattern         { $$ = op2(BOR, $1, $3); }
        !            74:        | pattern andNL pattern         { $$ = op2(AND, $1, $3); }
        !            75:        | NOT pattern                   { $$ = op1(NOT, $2); }
        !            76:        | '(' compound_pattern ')'      { $$ = $2; }
        !            77:        ;
        !            78: 
        !            79: conditional:
        !            80:          expr          { $$ = op2(NE,$1,valtonode(lookup("$zero&null",symtab),CCON)); }
        !            81:        | compound_conditional   
        !            82:        ;
        !            83: 
        !            84: cond_expr:
        !            85:          rel_expr
        !            86:        | lex_expr
        !            87:        | in_expr
        !            88:        ;
        !            89: 
        !            90: easy_expr:
        !            91:          term
        !            92:        | easy_expr term %prec CAT      { $$ = op2(CAT, $1, $2); }
        !            93:        | var ASGNOP easy_expr          { $$ = op2($2, $1, $3); }
        !            94:        ;
        !            95: 
        !            96: elseNL:
        !            97:          ELSE | elseNL NL
        !            98:        ;
        !            99: 
        !           100: end:
        !           101:          XEND '{' stmtlist '}'         { endloc = (Node*) linkum(endloc,(Node *) $3); }
        !           102:        ;
        !           103: 
        !           104: expr:
        !           105:          easy_expr
        !           106:        | getpipe
        !           107:        | cond_expr
        !           108:        ;
        !           109: 
        !           110: exprlist:
        !           111:          expr
        !           112:        | exprlist commaNL expr { $$ = linkum($1, $3); }
        !           113:        ;
        !           114: 
        !           115: field:
        !           116:          FIELD                 { $$ = valtonode($1, CFLD); }
        !           117:        | INDIRECT term         { $$ = op1(INDIRECT, $2); }
        !           118:        ;
        !           119: 
        !           120: for:
        !           121:          FOR '(' simple_stmt ';' conditional ';' simple_stmt rparenNL stmt
        !           122:                { $$ = stat4(FOR, $3, $5, $7, $9); }
        !           123:        | FOR '(' simple_stmt ';'  ';' simple_stmt rparenNL stmt
        !           124:                { $$ = stat4(FOR, $3, 0, $6, $8); }
        !           125:        | FOR '(' varname IN varname rparenNL stmt
        !           126:                { $$ = stat3(IN, $3, makearr($5), $7); }
        !           127:        ;
        !           128: 
        !           129: func:
        !           130:          FUNC funcname '(' varlist rparenNL {infunc++;} '{' stmtlist '}'
        !           131:                { infunc--; curfname=0; defn($2, $4, $8); }
        !           132:        ;
        !           133: 
        !           134: funcname:
        !           135:          VAR   { setfname($1); }
        !           136:        | CALL  { setfname($1); }
        !           137:        ;
        !           138: 
        !           139: getpipe:
        !           140:          easy_expr '|' GETLINE var     { $$ = op3(GETLINE, $4, $2, $1); }
        !           141:        | easy_expr '|' GETLINE         { $$ = op3(GETLINE, 0, $2, $1); }
        !           142:        ;
        !           143: 
        !           144: if:
        !           145:          IF '(' conditional rparenNL   { $$ = $3; }
        !           146:        ;
        !           147: 
        !           148: in_expr:
        !           149:          expr IN varname       { $$ = op2(INTEST, $1, makearr($3)); }
        !           150:        | '(' in_expr ')'       { $$ = $2; }
        !           151:        ;
        !           152: 
        !           153: lex_expr:
        !           154:          expr MATCHOP reg_expr { $$ = op3($2, 0, $1, makedfa(reparse($3), 0)); }
        !           155:        | expr MATCHOP expr
        !           156:                { if (((Node*)$3)->ntype == NVALUE && ((Cell*)((Node*)$3)->narg[0])->csub == CCON)
        !           157:                        $$ = op3($2, 0, $1, makedfa(reparse( ((Cell*)((Node*)$3)->narg[0])->sval)), 0);
        !           158:                  else
        !           159:                        $$ = op3($2, 1, $1, $3); }
        !           160:        | '(' lex_expr ')'      { $$ = $2; }
        !           161:        ;
        !           162: 
        !           163: opt_plist:
        !           164:          /* nothing */         { $$ = rectonode(); }
        !           165:        | plist
        !           166:        ;
        !           167: 
        !           168: pa_stat:
        !           169:          pattern                       { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), 0)); }
        !           170:        | pattern '{' stmtlist '}'      { $$ = stat2(PASTAT, $1, $3); }
        !           171:        | pattern ',' pattern           { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), 0)); }
        !           172:        | pattern ',' pattern '{' stmtlist '}'  { $$ = pa2stat($1, $3, $5); }
        !           173:        | '{' stmtlist '}'              { $$ = stat2(PASTAT, 0, $2); }
        !           174:        ;
        !           175: 
        !           176: pa_stats:
        !           177:          /* nothing */         { $$ = (int)0; }
        !           178:        | pa_stats NL
        !           179:        | pa_stats pa_stat      { $$ = linkum($1, $2); }
        !           180:        | pa_stats begin
        !           181:        | pa_stats end
        !           182:        | pa_stats func
        !           183:        ;
        !           184: 
        !           185: 
        !           186: pattern:
        !           187:          reg_expr       { $$ = op3(MATCH, 0, rectonode(), makedfa(reparse($1), 0)); }
        !           188:        | rel_expr
        !           189:        | lex_expr
        !           190:        | in_expr
        !           191:        | compound_pattern
        !           192:        ;
        !           193: 
        !           194: plist:
        !           195:          easy_expr
        !           196:        | plist commaNL easy_expr       { $$ = linkum($1, $3); }
        !           197:        | '(' plist ')'         { $$ = $2; }
        !           198:        ;
        !           199: 
        !           200: redir:
        !           201:          GT | APPEND | LT | '|'
        !           202:        ;
        !           203: 
        !           204: reg_expr:
        !           205:          '/' {startreg();} REGEXPR '/'         { $$ = $3; }
        !           206:        ;
        !           207: 
        !           208: rel_expr:
        !           209:          expr relop expr       { $$ = op2($2, $1, $3); }
        !           210:        | '(' rel_expr ')'      { $$ = $2; }
        !           211:        ;
        !           212: 
        !           213: relop:
        !           214:          EQ | NE | LT | LE | GT | GE
        !           215:        ;
        !           216: 
        !           217: rparenNL:
        !           218:          ')' | rparenNL NL
        !           219:        ;
        !           220: 
        !           221: simple_stmt:
        !           222:          PRINT opt_plist redir expr    { $$ = stat3($1, $2, $3, $4); }
        !           223:        | PRINT opt_plist               { $$ = stat3($1, $2, 0, 0); }
        !           224:        | PRINTF plist redir expr       { $$ = stat3($1, $2, $3, $4); }
        !           225:        | PRINTF plist                  { $$ = stat3($1, $2, 0, 0); }
        !           226:        | DELETE varname '[' expr ']'   { $$ = stat2(DELETE, makearr($2), $4); }
        !           227:        | expr                          { $$ = exptostat($1); }
        !           228:        | /* nothing */                 { $$ = (int)0; }
        !           229:        | error         { yyclearin; yyerror("illegal statement"); }
        !           230:        ;
        !           231: 
        !           232: st:
        !           233:          NL | ';'
        !           234:        ;
        !           235: 
        !           236: stmt:
        !           237:          simple_stmt st
        !           238:        | RETURN st             { $$ = stat1(RETURN, 0); }
        !           239:        | RETURN expr st        { $$ = stat1(RETURN, $2); }
        !           240:        | NEXT st               { $$ = stat1(NEXT, 0); }
        !           241:        | EXIT st               { $$ = stat1(EXIT, 0); }
        !           242:        | EXIT expr st          { $$ = stat1(EXIT, $2); }
        !           243:        | BREAK st              { $$ = stat1(BREAK, 0); }
        !           244:        | CONTINUE st           { $$ = stat1(CONTINUE, 0); }
        !           245:        | '{' stmtlist '}'      { $$ = $2; }
        !           246:        | if stmt               { $$ = stat3(IF, $1, $2, 0); }
        !           247:        | if stmt elseNL stmt   { $$ = stat3(IF, $1, $2, $4); }
        !           248:        | while stmt            { $$ = stat2(WHILE, $1, $2); }
        !           249:        | for
        !           250:        | varname st            { yyerror("no-effect statement"); $$ = 0; }
        !           251:        ;
        !           252: 
        !           253: stmtlist:
        !           254:          /* nothing */         { $$ = (int) 0; }
        !           255:        | stmtlist NL
        !           256:        | stmtlist ';'
        !           257:        | stmtlist stmt         { $$ = linkum($1, $2); }
        !           258:        ;
        !           259: 
        !           260: subop:
        !           261:          SUB | GSUB
        !           262:        ;
        !           263: 
        !           264: term:
        !           265:          var
        !           266:        | CALL '(' ')'                  { $$ = op2(CALL, valtonode($1,CVAR), 0); }
        !           267:        | CALL '(' exprlist ')'         { $$ = op2(CALL, valtonode($1,CVAR), $3); }
        !           268:        | NUMBER                        { $$ = valtonode($1, CCON); }
        !           269:        | STRING                        { $$ = valtonode($1, CCON); }
        !           270:        | CLOSE easy_expr               { $$ = op1(CLOSE, $2); }
        !           271:        | GETLINE var LT easy_expr      { $$ = op3(GETLINE, $2, $3, $4); }
        !           272:        | GETLINE LT easy_expr          { $$ = op3(GETLINE, 0, $2, $3); }
        !           273:        | GETLINE var                   { $$ = op3(GETLINE, $2, 0, 0); }
        !           274:        | GETLINE                       { $$ = op3(GETLINE, 0, 0, 0); }
        !           275:        | BLTIN                         { $$ = op2(BLTIN, $1, rectonode()); }
        !           276:        | BLTIN '(' ')'                 { $$ = op2(BLTIN, $1, rectonode()); }
        !           277:        | BLTIN '(' exprlist ')'        { $$ = op2(BLTIN, $1, $3); }
        !           278:        | SPRINTF '(' plist ')'         { $$ = op1($1, $3); }
        !           279:        | SUBSTR '(' expr commaNL expr commaNL expr ')' { $$ = op3(SUBSTR, $3, $5, $7); }
        !           280:        | SUBSTR '(' expr commaNL expr ')'              { $$ = op3(SUBSTR, $3, $5, 0); }
        !           281:        | subop '(' reg_expr commaNL expr ')'           { $$ = op4($1, 0, makedfa(reparse($3), 1), $5, rectonode()); }
        !           282:        | subop '(' expr commaNL expr ')'               { $$ = op4($1, 1, $3, $5, rectonode()); }
        !           283:        | subop '(' reg_expr commaNL expr commaNL expr ')' { $$ = op4($1, 0, makedfa(reparse($3), 1), $5, $7); }
        !           284:        | subop '(' expr commaNL expr commaNL expr ')'  { $$ = op4($1, 1, $3, $5, $7); }
        !           285:        | SPLIT '(' expr commaNL varname commaNL expr ')' { $$ = op3(SPLIT, $3, makearr($5), $7); }
        !           286:        | SPLIT '(' expr commaNL varname ')'            { $$ = op3(SPLIT, $3, makearr($5), 0); }
        !           287:        | INDEX '(' expr commaNL expr ')'               { $$ = op2(INDEX, $3, $5); }
        !           288:        | '(' expr ')'          { $$ = $2; }
        !           289:        | term '+' term         { $$ = op2(ADD, $1, $3); }
        !           290:        | term '-' term         { $$ = op2(MINUS, $1, $3); }
        !           291:        | term '*' term         { $$ = op2(MULT, $1, $3); }
        !           292:        | term '/' term         { $$ = op2(DIVIDE, $1, $3); }
        !           293:        | term '%' term         { $$ = op2(MOD, $1, $3); }
        !           294:        | term POWER term       { $$ = op2(POWER, $1, $3); }
        !           295:        | '-' term %prec UMINUS { $$ = op1(UMINUS, $2); }
        !           296:        | '+' term %prec UMINUS { $$ = $2; }
        !           297:        | INCR var              { $$ = op1(PREINCR, $2); }
        !           298:        | DECR var              { $$ = op1(PREDECR, $2); }
        !           299:        | var INCR              { $$ = op1(POSTINCR, $1); }
        !           300:        | var DECR              { $$ = op1(POSTDECR, $1); }
        !           301:        ;
        !           302: 
        !           303: var:
        !           304:          varname
        !           305:        | varname '[' expr ']'  { $$ = op2(ARRAY, makearr($1), $3); }
        !           306:        | field
        !           307:        ;
        !           308: 
        !           309: varlist:
        !           310:          /* nothing */         { arglist = (Node *)($$ = 0); }
        !           311:        | VAR                   { $$ = valtonode($1,CVAR); arglist = (Node*) $$; }
        !           312:        | varlist commaNL VAR   { $$ = linkum($1,valtonode($3,CVAR)); arglist = (Node*) $$; }
        !           313:        ;
        !           314: 
        !           315: varname:
        !           316:          VAR                   { $$ = valtonode($1, CVAR); }
        !           317:        | ARG                   { $$ = op1(ARG, $1); }
        !           318:        | VARNF                 { $$ = op1(VARNF, $1); }
        !           319:        ;
        !           320: 
        !           321: 
        !           322: while:
        !           323:          WHILE '(' conditional rparenNL        { $$ = $3; }
        !           324:        ;
        !           325: 
        !           326: %%
        !           327: 
        !           328: setfname(p)
        !           329:        Cell *p;
        !           330: {
        !           331:        extern int bracecnt, brackcnt, parencnt;
        !           332: 
        !           333:        curfname = p->nval;
        !           334:        /*bracecnt = brackcnt = parencnt = 0;*/
        !           335: }

unix.superglobalmegacorp.com

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