Annotation of 43BSDTahoe/bin/awk/awk.lx.l, revision 1.1.1.1

1.1       root        1: /*     awk.lx.l        4.3     84/12/08        */
                      2: 
                      3: %Start A str chc sc reg comment
                      4: 
                      5: %{
                      6: #include       "awk.h"
                      7: #include       "awk.def"
                      8: #undef input   /* defeat lex */
                      9: extern int     yylval;
                     10: extern int     mustfld;
                     11: extern int     ldbg;
                     12: 
                     13: int    lineno  = 1;
                     14: #define        RETURN(x)       {if (ldbg) ptoken(x); return(x); }
                     15: #define        CADD    cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN A;}
                     16: #define        CBUFLEN 150
                     17: char   cbuf[CBUFLEN];
                     18: int    clen, cflag;
                     19: %}
                     20: 
                     21: A      [a-zA-Z_]
                     22: B      [a-zA-Z0-9_]
                     23: D      [0-9]
                     24: WS     [ \t]
                     25: 
                     26: %%
                     27:        switch (yybgin-yysvec-1) {      /* witchcraft */
                     28:        case 0:
                     29:                BEGIN A;
                     30:                break;
                     31:        case sc:
                     32:                BEGIN A;
                     33:                RETURN('}');
                     34:        }
                     35: 
                     36: <A>^\n         lineno++;
                     37: <A>^{WS}*#.*\n lineno++;       /* strip comment lines */
                     38: <A>{WS}                ;
                     39: <A,reg>"\\"\n  lineno++;
                     40: <A>"||"                RETURN(BOR);
                     41: <A>BEGIN       RETURN(XBEGIN);
                     42: <A>END         RETURN(XEND);
                     43: <A>PROGEND     RETURN(EOF);
                     44: <A>"&&"                RETURN(AND);
                     45: <A>"!"         RETURN(NOT);
                     46: <A>"!="                { yylval = NE; RETURN(RELOP); }
                     47: <A>"~"         { yylval = MATCH; RETURN(MATCHOP); }
                     48: <A>"!~"                { yylval = NOTMATCH; RETURN(MATCHOP); }
                     49: <A>"<"         { yylval = LT; RETURN(RELOP); }
                     50: <A>"<="                { yylval = LE; RETURN(RELOP); }
                     51: <A>"=="                { yylval = EQ; RETURN(RELOP); }
                     52: <A>">="                { yylval = GE; RETURN(RELOP); }
                     53: <A>">"         { yylval = GT; RETURN(RELOP); }
                     54: <A>">>"                { yylval = APPEND; RETURN(RELOP); }
                     55: <A>"++"                { yylval = INCR; RETURN(INCR); }
                     56: <A>"--"                { yylval = DECR; RETURN(DECR); }
                     57: <A>"+="                { yylval = ADDEQ; RETURN(ASGNOP); }
                     58: <A>"-="                { yylval = SUBEQ; RETURN(ASGNOP); }
                     59: <A>"*="                { yylval = MULTEQ; RETURN(ASGNOP); }
                     60: <A>"/="                { yylval = DIVEQ; RETURN(ASGNOP); }
                     61: <A>"%="                { yylval = MODEQ; RETURN(ASGNOP); }
                     62: <A>"="         { yylval = ASSIGN; RETURN(ASGNOP); }
                     63: 
                     64: <A>"$"{D}+     {       if (atoi(yytext+1)==0) {
                     65:                                yylval = (hack)lookup("$record", symtab, 0);
                     66:                                RETURN(STRING);
                     67:                        } else {
                     68:                                yylval = fieldadr(atoi(yytext+1));
                     69:                                RETURN(FIELD);
                     70:                        }
                     71:                }
                     72: <A>"$"{WS}*    { RETURN(INDIRECT); }
                     73: <A>NF          { mustfld=1; yylval = (hack)setsymtab(yytext, EMPTY, 0.0, NUM, symtab); RETURN(VAR); }
                     74: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?        {
                     75:                yylval = (hack)setsymtab(yytext, EMPTY, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); }
                     76: <A>"}"{WS}*\n  { BEGIN sc; lineno++; RETURN(';'); }
                     77: <A>"}"         { BEGIN sc; RETURN(';'); }
                     78: <A>;\n         { lineno++; RETURN(';'); }
                     79: <A>\n          { lineno++; RETURN(NL); }
                     80: <A>while       RETURN(WHILE);
                     81: <A>for         RETURN(FOR);
                     82: <A>if          RETURN(IF);
                     83: <A>else                RETURN(ELSE);
                     84: <A>next                RETURN(NEXT);
                     85: <A>exit                RETURN(EXIT);
                     86: <A>break       RETURN(BREAK);
                     87: <A>continue    RETURN(CONTINUE);
                     88: <A>print       { yylval = PRINT; RETURN(PRINT); }
                     89: <A>printf      { yylval = PRINTF; RETURN(PRINTF); }
                     90: <A>sprintf     { yylval = SPRINTF; RETURN(SPRINTF); }
                     91: <A>split       { yylval = SPLIT; RETURN(SPLIT); }
                     92: <A>substr      RETURN(SUBSTR);
                     93: <A>index       RETURN(INDEX);
                     94: <A>in          RETURN(IN);
                     95: <A>getline     RETURN(GETLINE);
                     96: <A>length      { yylval = FLENGTH; RETURN(FNCN); }
                     97: <A>log         { yylval = FLOG; RETURN(FNCN); }
                     98: <A>int         { yylval = FINT; RETURN(FNCN); }
                     99: <A>exp         { yylval = FEXP; RETURN(FNCN); }
                    100: <A>sqrt                { yylval = FSQRT; RETURN(FNCN); }
                    101: <A>{A}{B}*     { yylval = (hack)setsymtab(yytext, tostring(""), 0.0, STR|NUM, symtab); RETURN(VAR); }
                    102: <A>\"          { BEGIN str; clen=0; }
                    103: 
                    104: <A>#           { BEGIN comment; }
                    105: <comment>\n    { BEGIN A; lineno++; RETURN(NL); }
                    106: <comment>.     ;
                    107: 
                    108: <A>.           { yylval = yytext[0]; RETURN(yytext[0]); }
                    109: 
                    110: <reg>"["       { BEGIN chc; clen=0; cflag=0; }
                    111: <reg>"[^"      { BEGIN chc; clen=0; cflag=1; }
                    112: 
                    113: <reg>"?"       RETURN(QUEST);
                    114: <reg>"+"       RETURN(PLUS);
                    115: <reg>"*"       RETURN(STAR);
                    116: <reg>"|"       RETURN(OR);
                    117: <reg>"."       RETURN(DOT);
                    118: <reg>"("       RETURN('(');
                    119: <reg>")"       RETURN(')');
                    120: <reg>"^"       RETURN('^');
                    121: <reg>"$"       RETURN('$');
                    122: <reg>\\{D}{D}{D}       { sscanf(yytext+1, "%o", &yylval); RETURN(CHAR); }
                    123: <reg>\\.       {       if (yytext[1]=='n') yylval = '\n';
                    124:                        else if (yytext[1] == 't') yylval = '\t';
                    125:                        else yylval = yytext[1];
                    126:                        RETURN(CHAR);
                    127:                }
                    128: <reg>"/"       { BEGIN A; unput('/'); }
                    129: <reg>\n                { yyerror("newline in regular expression"); lineno++; BEGIN A; }
                    130: <reg>.         { yylval = yytext[0]; RETURN(CHAR); }
                    131: 
                    132: <str>\"                { char *s; BEGIN A; cbuf[clen]=0; s = tostring(cbuf);
                    133:                cbuf[clen] = ' '; cbuf[++clen] = 0;
                    134:                yylval = (hack)setsymtab(cbuf, s, 0.0, CON|STR, symtab); RETURN(STRING); }
                    135: <str>\n                { yyerror("newline in string"); lineno++; BEGIN A; }
                    136: <str>"\\\""    { cbuf[clen++]='"'; }
                    137: <str,chc>"\\"n { cbuf[clen++]='\n'; }
                    138: <str,chc>"\\"t { cbuf[clen++]='\t'; }
                    139: <str,chc>"\\\\"        { cbuf[clen++]='\\'; }
                    140: <str>.         { CADD; }
                    141: 
                    142: <chc>"\\""]"   { cbuf[clen++]=']'; }
                    143: <chc>"]"       { BEGIN reg; cbuf[clen]=0; yylval = (hack)tostring(cbuf);
                    144:                if (cflag==0) { RETURN(CCL); }
                    145:                else { RETURN(NCCL); } }
                    146: <chc>\n                { yyerror("newline in character class"); lineno++; BEGIN A; }
                    147: <chc>.         { CADD; }
                    148: 
                    149: %%
                    150: 
                    151: input()
                    152: {
                    153:        register c;
                    154:        extern char *lexprog;
                    155: 
                    156:        if (yysptr > yysbuf)
                    157:                c = U(*--yysptr);
                    158:        else if (yyin == NULL)
                    159:                c = *lexprog++;
                    160:        else
                    161:                c = getc(yyin);
                    162:        if (c == '\n')
                    163:                yylineno++;
                    164:        else if (c == EOF)
                    165:                c = 0;
                    166:        return(c);
                    167: }
                    168: 
                    169: startreg()
                    170: {
                    171:        BEGIN reg;
                    172: }
                    173: 
                    174: ptoken(n)
                    175: {
                    176:        extern struct tok {
                    177:                char *tnm;
                    178:                int yval;
                    179:        } tok[];
                    180:        extern char yytext[];
                    181:        extern int yylval;
                    182: 
                    183:        printf("lex:");
                    184:        if (n < 128) {
                    185:                printf(" %c\n",n);
                    186:                return;
                    187:        }
                    188:        if (n <= 256 || n >= LASTTOKEN) {
                    189:                printf("? %o\n",n);
                    190:                return;
                    191:        }
                    192:        printf(" %s",tok[n-257].tnm);
                    193:        switch (n) {
                    194: 
                    195:        case RELOP:
                    196:        case MATCHOP:
                    197:        case ASGNOP:
                    198:        case STRING:
                    199:        case FIELD:
                    200:        case VAR:
                    201:        case NUMBER:
                    202:        case FNCN:
                    203:                printf(" (%s)", yytext);
                    204:                break;
                    205: 
                    206:        case CHAR:
                    207:                printf(" (%o)", yylval);
                    208:                break;
                    209:        }
                    210:        putchar('\n');
                    211: }

unix.superglobalmegacorp.com

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