Annotation of 3BSD/cmd/apl/lex.c, revision 1.1.1.1

1.1       root        1: #define lv yylval
                      2: #define v yyval
                      3: 
                      4: 
                      5: yylex()
                      6: {
                      7:        register c;
                      8:        register struct tab *tp;
                      9:        extern TERMtype;
                     10: 
                     11:        if(nlexsym != -1) {
                     12:                if (TERMtype == 1) dofix();             /* convert iline */
                     13:                c = nlexsym;
                     14:                nlexsym = -1;
                     15:                return(c);
                     16: 
                     17:        }
                     18:        while(litflag > 0) {
                     19:                if (TERMtype == 0)c = (int)*iline++;
                     20:                else c = asciich();
                     21:                if(c == '\n') {
                     22:                        nlexsym = 0;
                     23:                        return(eol);
                     24:                }
                     25:        }
                     26:        do
                     27:                if (TERMtype == 0)c = (int)*iline++;
                     28:                else c = asciich();
                     29:        while(c == ' ');
                     30:        if(c == '\n') {
                     31:                nlexsym = 0;
                     32:                return(eol);
                     33:        }
                     34:        if(alpha(c))
                     35:                return(getnam(c));
                     36:        if(digit(c) || c == '@' ||
                     37:            (c=='.' && digit(*iline)))
                     38:                return(getnum(c));
                     39:        c &= 0377;
                     40:        for(tp = tab; tp->input; tp++)
                     41:                if(tp->input == c) {
                     42:                        lv = tp->lexval;
                     43:                        return(tp->retval);
                     44:                }
                     45:        return(unk);
                     46: }
                     47: 
                     48: getnam(ic)
                     49: {
                     50:        char name[NAMS];
                     51:        register c;
                     52:        register char *cp;
                     53:        register struct nlist *np;
                     54: 
                     55:        cp = name;
                     56:        do {
                     57:                *cp++ = c;
                     58:                if (TERMtype == 0)c = (int)*iline++;
                     59:                else c = asciich();
                     60:        } while(alpha(c) || digit(c));
                     61:        *cp++ = 0;
                     62:        iline--;
                     63:        if(litflag < 0) {       /* commands */
                     64:                litflag = 0;
                     65:                for(c=0; comtab[c]; c+=3)
                     66:                        if(equal(name, comtab[c]))
                     67:                                break;
                     68:                lv = comtab[c+2];
                     69:                return(comtab[c+1]);
                     70:        }
                     71:        if(a_label(name)){
                     72:                return(numb);
                     73:        }
                     74:        for(np=nlist; np->namep; np++)
                     75:        if(equal(np->namep, name)) {
                     76:                lv = np;
                     77:                switch(np->use) {
                     78: 
                     79:                case NF:
                     80:                        return(nfun);
                     81: 
                     82:                case MF:
                     83:                        return(mfun);
                     84: 
                     85:                case DF:
                     86:                        return(dfun);
                     87:                }
                     88:                return(nam);
                     89:        }
                     90:        np->namep = alloc(cp-name);
                     91:        copy(CH, name, np->namep, cp-name);
                     92:        np->type = LV;
                     93:        lv = np;
                     94:        return(nam);
                     95: }
                     96: 
                     97: a_label(x)
                     98: register char *x;
                     99: {
                    100: register struct lablist *lblthru;
                    101: 
                    102:        lblthru = labldefs.nextll;
                    103:        while(lblthru) {
                    104:                if(equal(lblthru->lname,x)) {
                    105:                        datum = (double) lblthru->lno;
                    106:                        return(1);
                    107:                }
                    108:                lblthru = lblthru->nextll;
                    109:        }
                    110:        return(0);
                    111: }
                    112: 
                    113: getnum(ic)
                    114: {
                    115:        double d1, d2;
                    116:        register c, n, n1;
                    117:        int s, s1;
                    118: 
                    119:        s = 0;
                    120:        n = 0;
                    121:        d1 = 0.;
                    122:        c = ic;
                    123:        if(c == '@') {
                    124:                s++;
                    125:                if (TERMtype == 0)c = (int)*iline++;
                    126:                else c = asciich();
                    127:        }
                    128:        while(digit(c)) {
                    129:                d1 = d1*10. + c - '0';
                    130:                if (TERMtype == 0)c = (int)*iline++;
                    131:                else c = asciich();
                    132:        }
                    133:        if(c == '.') {
                    134:                if (TERMtype == 0)c = (int)*iline++;
                    135:                else c = asciich();
                    136:                while(digit(c)) {
                    137:                        d1 = d1*10. + c - '0';
                    138:                        if (TERMtype == 0)c = (int)*iline++;
                    139:                        else c = asciich();
                    140:                        n--;
                    141:                }
                    142:        }
                    143:        if(c == 'e') {
                    144:                s1 = 0;
                    145:                n1 = 0;
                    146:                if (TERMtype == 0)c = (int)*iline++;
                    147:                else c = asciich();
                    148:                if(c == '@') {
                    149:                        s1++;
                    150:                        if (TERMtype == 0)c = (int)*iline++;
                    151:                        else c = asciich();
                    152:                }
                    153:                while(digit(c)) {
                    154:                        n1 = n1*10 + c - '0';
                    155:                        if (TERMtype == 0)c = (int)*iline++;
                    156:                        else c = asciich();
                    157:                }
                    158:                if(s1)
                    159:                        n -= n1; else
                    160:                        n += n1;
                    161:        }
                    162:        n1 = n;
                    163:        if(n1 < 0)
                    164:                n1 = -n1;
                    165:        d2 = 1.;
                    166:        while(n1--)
                    167:                d2 *= 10.;
                    168:        if(n < 0)
                    169:                d1 /= d2; else
                    170:                d1 *= d2;
                    171:        if(s)
                    172:                d1 = -d1;
                    173:        iline--;
                    174:        datum = d1;
                    175:        return(numb);
                    176: }
                    177: 
                    178: alpha(s)
                    179: {
                    180:        register c;
                    181: 
                    182:        c = s & 0377;
                    183:        if(c >= 'a' && c <= 'z')
                    184:                return(1);
                    185:         if(c == 'H')
                    186:                return(1);
                    187:        if(c == 'F')
                    188:                return(1);
                    189:        if(c >= 0220 && c<=0252)
                    190:                return(1);
                    191:        return(0);
                    192: }
                    193: 
                    194: digit(s)
                    195: {
                    196:        register c;
                    197: 
                    198:        c = s;
                    199:        if(c >='0' && c <= '9')
                    200:                return(1);
                    201:        return(0);
                    202: }
                    203: 
                    204: /*
                    205:  * s is statement
                    206:  * f is execution flag:
                    207:  *     0 compile immediate
                    208:  *     1 compile L
                    209:  *     2 function definition
                    210:  *     3 function prolog
                    211:  *     4 function epilog
                    212:  *     5 function body
                    213:  */
                    214: int    ilex[]
                    215: {
                    216:        lex0, lex1, lex2, lex3, lex4, lex5, lex6
                    217: };
                    218: compile(s, f)
                    219: {
                    220:        register char *p, *q;
                    221:        char oline[OBJS];
                    222: 
                    223:        iline = s;
                    224:        ccharp = oline;
                    225:        litflag = 0;
                    226:        nlexsym = ilex[f];
                    227:        context = nlexsym;
                    228:        if(yyparse()) {
                    229:                pline(s, iline-s);
                    230:                return(0);
                    231:        }
                    232:        *ccharp++ = EOF;
                    233:        p = alloc(ccharp-oline);
                    234:        iline = p;
                    235:        for(q=oline; q<ccharp;)
                    236:                *p++ = *q++;
                    237:        return(iline);
                    238: }
                    239: 
                    240: yyerror()
                    241: {
                    242: }
                    243: 
                    244: name(np, c2)
                    245: {
                    246:        register char *p;
                    247: 
                    248:        p = ccharp;
                    249:        *ccharp++ = c2;
                    250:        *ccharp++ = np.c[0];
                    251:        *ccharp++ = np.c[1];
                    252:        *ccharp++ = np.c[2];
                    253:        *ccharp++ = np.c[3]; 
                    254:        return(p);
                    255: }
                    256: 
                    257: equal(a, b)
                    258: char *a, *b;
                    259: {
                    260:        register char *c1, *c2;
                    261: 
                    262:        c1 = a;
                    263:        c2 = b;
                    264:        while(*c1++ == *c2)
                    265:                if(*c2++ == 0)
                    266:                        return(1);
                    267:        return(0);
                    268: }
                    269: 
                    270: invert(a, b)
                    271: {
                    272: 
                    273:        flop(a, b);
                    274:        flop(b, ccharp);
                    275:        flop(a, ccharp);
                    276: }
                    277: 
                    278: flop(a, b)
                    279: char *a, *b;
                    280: {
                    281:        register char *a1, *a2;
                    282:        register c;
                    283: 
                    284:        a1 = a;
                    285:        a2 = b;
                    286:        while(a1 < a2) {
                    287:                c = *a1;
                    288:                *a1++ = *--a2;
                    289:                *a2 = c; 
                    290:        }
                    291: }

unix.superglobalmegacorp.com

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