Annotation of 43BSDReno/usr.bin/awk/awk.lx.l, revision 1.1

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