Annotation of 40BSD/cmd/awk/awk.g.y, revision 1.1.1.1

1.1       root        1: %token FIRSTTOKEN      /*must be first*/
                      2: %token FINAL FATAL
                      3: %token LT LE GT GE EQ NE
                      4: %token MATCH NOTMATCH
                      5: %token APPEND
                      6: %token ADD MINUS MULT DIVIDE MOD UMINUS 
                      7: %token ASSIGN ADDEQ SUBEQ MULTEQ DIVEQ MODEQ
                      8: %token JUMP
                      9: %token XBEGIN XEND
                     10: %token NL
                     11: %token PRINT PRINTF SPRINTF SPLIT
                     12: %token IF ELSE WHILE FOR IN NEXT EXIT BREAK CONTINUE
                     13: %token PROGRAM PASTAT PASTAT2
                     14: 
                     15: %right ASGNOP
                     16: %left  BOR
                     17: %left  AND
                     18: %left  NOT
                     19: %left  NUMBER VAR ARRAY FNCN SUBSTR LSUBSTR INDEX
                     20: %left  GETLINE
                     21: %nonassoc RELOP MATCHOP
                     22: %left  OR
                     23: %left  STRING  DOT CCL NCCL CHAR
                     24: %left  '(' '^' '$'
                     25: %left  CAT
                     26: %left  '+' '-'
                     27: %left  '*' '/' '%'
                     28: %left  STAR PLUS QUEST
                     29: %left  POSTINCR PREINCR POSTDECR PREDECR INCR DECR
                     30: %left  FIELD INDIRECT
                     31: %token LASTTOKEN       /* has to be last */
                     32: 
                     33: %{
                     34: #include "awk.def"
                     35: #ifndef        DEBUG   
                     36: #      define  PUTS(x)
                     37: #endif
                     38: %}
                     39: %%
                     40: 
                     41: program:
                     42:          begin pa_stats end    { if (errorflag==0) winner = (node *)stat3(PROGRAM, $1, $2, $3); }
                     43:        | error                 { yyclearin; yyerror("bailing out"); }
                     44:        ;
                     45: 
                     46: begin:
                     47:          XBEGIN '{' stat_list '}'      { PUTS("XBEGIN list"); $$ = $3; }
                     48:        | begin NL
                     49:        |       { PUTS("empty XBEGIN"); $$ = (hack)nullstat; }
                     50:        ;
                     51: 
                     52: end:
                     53:          XEND '{' stat_list '}'        { PUTS("XEND list"); $$ = $3; }
                     54:        | end NL
                     55:        |       { PUTS("empty END"); $$ = (hack)nullstat; }
                     56:        ;
                     57: 
                     58: compound_conditional:
                     59:          conditional BOR conditional   { PUTS("cond||cond"); $$ = op2(BOR, $1, $3); }
                     60:        | conditional AND conditional   { PUTS("cond&&cond"); $$ = op2(AND, $1, $3); }
                     61:        | NOT conditional               { PUTS("!cond"); $$ = op1(NOT, $2); }
                     62:        | '(' compound_conditional ')'  { $$ = $2; }
                     63:        ;
                     64: 
                     65: compound_pattern:
                     66:          pattern BOR pattern   { PUTS("pat||pat"); $$ = op2(BOR, $1, $3); }
                     67:        | pattern AND pattern   { PUTS("pat&&pat"); $$ = op2(AND, $1, $3); }
                     68:        | NOT pattern           { PUTS("!pat"); $$ = op1(NOT, $2); }
                     69:        | '(' compound_pattern ')'      { $$ = $2; }
                     70:        ;
                     71: 
                     72: conditional:
                     73:          expr  { PUTS("expr"); $$ = op2(NE, $1, valtonode(lookup("$zero&null", symtab, 0), CCON)); }
                     74:        | rel_expr              { PUTS("relexpr"); }
                     75:        | lex_expr              { PUTS("lexexpr"); }
                     76:        | compound_conditional  { PUTS("compcond"); }
                     77:        ;
                     78: 
                     79: else:
                     80:          ELSE optNL    { PUTS("else"); }
                     81:        ;
                     82: 
                     83: field:
                     84:          FIELD         { PUTS("field"); $$ = valtonode($1, CFLD); }
                     85:        | INDIRECT term { PUTS("ind field"); $$ = op1(INDIRECT, $2); }
                     86:        ;
                     87: 
                     88: if:
                     89:          IF '(' conditional ')' optNL  { PUTS("if(cond)"); $$ = $3; }
                     90:        ;
                     91: 
                     92: lex_expr:
                     93:          expr MATCHOP regular_expr     { PUTS("expr~re"); $$ = op2($2, $1, makedfa($3)); }
                     94:        | '(' lex_expr ')'      { PUTS("(lex_expr)"); $$ = $2; }
                     95:        ;
                     96: 
                     97: var:
                     98:          NUMBER        {PUTS("number"); $$ = valtonode($1, CCON); }
                     99:        | STRING        { PUTS("string"); $$ = valtonode($1, CCON); }
                    100:        | VAR           { PUTS("var"); $$ = valtonode($1, CVAR); }
                    101:        | VAR '[' expr ']'      { PUTS("array[]"); $$ = op2(ARRAY, $1, $3); }
                    102:        | field
                    103:        ;
                    104: term:
                    105:          var
                    106:        | GETLINE       { PUTS("getline"); $$ = op1(GETLINE, 0); }
                    107:        | FNCN          { PUTS("func");
                    108:                        $$ = op2(FNCN, $1, valtonode(lookup("$record", symtab, 0), CFLD));
                    109:                        }
                    110:        | FNCN '(' ')'  { PUTS("func()"); 
                    111:                        $$ = op2(FNCN, $1, valtonode(lookup("$record", symtab, 0), CFLD));
                    112:                        }
                    113:        | FNCN '(' expr ')'     { PUTS("func(expr)"); $$ = op2(FNCN, $1, $3); }
                    114:        | SPRINTF print_list    { PUTS("sprintf"); $$ = op1($1, $2); }
                    115:        | SUBSTR '(' expr ',' expr ',' expr ')'
                    116:                        { PUTS("substr(e,e,e)"); $$ = op3(SUBSTR, $3, $5, $7); }
                    117:        | SUBSTR '(' expr ',' expr ')'
                    118:                        { PUTS("substr(e,e,e)"); $$ = op3(SUBSTR, $3, $5, nullstat); }
                    119:        | SPLIT '(' expr ',' VAR ',' expr ')'
                    120:                        { PUTS("split(e,e,e)"); $$ = op3(SPLIT, $3, $5, $7); }
                    121:        | SPLIT '(' expr ',' VAR ')'
                    122:                        { PUTS("split(e,e,e)"); $$ = op3(SPLIT, $3, $5, nullstat); }
                    123:        | INDEX '(' expr ',' expr ')'
                    124:                        { PUTS("index(e,e)"); $$ = op2(INDEX, $3, $5); }
                    125:        | '(' expr ')'                  {PUTS("(expr)");  $$ = $2; }
                    126:        | term '+' term                 { PUTS("t+t"); $$ = op2(ADD, $1, $3); }
                    127:        | term '-' term                 { PUTS("t-t"); $$ = op2(MINUS, $1, $3); }
                    128:        | term '*' term                 { PUTS("t*t"); $$ = op2(MULT, $1, $3); }
                    129:        | term '/' term                 { PUTS("t/t"); $$ = op2(DIVIDE, $1, $3); }
                    130:        | term '%' term                 { PUTS("t%t"); $$ = op2(MOD, $1, $3); }
                    131:        | '-' term %prec QUEST          { PUTS("-term"); $$ = op1(UMINUS, $2); }
                    132:        | '+' term %prec QUEST          { PUTS("+term"); $$ = $2; }
                    133:        | INCR var      { PUTS("++var"); $$ = op1(PREINCR, $2); }
                    134:        | DECR var      { PUTS("--var"); $$ = op1(PREDECR, $2); }
                    135:        | var INCR      { PUTS("var++"); $$= op1(POSTINCR, $1); }
                    136:        | var DECR      { PUTS("var--"); $$= op1(POSTDECR, $1); }
                    137:        ;
                    138: 
                    139: expr:
                    140:          term          { PUTS("term"); }
                    141:        | expr term     { PUTS("expr term"); $$ = op2(CAT, $1, $2); }
                    142:        | var ASGNOP expr       { PUTS("var=expr"); $$ = stat2($2, $1, $3); }
                    143:        ;
                    144: 
                    145: optNL:
                    146:          NL
                    147:        |
                    148:        ;
                    149: 
                    150: pa_stat:
                    151:          pattern       { PUTS("pattern"); $$ = stat2(PASTAT, $1, genprint()); }
                    152:        | pattern '{' stat_list '}'     { PUTS("pattern {...}"); $$ = stat2(PASTAT, $1, $3); }
                    153:        | pattern ',' pattern           { PUTS("srch,srch"); $$ = pa2stat($1, $3, genprint()); }
                    154:        | pattern ',' pattern '{' stat_list '}' 
                    155:                                        { PUTS("srch, srch {...}"); $$ = pa2stat($1, $3, $5); }
                    156:        | '{' stat_list '}'     { PUTS("null pattern {...}"); $$ = stat2(PASTAT, nullstat, $2); }
                    157:        ;
                    158: 
                    159: pa_stats:
                    160:          pa_stats pa_stat st   { PUTS("pa_stats pa_stat"); $$ = linkum($1, $2); }
                    161:        |       { PUTS("null pa_stat"); $$ = (hack)nullstat; }
                    162:        | pa_stats pa_stat      {PUTS("pa_stats pa_stat"); $$ = linkum($1, $2); }
                    163:        ;
                    164: 
                    165: pattern:
                    166:          regular_expr  { PUTS("regex");
                    167:                $$ = op2(MATCH, valtonode(lookup("$record", symtab, 0), CFLD), makedfa($1));
                    168:                }
                    169:        | rel_expr      { PUTS("relexpr"); }
                    170:        | lex_expr      { PUTS("lexexpr"); }
                    171:        | compound_pattern      { PUTS("comp pat"); }
                    172:        ;
                    173: 
                    174: print_list:
                    175:          expr  { PUTS("expr"); }
                    176:        | pe_list       { PUTS("pe_list"); }
                    177:        |               { PUTS("null print_list"); $$ = valtonode(lookup("$record", symtab, 0), CFLD); }
                    178:        ;
                    179: 
                    180: pe_list:
                    181:          expr ',' expr {$$ = linkum($1, $3); }
                    182:        | pe_list ',' expr      {$$ = linkum($1, $3); }
                    183:        | '(' pe_list ')'               {$$ = $2; }
                    184:        ;
                    185: 
                    186: redir:
                    187:          RELOP
                    188:        | '|'
                    189:        ;
                    190: 
                    191: regular_expr:
                    192:          '/'   { startreg(); }
                    193:          r '/'
                    194:                { PUTS("/r/"); $$ = $3; }
                    195:        ;
                    196: 
                    197: r:
                    198:          CHAR          { PUTS("regex CHAR"); $$ = op2(CHAR, (node *) 0, $1); }
                    199:        | DOT           { PUTS("regex DOT"); $$ = op2(DOT, (node *) 0, (node *) 0); }
                    200:        | CCL           { PUTS("regex CCL"); $$ = op2(CCL, (node *) 0, cclenter($1)); }
                    201:        | NCCL          { PUTS("regex NCCL"); $$ = op2(NCCL, (node *) 0, cclenter($1)); }
                    202:        | '^'           { PUTS("regex ^"); $$ = op2(CHAR, (node *) 0, HAT); }
                    203:        | '$'           { PUTS("regex $"); $$ = op2(CHAR, (node *) 0 ,(node *) 0); }
                    204:        | r OR r        { PUTS("regex OR"); $$ = op2(OR, $1, $3); }
                    205:        | r r   %prec CAT
                    206:                        { PUTS("regex CAT"); $$ = op2(CAT, $1, $2); }
                    207:        | r STAR        { PUTS("regex STAR"); $$ = op2(STAR, $1, (node *) 0); }
                    208:        | r PLUS        { PUTS("regex PLUS"); $$ = op2(PLUS, $1, (node *) 0); }
                    209:        | r QUEST       { PUTS("regex QUEST"); $$ = op2(QUEST, $1, (node *) 0); }
                    210:        | '(' r ')'     { PUTS("(regex)"); $$ = $2; }
                    211:        ;
                    212: 
                    213: rel_expr:
                    214:          expr RELOP expr
                    215:                { PUTS("expr relop expr"); $$ = op2($2, $1, $3); }
                    216:        | '(' rel_expr ')'
                    217:                { PUTS("(relexpr)"); $$ = $2; }
                    218:        ;
                    219: 
                    220: st:
                    221:          NL
                    222:        | ';'
                    223:        ;
                    224: 
                    225: simple_stat:
                    226:          PRINT print_list redir expr
                    227:                { PUTS("print>stat"); $$ = stat3($1, $2, $3, $4); }
                    228:        | PRINT print_list      
                    229:                { PUTS("print list"); $$ = stat3($1, $2, nullstat, nullstat); }
                    230:        | PRINTF print_list redir expr
                    231:                { PUTS("printf>stat"); $$ = stat3($1, $2, $3, $4); }
                    232:        | PRINTF print_list     
                    233:                { PUTS("printf list"); $$ = stat3($1, $2, nullstat, nullstat); }
                    234:        | expr  { PUTS("expr"); $$ = exptostat($1); }
                    235:        |               { PUTS("null simple statement"); $$ = (hack)nullstat; }
                    236:        | error         { yyclearin; yyerror("illegal statement"); }
                    237:        ;
                    238: 
                    239: statement:
                    240:          simple_stat st        { PUTS("simple stat"); }
                    241:        | if statement          { PUTS("if stat"); $$ = stat3(IF, $1, $2, nullstat); }
                    242:        | if statement else statement
                    243:                { PUTS("if-else stat"); $$ = stat3(IF, $1, $2, $4); }
                    244:        | while statement       { PUTS("while stat"); $$ = stat2(WHILE, $1, $2); }
                    245:        | for                   { PUTS("for stat"); }
                    246:        | NEXT st               { PUTS("next"); $$ = stat1(NEXT, 0); }
                    247:        | EXIT st               { PUTS("exit"); $$ = stat1(EXIT, 0); }
                    248:        | EXIT expr st          { PUTS("exit"); $$ = stat1(EXIT, $2); }
                    249:        | BREAK st              { PUTS("break"); $$ = stat1(BREAK, 0); }
                    250:        | CONTINUE st           { PUTS("continue"); $$ = stat1(CONTINUE, 0); }
                    251:        | '{' stat_list '}'     { PUTS("{statlist}"); $$ = $2; }
                    252:        ;
                    253: 
                    254: stat_list:
                    255:          stat_list statement   { PUTS("stat_list stat"); $$ = linkum($1, $2); }
                    256:        |                       { PUTS("null stat list"); $$ = (hack)nullstat; }
                    257:        ;
                    258: 
                    259: while:
                    260:          WHILE '(' conditional ')' optNL       { PUTS("while(cond)"); $$ = $3; }
                    261:        ;
                    262: 
                    263: for:
                    264:          FOR '(' simple_stat ';' conditional ';' simple_stat ')' optNL statement
                    265:                { PUTS("for(e;e;e)"); $$ = stat4(FOR, $3, $5, $7, $10); }
                    266:        | FOR '(' simple_stat ';'  ';' simple_stat ')' optNL statement
                    267:                { PUTS("for(e;e;e)"); $$ = stat4(FOR, $3, nullstat, $6, $9); }
                    268:        | FOR '(' VAR IN VAR ')' optNL statement
                    269:                { PUTS("for(v in v)"); $$ = stat3(IN, $3, $5, $8); }
                    270:        ;
                    271: 
                    272: %%

unix.superglobalmegacorp.com

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