[BACK]Return to lex.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Annotation of OpenXM_contrib2/asir2000/parse/lex.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/parse/lex.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
        !             2: #include <ctype.h>
        !             3: #include "ca.h"
        !             4: #include "al.h"
        !             5: #include "base.h"
        !             6: #include "parse.h"
        !             7: #if !defined(THINK_C)
        !             8: #include <sys/types.h>
        !             9: #include <sys/stat.h>
        !            10: #endif
        !            11: #include "y.tab.h"
        !            12:
        !            13: extern IN asir_infile;
        !            14: extern struct oTKWD kwd[];
        !            15:
        !            16: int afternl();
        !            17: int myatoi();
        !            18: int aftercomment();
        !            19:
        !            20: extern int main_parser;
        !            21: extern char *parse_strp;
        !            22:
        !            23: static int skipspace();
        !            24: static int Getc();
        !            25: static void Ungetc();
        !            26: static void Gets();
        !            27:
        !            28: yylex()
        !            29: {
        !            30: #define yylvalp (&yylval)
        !            31:        register int c,c1;
        !            32:        register int *ptr;
        !            33:        char *cptr;
        !            34:        int d,i,j;
        !            35: #if defined(__MWERKS__)
        !            36:        char nbuf[BUFSIZ],tbuf[BUFSIZ];
        !            37: #else
        !            38:        char nbuf[BUFSIZ*10],tbuf[BUFSIZ];
        !            39: #endif
        !            40:        N n,n1;
        !            41:        Q q;
        !            42:        Obj r;
        !            43:
        !            44:        switch ( c = skipspace() ) {
        !            45:                case EOF :
        !            46:                        asir_terminate(2); break;
        !            47:                case '0' :
        !            48:                        while ( ( c = Getc() ) == '0' );
        !            49:                        if ( c == '.' ) {
        !            50:                                Ungetc(c); c = '0';
        !            51:                        } else if ( c == 'x' ) {
        !            52:                                for ( i = 0; i < 8; i++ )
        !            53:                                        nbuf[i] = '0';
        !            54:                                for ( ; isalnum(c = Getc()); nbuf[i++] = c );
        !            55:                                Ungetc(c); nbuf[i] = 0;
        !            56:                                hexton(nbuf,&n1);
        !            57:                                NTOQ(n1,1,q); r = (Obj)q;
        !            58:                                yylvalp->p = (pointer)r;
        !            59:                                return ( FORMULA );
        !            60:                        } else if ( c == 'b' ) {
        !            61:                                for ( i = 0; i < 32; i++ )
        !            62:                                        nbuf[i] = '0';
        !            63:                                for ( ; isalnum(c = Getc()); nbuf[i++] = c );
        !            64:                                Ungetc(c); nbuf[i] = 0;
        !            65:                                binaryton(nbuf,&n1);
        !            66:                                NTOQ(n1,1,q); r = (Obj)q;
        !            67:                                yylvalp->p = (pointer)r;
        !            68:                                return ( FORMULA );
        !            69:                        } else if ( !isdigit(c) ) {
        !            70:                                yylvalp->p = 0; Ungetc(c);
        !            71:                                return ( FORMULA );
        !            72:                        }
        !            73:                        break;
        !            74:                case '\'' :
        !            75:                        for ( i = 0; ; i++ ) {
        !            76:                                c = Getc();
        !            77:                                if ( c == '\'' )
        !            78:                                        break;
        !            79:                                if ( c == '\\' )
        !            80:                                        c = Getc();
        !            81:                                tbuf[i] = c;
        !            82:                        }
        !            83:                        tbuf[i] = 0;
        !            84:                        cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf);
        !            85:                        yylvalp->p = (pointer)cptr;
        !            86:                        return LCASE; break;
        !            87:                case '"' :
        !            88: #if 0
        !            89:                        for ( i = 0; (nbuf[i] = Getc()) != '"'; i++ );
        !            90: #endif
        !            91:                        i = 0;
        !            92:                        do {
        !            93:                                c = Getc();
        !            94:                                if ( c == '\\' ) {
        !            95:                                        c1 = Getc();
        !            96:                                        if ( c1 == 'n' )
        !            97:                                                c1 = '\n';
        !            98:                                        nbuf[i++] = c1;
        !            99:                                } else
        !           100:                                        nbuf[i++] = c;
        !           101:                        } while ( c != '"' );
        !           102:                        nbuf[i-1] = 0;
        !           103:                        cptr = (char *)MALLOC(strlen(nbuf)+1);
        !           104:                        strcpy(cptr,nbuf); yylvalp->p = (pointer) cptr;
        !           105:                        return ( STR ); break;
        !           106:                case '>': case '<': case '=': case '!':
        !           107:                        if ( (c1 = Getc()) == '=' )
        !           108:                                switch ( c ) {
        !           109:                                        case '>': yylvalp->i = (int)C_GE; break;
        !           110:                                        case '<': yylvalp->i = (int)C_LE; break;
        !           111:                                        case '=': yylvalp->i = (int)C_EQ; break;
        !           112:                                        case '!': yylvalp->i = (int)C_NE; break;
        !           113:                                        default: break;
        !           114:                                }
        !           115:                        else if ( (c == '<' && c1 == '<') || (c == '>' && c1 == '>') )
        !           116:                                return c;
        !           117:                        else {
        !           118:                                Ungetc(c1);
        !           119:                                switch ( c ) {
        !           120:                                        case '>': yylvalp->i = (int)C_GT; break;
        !           121:                                        case '<': yylvalp->i = (int)C_LT; break;
        !           122:                                        default: return c; break;
        !           123:                                }
        !           124:                        }
        !           125:                        return CMP; break;
        !           126:                case '+': case '-': case '*': case '/': case '%': case '^':
        !           127:                case '|': case '&':
        !           128:                        switch ( c ) {
        !           129:                                case '+': yylvalp->p = (pointer)addfs; break;
        !           130:                                case '-': yylvalp->p = (pointer)subfs; break;
        !           131:                                case '*': yylvalp->p = (pointer)mulfs; break;
        !           132:                                case '/': yylvalp->p = (pointer)divfs; break;
        !           133:                                case '%': yylvalp->p = (pointer)remfs; break;
        !           134:                                case '^': yylvalp->p = (pointer)pwrfs; break;
        !           135:                                default: break;
        !           136:                        }
        !           137:                        if ( (c1 = Getc()) == c )
        !           138:                                switch ( c ) {
        !           139:                                        case '+': case '-': return SELF; break;
        !           140:                                        case '|': return OR; break;
        !           141:                                        case '&': return AND; break;
        !           142:                                        default: Ungetc(c1); return c; break;
        !           143:                                }
        !           144:                        else if ( c1 == '=' )
        !           145:                                return BOPASS;
        !           146:                        else if ( (c == '-') && (c1 == '>') )
        !           147:                                return POINT;
        !           148:                        else {
        !           149:                                Ungetc(c1); return c;
        !           150:                        }
        !           151:                        break;
        !           152:                default :
        !           153:                        break;
        !           154:        }
        !           155:        if ( isdigit(c) ) {
        !           156:                for ( i = 0; i < DLENGTH; i++ )
        !           157:                        nbuf[i] = '0';
        !           158:                for ( nbuf[i++] = c; isdigit(c = Getc()); nbuf[i++] = c);
        !           159:                if ( c == '.' ) {
        !           160:                        double dbl;
        !           161:                        Real real;
        !           162:                        double atof();
        !           163:                        extern int bigfloat;
        !           164:
        !           165:                        for ( nbuf[i++] = c; isdigit(c = Getc()); nbuf[i++] = c);
        !           166:                        if ( c == 'e' ) {
        !           167:                                nbuf[i++] = c;
        !           168:                                if ( ((c = Getc()) == '+') || (c == '-') ) {
        !           169:                                        nbuf[i++] = c; c = Getc();
        !           170:                                }
        !           171:                                for ( ; isdigit(c); nbuf[i++] = c, c = Getc());
        !           172:                        }
        !           173:                        Ungetc(c); nbuf[i] = 0;
        !           174: #if PARI
        !           175:                        if ( !bigfloat ) {
        !           176:                                dbl = (double)atof(nbuf+DLENGTH);
        !           177:                                MKReal(dbl,real); r = (Obj)real;
        !           178:                        } else
        !           179:                                strtobf(nbuf,(BF *)&r);
        !           180: #else
        !           181:                        dbl = (double)atof(nbuf+DLENGTH);
        !           182:                        MKReal(dbl,real); r = (Obj)real;
        !           183: #endif
        !           184:                } else {
        !           185:                        Ungetc(c);
        !           186:                        i -= DLENGTH; d = (i%DLENGTH?i/DLENGTH+1:i/DLENGTH);
        !           187:                        n = NALLOC(d); PL(n) = d;
        !           188:                        for ( j = 0, ptr = BD(n); j < d; j++ ,i -= DLENGTH )
        !           189:                                ptr[j] = myatoi(nbuf+i);
        !           190:                        bnton(DBASE,n,&n1);
        !           191:                        NTOQ(n1,1,q); r = (Obj)q;
        !           192: /*                     optobj(&r); */
        !           193:                }
        !           194:                yylvalp->p = (pointer)r;
        !           195:                return ( FORMULA );
        !           196:        } else if ( isalpha(c) ) {
        !           197:                for ( i = 1, tbuf[0] = c; isalpha(c = Getc())||isdigit(c)||(c=='_'); i++ )
        !           198:                        tbuf[i] = c;
        !           199:                tbuf[i] = 0; Ungetc(c);
        !           200:                if ( isupper(tbuf[0]) ) {
        !           201:                        cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf);
        !           202:                        yylvalp->p = (pointer)cptr;
        !           203:                        return UCASE;
        !           204:                } else {
        !           205:                        for ( i = 0; kwd[i].name && strcmp(tbuf,kwd[i].name); i++ );
        !           206:                        if ( kwd[i].name ) {
        !           207:                                yylvalp->i = asir_infile->ln;
        !           208:                                return kwd[i].token;
        !           209:                        } else {
        !           210:                                cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf);
        !           211:                                yylvalp->p = (pointer)cptr;
        !           212:                                return LCASE;
        !           213:                        }
        !           214:                }
        !           215:        } else if ( c == '@' ) {
        !           216:                if ( isdigit(c = Getc()) ) {
        !           217:                        for ( i = 1, nbuf[0] = c; isdigit(c = Getc()); nbuf[i++] = c);
        !           218:                        Ungetc(c); nbuf[i] = 0; yylvalp->i = atoi(nbuf);
        !           219:                        return ANS;
        !           220:                } else if ( c == '@' ) {
        !           221:                        yylvalp->i = MAX(0,APVS->n-1);
        !           222:                        return ANS;
        !           223:                } else if ( c == '>' ||  c == '<' ||  c == '=' || c == '!' ) {
        !           224:                        if ( (c1 = Getc()) == '=' )
        !           225:                                switch ( c ) {
        !           226:                                        case '>': yylvalp->i = (int)L_GE; break;
        !           227:                                        case '<': yylvalp->i = (int)L_LE; break;
        !           228:                                        case '=': yylvalp->i = (int)L_EQ; break;
        !           229:                                        case '!': yylvalp->i = (int)L_NE; break;
        !           230:                                        default: break;
        !           231:                                }
        !           232:                        else {
        !           233:                                Ungetc(c1);
        !           234:                                switch ( c ) {
        !           235:                                        case '>': yylvalp->i = (int)L_GT; break;
        !           236:                                        case '<': yylvalp->i = (int)L_LT; break;
        !           237:                                        case '=': yylvalp->i = (int)L_EQ; break;
        !           238:                                        case '!': yylvalp->i = (int)L_NOT; return FOP_NOT; break;
        !           239:                                        default: break;
        !           240:                                }
        !           241:                        }
        !           242:                        return LOP;
        !           243:                } else if ( c == '|' ||  c == '&' ) {
        !           244:                        if ( (c1 = Getc()) != c )
        !           245:                                Ungetc(c1);
        !           246:                        switch ( c ) {
        !           247:                                case '|': yylvalp->i = (int)L_OR;
        !           248:                                        return FOP_OR; break;
        !           249:                                case '&': yylvalp->i = (int)L_AND;
        !           250:                                        return FOP_AND; break;
        !           251:                        }
        !           252:                } else if ( isalpha(c) ) {
        !           253:                        for ( i = 2, tbuf[0] = '@', tbuf[1] = c;
        !           254:                                isalpha(c = Getc()); tbuf[i++] = c);
        !           255:                        Ungetc(c); tbuf[i] = 0;
        !           256:                        if ( !strcmp(tbuf,"@p") )
        !           257:                                return GFPNGEN;
        !           258:                        else if ( !strcmp(tbuf,"@i") ) {
        !           259:                                extern pointer IU;
        !           260:
        !           261:                                yylvalp->p = IU;
        !           262:                                return FORMULA;
        !           263:                        } else if ( !strcmp(tbuf,"@true") ) {
        !           264:                                yylvalp->p = F_TRUE;
        !           265:                                return FORMULA;
        !           266:                        } else if ( !strcmp(tbuf,"@false") ) {
        !           267:                                yylvalp->p = F_FALSE;
        !           268:                                return FORMULA;
        !           269:                        } else if ( !strcmp(tbuf,"@impl") ) {
        !           270:                                yylvalp->i = (int)L_IMPL;
        !           271:                                return FOP_IMPL;
        !           272:                        } else if ( !strcmp(tbuf,"@repl") ) {
        !           273:                                yylvalp->i = (int)L_REPL;
        !           274:                                return FOP_REPL;
        !           275:                        } else if ( !strcmp(tbuf,"@equiv") ) {
        !           276:                                yylvalp->i = (int)L_EQUIV;
        !           277:                                return FOP_EQUIV;
        !           278:                        } else {
        !           279:                                cptr = (char *)MALLOC(strlen(tbuf)+1); strcpy(cptr,tbuf);
        !           280:                                yylvalp->p = (pointer)cptr;
        !           281:                                return LCASE;
        !           282:                        }
        !           283:                } else {
        !           284:                        Ungetc(c);
        !           285:                        return GF2NGEN;
        !           286:                }
        !           287:        } else
        !           288:                return ( c );
        !           289: }
        !           290:
        !           291: static int skipspace() {
        !           292:        int c,c1;
        !           293:
        !           294:        for ( c = Getc(); ; )
        !           295:                switch ( c ) {
        !           296:                        case ' ': case '\t':
        !           297:                                c = Getc(); break;
        !           298:                        case '\n':
        !           299:                                c = afternl();  break;
        !           300:                        case '/':
        !           301:                                if ( (c1 = Getc()) == '*' )
        !           302:                                        c = aftercomment();
        !           303:                                else {
        !           304:                                        Ungetc(c1); return c;
        !           305:                                }
        !           306:                                break;
        !           307:                        default:
        !           308:                                return c; break;
        !           309:                }
        !           310: }
        !           311:
        !           312: int afternl() {
        !           313:        int c,ac,i,quote;
        !           314:        char *ptr;
        !           315:        char *av[BUFSIZ];
        !           316:        static int ilevel = 0;
        !           317:        char buf[BUFSIZ];
        !           318:
        !           319:        if ( !ilevel )
        !           320:                asir_infile->ln++;
        !           321:        while ( (c = Getc()) == '#' ) {
        !           322:                Gets(buf);
        !           323:                for ( quote = 0, ptr = buf; *ptr; ptr++ )
        !           324:                        if ( *ptr == '"' )
        !           325:                                quote = quote ? 0 : 1;
        !           326:                        else if ( quote && (*ptr == ' ') )
        !           327:                                *ptr = '_';
        !           328:                stoarg(buf,&ac,av);
        !           329:                if ( ac == 3 )
        !           330:                        if ( (i = atoi(av[2])) == 1 )
        !           331:                                ilevel++;
        !           332:                        else if ( i == 2 )
        !           333:                                ilevel--;
        !           334:                if ( !ilevel )
        !           335:                        asir_infile->ln = atoi(av[0]);
        !           336:        }
        !           337:        return c;
        !           338: }
        !           339:
        !           340: int aftercomment() {
        !           341:        int c,c1;
        !           342:
        !           343:        for ( c = Getc(); ; ) {
        !           344:                c1 = Getc();
        !           345:                if ( (c == '*') && (c1 == '/') )
        !           346:                        return Getc();
        !           347:                else
        !           348:                        c = c1;
        !           349:        }
        !           350: }
        !           351:
        !           352: int myatoi(s)
        !           353: char *s;
        !           354: {
        !           355:        int i,r;
        !           356:        for ( i = 0, r = 0; i < DLENGTH; i++ ) r = r * 10 + ( s[i] - '0' );
        !           357:        return ( r );
        !           358: }
        !           359:
        !           360: extern int ox_do_copy;
        !           361:
        !           362: void yyerror(s)
        !           363: char *s;
        !           364: {
        !           365:        if ( main_parser )
        !           366:                if ( ox_do_copy ) {
        !           367:                        /* push errors to DebugStack */
        !           368:                } else {
        !           369:                        if ( asir_infile->fp == stdin )
        !           370:                                fprintf(stderr,"%s\n",s);
        !           371:                        else
        !           372:                                fprintf(stderr,"\"%s\", near line %d: %s\n",asir_infile->name,asir_infile->ln,s);
        !           373:                }
        !           374:        else
        !           375:                fprintf(stderr,"exprparse : %s\n",s);
        !           376: }
        !           377:
        !           378: int echoback;
        !           379:
        !           380: extern int read_exec_file, do_fep, do_file;
        !           381:
        !           382: int readline_getc();
        !           383: void readline_ungetc();
        !           384: int Egetc();
        !           385: void Eungetc();
        !           386:
        !           387: unsigned char encrypt_char(unsigned char);
        !           388: unsigned char decrypt_char(unsigned char);
        !           389:
        !           390: int Egetc(fp)
        !           391: FILE *fp;
        !           392: {
        !           393:        int c;
        !           394:
        !           395:        if ( fp ) {
        !           396:                c = getc(fp);
        !           397:                if ( c == EOF )
        !           398:                        return c;
        !           399:                if ( asir_infile->encoded )
        !           400:                        c = decrypt_char((unsigned char)c);
        !           401:                return c;
        !           402:        } else {
        !           403:                c = *parse_strp++;
        !           404:                if ( !c )
        !           405:                        return EOF;
        !           406:                else
        !           407:                        return c;
        !           408:        }
        !           409: }
        !           410:
        !           411: void Eungetc(c,fp)
        !           412: int c;
        !           413: FILE *fp;
        !           414: {
        !           415:        if ( fp ) {
        !           416:                if ( asir_infile->encoded )
        !           417:                        c = (int)encrypt_char((unsigned char)c);
        !           418:                ungetc(c,fp);
        !           419:        } else
        !           420:                *--parse_strp = c;
        !           421: }
        !           422:
        !           423: static int Getc() {
        !           424:        int c;
        !           425:
        !           426:        if ( main_parser ) {
        !           427:                while ( 1 ) {
        !           428:                        if ((c = Egetc(asir_infile->fp)) == EOF)
        !           429:                                if ( NEXT(asir_infile) ) {
        !           430:                                        closecurrentinput();
        !           431:                                        c = Getc();
        !           432:                                        break;
        !           433:                                } else if ( read_exec_file || do_file )
        !           434:                                        asir_terminate(2);
        !           435:                                else {
        !           436:                                        if ( asir_infile->fp )
        !           437:                                                clearerr(asir_infile->fp);
        !           438:                                }
        !           439:                        else
        !           440:                                break;
        !           441:                }
        !           442:                if ( echoback )
        !           443:                        fputc(c,asir_out);
        !           444:        } else
        !           445:                c = *parse_strp++;
        !           446:        return ( c );
        !           447: }
        !           448:
        !           449: static void Ungetc(c) {
        !           450:        if ( main_parser ) {
        !           451:                Eungetc(c,asir_infile->fp);
        !           452:                if ( echoback )
        !           453:                        fputc('',asir_out);
        !           454:        } else
        !           455:                *--parse_strp = c;
        !           456: }
        !           457:
        !           458: static void Gets(s)
        !           459: char *s;
        !           460: {
        !           461:        int c;
        !           462:
        !           463:        while ( (c = Getc()) != '\n' )
        !           464:                *s++ = c;
        !           465:        *s = 0;
        !           466: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>