Annotation of 40BSD/cmd/efl/lex.l, revision 1.1

1.1     ! root        1: %Start DOTSON
        !             2: %{
        !             3: #include <ctype.h>
        !             4: #include "defs"
        !             5: #include "tokdefs"
        !             6: 
        !             7: typedef union { int ival; ptr pval; } YYSTYPE;
        !             8: extern YYSTYPE yylval;
        !             9: YYSTYPE prevl;
        !            10: int prevv;
        !            11: char *copys();
        !            12: static ptr p;
        !            13: static ptr q;
        !            14: static FILE *fd;
        !            15: static int quoted, k;
        !            16: static int rket        = 0;
        !            17: FILE *opincl();
        !            18: ptr mkdef(), mkcomm(), mkname(), mkimcon();
        !            19: 
        !            20: #define RET(x) { RETI(x,x);  }
        !            21: 
        !            22: #define RETL(yv,yl) {yylval=prevl=yl;igeol=comneed=0;return(prevv=yv); }
        !            23: #define RETP(yv,yl) {yylval.pval=prevl.pval=yl;igeol=comneed=0;return(prevv=yv); }
        !            24: #define RETI(yv,yl) {yylval.ival=prevl.ival=yl;igeol=comneed=0;return(prevv=yv); }
        !            25: #define REL(n)  {  RETI(RELOP, OPREL+n);}
        !            26: #define AS(n)  {  RETI(ASGNOP, OPASGN+n); }
        !            27: #define RETC(x) { RETP(CONST, mkconst(x,yytext) );  }
        !            28: #define RETZ(x) { yytext[yyleng-1] = '\0'; RETP(CONST, mkimcon(x,yytext) ); }
        !            29: 
        !            30: %}
        !            31: 
        !            32: D      [0-9]
        !            33: d      [dD][+-]?[0-9]+
        !            34: e      [eE][+-]?[0-9]+
        !            35: i      [iI]
        !            36: 
        !            37: %%
        !            38: 
        !            39: [a-zA-Z][a-zA-Z0-9_]*  {
        !            40:                   lower(yytext);
        !            41:                   if(lettneed && yyleng==1)
        !            42:                        { RETI(LETTER, yytext[0]); }
        !            43:                   else if(defneed)
        !            44:                        {
        !            45:                        register char *q1, *q2;
        !            46:                        for(q2=q1=yytext+yyleng+1 ; (*q1 = efgetc)!='\n' ; ++q1)
        !            47:                                ;
        !            48:                        *q1 = '\0';
        !            49:                        p = mkdef(yytext, q2);
        !            50:                        defneed = 0;
        !            51:                        ++yylineno;
        !            52:                        unput('\n');
        !            53:                        }
        !            54:                   else if(optneed)
        !            55:                        { RETP(OPTNAME, copys(yytext)); }
        !            56:                   else if(comneed && ( (q=name(yytext,1))==NULL || q->tag!=TDEFINE) )
        !            57:                        { RETP(COMNAME, mkcomm(yytext) ); }
        !            58:                   else if(q = name(yytext,1)) switch(q->tag)
        !            59:                        {
        !            60:                        case TDEFINE:
        !            61:                                filelines[filedepth] = yylineno;
        !            62:                                filemacs[filedepth] = efmacp;
        !            63:                                pushchars[filedepth] = (yysptr>yysbuf?
        !            64:                                                *--yysptr : -1);
        !            65:                                if(++filedepth >= MAXINCLUDEDEPTH)
        !            66:                                        fatal("macro or include too deep");
        !            67:                                filelines[filedepth] = yylineno = 1;
        !            68:                                efmacp = q->varp->valp;
        !            69:                                filenames[filedepth] = NULL;
        !            70:                                break;  /*now process new input */
        !            71: 
        !            72:                        case TSTRUCT:
        !            73:                                RETP(STRUCTNAME, q);
        !            74: 
        !            75:                        case TNAME:
        !            76:                                RETP(NAME, q);
        !            77: 
        !            78:                        case TKEYWORD:
        !            79:                                if(q->subtype == END)
        !            80:                                        {
        !            81:                                        register int c;
        !            82:                                        eofneed = YES;
        !            83:                                        while((c=input())!=';'&&c!='\n'&&c!=EOF)
        !            84:                                                ;
        !            85:                                        NLSTATE;
        !            86:                                        }
        !            87:                                RET(q->subtype);
        !            88: 
        !            89:                        default:
        !            90:                                fatal1("lex: impossible type code %d", q->tag);
        !            91:                        }
        !            92:                   else  RETP(NAME, mkname(yytext) );
        !            93:                }
        !            94: 
        !            95: ","    RET(COMMA);
        !            96: ";"    RET(EOS);
        !            97: 
        !            98: "("    RET(LPAR);
        !            99: ")"    RET(RPAR);
        !           100: 
        !           101: 
        !           102: "["    |
        !           103: "{"    RET(LBRACK);
        !           104: 
        !           105: "]"    |
        !           106: "}"    { if(iobrlevel>0) RET(RBRACK); rket = 1;  RET(EOS); }
        !           107: 
        !           108: ","    RET(COMMA);
        !           109: ":"    RET(COLON);
        !           110: 
        !           111: "$"    RET(REPOP);
        !           112: 
        !           113: <DOTSON>"."[oO][rR]"." |
        !           114: "|"    RETI(OR,OPOR);
        !           115: <DOTSON>"."[cC][oO][rR]"."     |
        !           116: "||"   RETI(OR,OP2OR);
        !           117: <DOTSON>"."[aA][nN][dD]"."     |
        !           118: "&"    RETI(AND,OPAND);
        !           119: <DOTSON>"."[cC][aA][nN][dD]"." |
        !           120: "&&"   RETI(AND,OP2AND);
        !           121: <DOTSON>"."[nN][oO][tT]"."     |
        !           122: "~"    RETI(NOT,OPNOT);
        !           123: "!"    RETI(NOT,OPNOT);
        !           124: 
        !           125: <DOTSON>"."[lL][tT]"." |
        !           126: "<"    REL(OPLT);
        !           127: <DOTSON>"."[lL][eE]"." |
        !           128: "<="   REL(OPLE);
        !           129: <DOTSON>"."[gG][tT]"." |
        !           130: ">"    REL(OPGT);
        !           131: <DOTSON>"."[gG][eE]"." |
        !           132: ">="   REL(OPGE);
        !           133: <DOTSON>"."[eE][qQ]"." |
        !           134: "=="   REL(OPEQ);
        !           135: <DOTSON>"."[nN][eE]"." |
        !           136: "~="   |
        !           137: "!="   REL(OPNE);
        !           138: 
        !           139: "->"   RET(ARROW);
        !           140: "."    RET(QUALOP);
        !           141: 
        !           142: "+"    RETI(ADDOP, OPPLUS);
        !           143: "-"    RETI(ADDOP, OPMINUS);
        !           144: "*"    RETI(MULTOP, OPSTAR);
        !           145: "/"    RETI(MULTOP, OPSLASH);
        !           146: 
        !           147: "**"   |
        !           148: "^"    RETI(POWER, OPPOWER);
        !           149: 
        !           150: "++"   RETI(DOUBLEADDOP, OPPLUS);
        !           151: "--"   RETI(DOUBLEADDOP, OPMINUS);
        !           152: 
        !           153: "="    AS(OPASGN);
        !           154: "+="   AS(OPPLUS);
        !           155: "-="   AS(OPMINUS);
        !           156: "*="   AS(OPSTAR);
        !           157: "/="   AS(OPSLASH);
        !           158: "**="  |
        !           159: "^="   AS(OPPOWER);
        !           160: 
        !           161: "&="   AS(OPAND);
        !           162: "&&="  AS(OP2AND);
        !           163: "|="   AS(OPOR);
        !           164: "||="  AS(OP2OR);
        !           165: 
        !           166: \'[^\n']*\'    |
        !           167: \"[^\n"]*\"    { yytext[yyleng-1] = '\0'; p = mkconst(TYCHAR,yytext+1);
        !           168:                  RETP(CONST,p); }
        !           169: 
        !           170: {D}+[hH]       { /* nh construct */
        !           171:                int i, n;  char c;
        !           172:                yytext[yyleng-1] = '\0';  n = convci(yytext);
        !           173:                for(i = 0; i<n ; ++i)
        !           174:                        if( (c=yytext[i]=input()) == '\n' || c=='\0') break;
        !           175:                yytext[i] = '\0';
        !           176:                p = mkconst(TYCHAR,yytext);
        !           177:                p->vtypep = mkint(i);
        !           178:                RETP(CONST, p);
        !           179:                }
        !           180: 
        !           181: {D}+           RETC(TYINT);
        !           182: 
        !           183: {D}+"."{D}*    |
        !           184: {D}*"."{D}+    RETC(TYREAL);
        !           185: 
        !           186: {D}+"."?{D}*{e}        |
        !           187: {D}*"."{D}+{e} RETC(TYREAL);
        !           188: 
        !           189: {D}+"."?{D}*{d}        |
        !           190: {D}*"."{D}+{d} RETC(TYLREAL);
        !           191: 
        !           192: {D}+{i}                { yytext[yyleng-1] = '.';
        !           193:                  RETP(CONST,mkimcon(TYCOMPLEX,yytext)); }
        !           194: 
        !           195: {D}+"."{D}*{i} |
        !           196: {D}*"."{D}+{i} RETZ(TYCOMPLEX);
        !           197: 
        !           198: {D}+"."?{D}*{e}{i}     |
        !           199: {D}*"."{D}+{e}{i}      RETZ(TYCOMPLEX);
        !           200: 
        !           201: {D}+"."?{D}*{d}{i}     |
        !           202: {D}*"."{D}+{d}{i}      RETZ(TYLCOMPLEX);
        !           203: 
        !           204: "#".*  { if(! nocommentflag) goto litline; }
        !           205: 
        !           206: ^"%".* { if(thisexec) thisexec->nftnst += 2;
        !           207:          if(inproc)
        !           208:                {
        !           209:                unput('\n');
        !           210:                RETP(ESCAPE, copys(yytext));
        !           211:                }
        !           212: 
        !           213:        litline:        p = mkchain( copys(yytext), CHNULL);
        !           214:                        if(inproc==0 && yytext[0]=='%')
        !           215:                                prevcomments = hookup(prevcomments, p);
        !           216:                        else
        !           217:                                comments =  hookup(comments,p);
        !           218:        }
        !           219: 
        !           220: " "    ;
        !           221: \t     ;
        !           222: \f     ;
        !           223: 
        !           224: "_"[ \t]*\n    ;
        !           225: 
        !           226: \n     { if(igeol) { igeol=0; prevv = NEWLINE; }
        !           227:          else if(prevv>=NAME || prevv==RPAR || prevv==RBRACK
        !           228:                        || prevv== -1 || prevv==QUALOP)
        !           229:                RET(EOS); }
        !           230: 
        !           231: .      { char * linerr();
        !           232:          fprintf(diagfile, "Bad input character %c %s\n", yytext[0], linerr());
        !           233:          ++nerrs;
        !           234:        }
        !           235: 
        !           236: ^[ \t]*[iI][nN][cC][lL][uU][dD][eE].*\n        { /* Include statement */
        !           237:        char *q1;
        !           238:        register char *q2;
        !           239:        for(q1=yytext ; *q1==' ' || *q1=='\t' ; ++q1) ;
        !           240:        quoted = NO;
        !           241:        for(q1 += 7 ; *q1==' ' || *q1=='\t' ||
        !           242:                *q1=='\'' || *q1=='"' || *q1=='(' ; ++q1 )
        !           243:                        if(*q1=='"' || *q1=='\'')
        !           244:                                quoted = YES;
        !           245:        for(q2=q1 ; *q2!='\0' &&  *q2!=' ' && *q2!='\n' &&
        !           246:                *q2!='\'' && *q2!='"' && *q2!=')' ; ++q2 )
        !           247:                        ;
        !           248:        *q2 = '\0';
        !           249:        if( ! quoted)
        !           250:                for(k=0; (q = name(q1,1)) && q->tag==TDEFINE ; ++k)
        !           251:                        {
        !           252:                        if(k > MAXINCLUDEDEPTH)
        !           253:                                fatal1("Macros too deep for %s", yytext);
        !           254:                        q1 = q->varp->valp;
        !           255:                        }
        !           256:        if( (fd = opincl(&q1)) == NULL)
        !           257:                {
        !           258:                fprintf(diagfile, "Cannot open file %s.  Stop.\n", q1);
        !           259:                exit(2);
        !           260:                }
        !           261:        filelines[filedepth] = yylineno;
        !           262:        pushchars[filedepth] = '\n';
        !           263:        if(++filedepth >= MAXINCLUDEDEPTH)
        !           264:                fatal("macro or include too deep");
        !           265:        fileptrs[filedepth] = yyin = fd;
        !           266:        filenames[filedepth] = copys(q1);
        !           267:        filelines[filedepth] = yylineno = 1;
        !           268:        filemacs[filedepth] = NULL;
        !           269:        }
        !           270: 
        !           271: %%
        !           272: 
        !           273: yywrap()
        !           274: {
        !           275: if(filedepth == 0)
        !           276:        {
        !           277:        ateof = 1;
        !           278:        return(1);
        !           279:        }
        !           280: 
        !           281: if(efmacp == 0)
        !           282:        {
        !           283:        fclose(yyin);
        !           284:        cfree(filenames[filedepth]);
        !           285:        }
        !           286: 
        !           287: --filedepth;
        !           288: if( filemacs[filedepth] )
        !           289:        efmacp = filemacs[filedepth];
        !           290: else   {
        !           291:        yyin = fileptrs[filedepth];
        !           292:        efmacp = 0;
        !           293:        }
        !           294: yylineno = filelines[filedepth];
        !           295: if(pushchars[filedepth] != -1)
        !           296:        unput( pushchars[filedepth] );
        !           297: return(0);
        !           298: }
        !           299: 
        !           300: 
        !           301: 
        !           302: lower(s)       /* replace upper with lower case letters */
        !           303: register char *s;
        !           304: {
        !           305: register char *t;
        !           306: for(t=s ; *t ; ++t)
        !           307:        if( isupper(*t) )
        !           308:                *s++ = tolower(*t);
        !           309:        else if(*t != '_')
        !           310:                *s++ = *t;
        !           311: }
        !           312: 
        !           313: 
        !           314: 
        !           315: 
        !           316: setdot(k)
        !           317: int k;
        !           318: {
        !           319: if(k)
        !           320:        BEGIN DOTSON;
        !           321: else   BEGIN 0;
        !           322: }
        !           323: 
        !           324: 
        !           325: 
        !           326: 
        !           327: FILE *opincl(namep)
        !           328: char **namep;
        !           329: {
        !           330: #ifndef unix
        !           331:        return( fopen(*namep, "r") );
        !           332: #else
        !           333: 
        !           334:        /* On Unix, follow the C include conventions */
        !           335:        
        !           336:        register char *s, *lastslash;
        !           337:        char *dir, *name, temp[100];
        !           338:        int i;
        !           339:        FILE *fp;
        !           340:        
        !           341:        name = *namep;
        !           342:        if(name[0] == '/')
        !           343:                return( fopen(name, "r") );
        !           344:        
        !           345:        dir = basefile;
        !           346:        for(i = filedepth ; i>=0 ; --i)
        !           347:                if( filemacs[i] == NULL)
        !           348:                        {
        !           349:                        dir = filenames[i];
        !           350:                        break;
        !           351:                        }
        !           352: 
        !           353:        lastslash = NULL;
        !           354:        for(s = dir ; *s ; ++s)
        !           355:                if(*s == '/')
        !           356:                        lastslash = s;
        !           357:        if(lastslash)
        !           358:                {
        !           359:                *lastslash = '\0';
        !           360:                sprintf(temp, "%s/%s", dir, name);
        !           361:                *lastslash = '/';
        !           362:                if( fp = fopen(temp, "r") )
        !           363:                        *namep = temp;
        !           364:                }
        !           365:        else
        !           366:                fp = fopen(name, "r");
        !           367:        
        !           368:        if(fp == NULL)
        !           369:                {
        !           370:                sprintf(temp, "/usr/include/%s", name);
        !           371:                fp = fopen(temp, "r");
        !           372:                *namep = temp;
        !           373:                }
        !           374:        return(fp);
        !           375: 
        !           376: #endif
        !           377: }
        !           378: 

unix.superglobalmegacorp.com

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