Annotation of researchv10no/cmd/prefer/prefawk/awk.lx.l, revision 1.1.1.1

1.1       root        1: %Start A str sc reg comment
                      2: 
                      3: %{
                      4: #include       "awk.h"
                      5: #include       "y.tab.h"
                      6: 
                      7: #undef input   /* defeat lex */
                      8: #undef unput
                      9: 
                     10: extern YYSTYPE yylval;
                     11: extern int     infunc;
                     12: 
                     13: int    lineno  = 1;
                     14: int    bracecnt = 0;
                     15: int    brackcnt  = 0;
                     16: int    parencnt = 0;
                     17: #define DEBUG
                     18: #ifdef DEBUG
                     19: #      define  RET(x)  {if(dbg)printf("lex %s [%s]\n", tokname(x), yytext); return(x); }
                     20: #else
                     21: #      define  RET(x)  return(x)
                     22: #endif
                     23: 
                     24: #define        CADD    cbuf[clen++] = yytext[0]; \
                     25:                if (clen >= CBUFLEN-1) { \
                     26:                        yyerror("string/reg expr %.10s... too long", cbuf); \
                     27:                        BEGIN A; \
                     28:                }
                     29: 
                     30: uchar  cbuf[CBUFLEN];
                     31: uchar  *s;
                     32: int    clen, cflag;
                     33: %}
                     34: 
                     35: A      [a-zA-Z_]
                     36: B      [a-zA-Z0-9_]
                     37: D      [0-9]
                     38: WS     [ \t]
                     39: 
                     40: %%
                     41:        switch (yybgin-yysvec-1) {      /* witchcraft */
                     42:        case 0:
                     43:                BEGIN A;
                     44:                break;
                     45:        case sc:
                     46:                BEGIN A;
                     47:                RET('}');
                     48:        }
                     49: 
                     50: <A>\n          { lineno++; RET(NL); }
                     51: <A>#.*         { lineno++; RET(NL); }  /* strip comment lines */
                     52: <A>{WS}+       { ; }
                     53: <A>;           { RET(';'); }
                     54: 
                     55: <A>"\\"\n      { lineno++; }
                     56: <A>BEGIN       { RET(XBEGIN); }
                     57: <A>END         { RET(XEND); }
                     58: <A>func(tion)? { if (infunc) yyerror("illegal nested function"); RET(FUNC); }
                     59: <A>return      { if (!infunc) yyerror("return not in function"); RET(RETURN); }
                     60: <A>"&&"                { RET(AND); }
                     61: <A>"||"                { RET(BOR); }
                     62: <A>"!"         { RET(NOT); }
                     63: <A>"!="                { yylval.i = NE; RET(NE); }
                     64: <A>"~"         { yylval.i = MATCH; RET(MATCHOP); }
                     65: <A>"!~"                { yylval.i = NOTMATCH; RET(MATCHOP); }
                     66: <A>"<"         { yylval.i = LT; RET(LT); }
                     67: <A>"<="                { yylval.i = LE; RET(LE); }
                     68: <A>"=="                { yylval.i = EQ; RET(EQ); }
                     69: <A>">="                { yylval.i = GE; RET(GE); }
                     70: <A>">"         { yylval.i = GT; RET(GT); }
                     71: <A>">>"                { yylval.i = APPEND; RET(APPEND); }
                     72: <A>"++"                { yylval.i = INCR; RET(INCR); }
                     73: <A>"--"                { yylval.i = DECR; RET(DECR); }
                     74: <A>"+="                { yylval.i = ADDEQ; RET(ASGNOP); }
                     75: <A>"-="                { yylval.i = SUBEQ; RET(ASGNOP); }
                     76: <A>"*="                { yylval.i = MULTEQ; RET(ASGNOP); }
                     77: <A>"/="                { yylval.i = DIVEQ; RET(ASGNOP); }
                     78: <A>"%="                { yylval.i = MODEQ; RET(ASGNOP); }
                     79: <A>"^="                { yylval.i = POWEQ; RET(ASGNOP); }
                     80: <A>"**="       { yylval.i = POWEQ; RET(ASGNOP); }
                     81: <A>"="         { yylval.i = ASSIGN; RET(ASGNOP); }
                     82: <A>"**"                { RET(POWER); }
                     83: <A>"^"         { RET(POWER); }
                     84: 
                     85: <A>"$"{D}+     { yylval.cp = fieldadr(atoi(yytext+1)); RET(FIELD); }
                     86: <A>"$NF"       { unputstr("(NF)"); return(INDIRECT); }
                     87: <A>"$"{A}{B}*  { int c, n;
                     88:                  c = input(); unput(c);
                     89:                  if (c == '(' || c == '[' || infunc && (n=isarg(yytext+1)) >= 0) {
                     90:                        unputstr(yytext+1);
                     91:                        return(INDIRECT);
                     92:                  } else {
                     93:                        yylval.cp = setsymtab(yytext+1,"",0.0,STR|NUM,symtab);
                     94:                        RET(IVAR);
                     95:                  }
                     96:                }
                     97: <A>"$"         { RET(INDIRECT); }
                     98: <A>NF          { yylval.cp = setsymtab(yytext, "", 0.0, NUM, symtab); RET(VARNF); }
                     99: 
                    100: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?        {
                    101:                  yylval.cp = setsymtab(yytext, tostring(yytext), atof(yytext), CON|NUM, symtab);
                    102:                  RET(NUMBER); }
                    103: 
                    104: <A>while       { RET(WHILE); }
                    105: <A>for         { RET(FOR); }
                    106: <A>do          { RET(DO); }
                    107: <A>if          { RET(IF); }
                    108: <A>else                { RET(ELSE); }
                    109: <A>next                { RET(NEXT); }
                    110: <A>exit                { RET(EXIT); }
                    111: <A>break       { RET(BREAK); }
                    112: <A>continue    { RET(CONTINUE); }
                    113: <A>print       { yylval.i = PRINT; RET(PRINT); }
                    114: <A>printf      { yylval.i = PRINTF; RET(PRINTF); }
                    115: <A>sprintf     { yylval.i = SPRINTF; RET(SPRINTF); }
                    116: <A>split       { yylval.i = SPLIT; RET(SPLIT); }
                    117: <A>substr      { RET(SUBSTR); }
                    118: <A>sub         { yylval.i = SUB; RET(SUB); }
                    119: <A>gsub                { yylval.i = GSUB; RET(GSUB); }
                    120: <A>index       { RET(INDEX); }
                    121: <A>match       { RET(MATCHFCN); }
                    122: <A>in          { RET(IN); }
                    123: <A>getline     { RET(GETLINE); }
                    124: <A>close       { RET(CLOSE); }
                    125: <A>delete      { RET(DELETE); }
                    126: <A>length      { yylval.i = FLENGTH; RET(BLTIN); }
                    127: <A>log         { yylval.i = FLOG; RET(BLTIN); }
                    128: <A>int         { yylval.i = FINT; RET(BLTIN); }
                    129: <A>exp         { yylval.i = FEXP; RET(BLTIN); }
                    130: <A>sqrt                { yylval.i = FSQRT; RET(BLTIN); }
                    131: <A>sin         { yylval.i = FSIN; RET(BLTIN); }
                    132: <A>cos         { yylval.i = FCOS; RET(BLTIN); }
                    133: <A>atan2       { yylval.i = FATAN; RET(BLTIN); }
                    134: <A>system      { yylval.i = FSYSTEM; RET(BLTIN); }
                    135: <A>rand                { yylval.i = FRAND; RET(BLTIN); }
                    136: <A>srand       { yylval.i = FSRAND; RET(BLTIN); }
                    137: 
                    138: <A>{A}{B}*     { int n, c;
                    139:                  c = input(); unput(c);        /* look for '(' */
                    140:                  if (c != '(' && infunc && (n=isarg(yytext)) >= 0) {
                    141:                        yylval.i = n;
                    142:                        RET(ARG);
                    143:                  } else {
                    144:                        yylval.cp = setsymtab(yytext,"",0.0,STR|NUM,symtab);
                    145:                        if (c == '(') {
                    146:                                RET(CALL);
                    147:                        } else {
                    148:                                RET(VAR);
                    149:                        }
                    150:                  }
                    151:                }
                    152: <A>\"          { BEGIN str; clen = 0; }
                    153: 
                    154: <A>"}"         { if (--bracecnt < 0) yyerror("extra }"); BEGIN sc; RET(';'); }
                    155: <A>"]"         { if (--brackcnt < 0) yyerror("extra ]"); RET(']'); }
                    156: <A>")"         { if (--parencnt < 0) yyerror("extra )"); RET(')'); }
                    157: 
                    158: <A>.           { if (yytext[0] == '{') bracecnt++;
                    159:                  else if (yytext[0] == '[') brackcnt++;
                    160:                  else if (yytext[0] == '(') parencnt++;
                    161:                  RET(yylval.i = yytext[0]); /* everything else */ }
                    162: 
                    163: <reg>\\.       { cbuf[clen++] = '\\'; cbuf[clen++] = yytext[1]; }
                    164: <reg>\n                { yyerror("newline in regular expression %.10s...", cbuf); lineno++; BEGIN A; }
                    165: <reg>"/"       { BEGIN A;
                    166:                  cbuf[clen] = 0;
                    167:                  yylval.s = tostring(cbuf);
                    168:                  unput('/');
                    169:                  RET(REGEXPR); }
                    170: <reg>.         { CADD; }
                    171: 
                    172: <str>\"                { BEGIN A;
                    173:                  cbuf[clen] = 0; s = tostring(cbuf);
                    174:                  cbuf[clen] = ' '; cbuf[++clen] = 0;
                    175:                  yylval.cp = setsymtab(cbuf, s, 0.0, CON|STR, symtab);
                    176:                  RET(STRING); }
                    177: <str>\n                { yyerror("newline in string %.10s...", cbuf); lineno++; BEGIN A; }
                    178: <str>"\\\""    { cbuf[clen++] = '"'; }
                    179: <str>"\\"n     { cbuf[clen++] = '\n'; }
                    180: <str>"\\"t     { cbuf[clen++] = '\t'; }
                    181: <str>"\\"f     { cbuf[clen++] = '\f'; }
                    182: <str>"\\"r     { cbuf[clen++] = '\r'; }
                    183: <str>"\\"b     { cbuf[clen++] = '\b'; }
                    184: <str>"\\\\"    { cbuf[clen++] = '\\'; }
                    185: <str>"\\"({D}{D}{D}|{D}{D}|{D}) { int n;
                    186:                  sscanf(yytext+1, "%o", &n); cbuf[clen++] = n; }
                    187: <str>"\\".     { cbuf[clen++] = yytext[1]; }
                    188: <str>.         { CADD; }
                    189: 
                    190: %%
                    191: 
                    192: startreg()
                    193: {
                    194:        BEGIN reg;
                    195:        clen = 0;
                    196: }
                    197: 
                    198: /* input() and unput() are transcriptions of the standard lex
                    199:    macros for input and output with additions for error message
                    200:    printing.  God help us all if someone changes how lex works.
                    201: */
                    202: 
                    203: uchar  ebuf[300];
                    204: uchar  *ep = ebuf;
                    205: 
                    206: input()
                    207: {
                    208:        register c;
                    209:        extern uchar *lexprog;
                    210: 
                    211:        if (yysptr > yysbuf)
                    212:                c = U(*--yysptr);
                    213:        else if (yyin == NULL)
                    214:                c = *lexprog++;
                    215:        else
                    216:                c = getc(yyin);
                    217:        if (c == '\n')
                    218:                yylineno++;
                    219:        else if (c == EOF)
                    220:                c = 0;
                    221:        if (ep >= ebuf + sizeof ebuf)
                    222:                ep = ebuf;
                    223:        return *ep++ = c;
                    224: }
                    225: 
                    226: unput(c)
                    227: {
                    228:        yytchar = c;
                    229:        if (yytchar == '\n')
                    230:                yylineno--;
                    231:        *yysptr++ = yytchar;
                    232:        if (--ep < ebuf)
                    233:                ep = ebuf + sizeof(ebuf) - 1;
                    234: }
                    235: 
                    236: 
                    237: unputstr(s)
                    238:        char *s;
                    239: {
                    240:        int i;
                    241: 
                    242:        for (i = strlen(s)-1; i >= 0; i--)
                    243:                unput(s[i]);
                    244: }

unix.superglobalmegacorp.com

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