Annotation of researchv10no/cmd/efl/lex.l, revision 1.1

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

unix.superglobalmegacorp.com

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