Annotation of researchv8dc/cmd/awk/awk.lx.l, revision 1.1

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

unix.superglobalmegacorp.com

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