Annotation of researchv10no/cmd/efl/lex.l, revision 1.1.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.