[BACK]Return to scanner.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Annotation of OpenXM/src/kan96xx/Kan/scanner.c, Revision 1.1

1.1     ! maekawa     1: /*  scanner.c (SM StackMachine) */
        !             2: /* export: struct tokens getokenSM(actionType kind,char *str);
        !             3:    scanner.c is used to get tokens from streams.
        !             4:    files: none
        !             5: */
        !             6: #include <stdio.h>
        !             7: #include "datatype.h"
        !             8: #include "stackm.h"
        !             9: struct tokens lookupTokens(struct tokens t);
        !            10: int isLiteral(char *s);
        !            11: struct object lookupLiteralString(char *s);
        !            12: char *getLOAD_SM1_PATH();
        !            13: /****************  defined in stackm.h ****************************
        !            14: typedef enum {INIT,GET,PUT,OPEN} actionType;
        !            15:
        !            16: struct tokens{
        !            17:   char *token;
        !            18:   int kind;
        !            19: };
        !            20:
        !            21:
        !            22: #define ID   2
        !            23: #define DOLLAR 3    strings enclosed by dollar sign
        !            24: #define EXECUTABLE_STRING 4  strings enclosed by {}
        !            25: #define EXECUTABLE_ARRAY  8  Don't set it in this file.
        !            26: ******************************************************************/
        !            27:
        !            28:
        !            29: /*******   declaration-part of lexical analizer ********************/
        !            30: /* #define mygetchar()  getSM() */
        !            31: /* to use getSM()  ( input from StringSM ),
        !            32:    setup  StringSM;
        !            33:    getokenSM(INIT);
        !            34: */
        !            35: /* to use getchar(),
        !            36:    getokenSM(INIT);
        !            37: */
        !            38:
        !            39:
        !            40:
        !            41: FILE *BaseFp = stdin;       /* file pointer of the first file. */
        !            42:
        !            43: int EchoInScanner = 0;      /* echo in scanner */
        !            44:
        !            45: #define BUF0LIMIT 20000
        !            46: static char *StringSM;
        !            47: static int StrpSM = 0;
        !            48: static char BufSMorg[BUF0LIMIT];
        !            49: static char *BufSM = BufSMorg;
        !            50: static int Buf0limit = BUF0LIMIT;
        !            51: static int ExistSM = 0;
        !            52: static int TypeSM = ID;
        !            53:
        !            54: #define FILESTACK_LIMIT 10
        !            55: static FILE * Cfp;         /* current input file pointer */
        !            56: static FILE * FileStack[FILESTACK_LIMIT];
        !            57: static int FileStackP = 0;
        !            58: /****************  end of declaration part of lexical analizer ******/
        !            59:
        !            60: static int getSM();
        !            61: static putSM();
        !            62: static struct tokens flushSM();
        !            63: static isSpaceSM();
        !            64: static isDollarSM();
        !            65: static isBraceSM();
        !            66: static isKakkoSM();
        !            67: static isSymbolSM();
        !            68: static mygetchar();
        !            69: static myungetchar();
        !            70:
        !            71:
        !            72: /*
        !            73: static mygetchar()
        !            74: {
        !            75:   return( getc(Cfp) );
        !            76: }
        !            77: */
        !            78:
        !            79: static mygetchar()
        !            80: { int c;
        !            81:   if (EchoInScanner) {
        !            82:     c = getc(Cfp);
        !            83:     if (c==EOF) {
        !            84:       printf("\n%% EOF of file %x\n",(int) Cfp);
        !            85:     }else{
        !            86:       printf("%c",c);
        !            87:     }
        !            88:     return( c );
        !            89:   }else{
        !            90:     return( getc(Cfp) );
        !            91:   }
        !            92: }
        !            93:
        !            94:
        !            95: static myungetchar(c)
        !            96: int c;
        !            97: {
        !            98:   return( ungetc(c,Cfp) );
        !            99: }
        !           100:
        !           101: /****************  code part of lexical analizer ********************/
        !           102: static int getSM()
        !           103: /* get a letter from StringSM */
        !           104: {
        !           105:   int c;
        !           106:   c = StringSM[StrpSM++];
        !           107:   if (c == '\0') {
        !           108:     StrpSM--;return(EOF);
        !           109:   } else return(c);
        !           110: }
        !           111:
        !           112: static putSM(c)
        !           113: int c;
        !           114: /* put a letter on BufSM */
        !           115: {
        !           116:   char *new; int i;
        !           117:   BufSM[ExistSM++] = ((c=='\n')? ' ' : c);
        !           118:   if (ExistSM >= Buf0limit-1)  {
        !           119:     new = (char *) sGC_malloc(sizeof(char *)*Buf0limit*2) ;
        !           120:     if (new == (char *)NULL) {
        !           121:       fprintf(stderr,"No more memory in parserpass0.c\n");
        !           122:       exit(18);
        !           123:     }
        !           124:     fprintf(stderr,"\nSystem Message: Increasing BufSM to %d in scanner.c\n",Buf0limit*2);
        !           125:     for (i=0; i<Buf0limit; i++) {
        !           126:       new[i] = BufSM[i];
        !           127:     }
        !           128:     BufSM = new; Buf0limit *= 2;
        !           129:   }
        !           130: }
        !           131:
        !           132: static struct tokens flushSM()
        !           133: {
        !           134:   char *token;
        !           135:   struct tokens r;
        !           136:   if (ExistSM<=0) {
        !           137:     fprintf(stderr,"\n flushSM() is called without data. Don't use the empty string $$. \n");
        !           138:     r.token = (char *)NULL; r.kind = -10; /* -1 ==> -10 */
        !           139:     return(r);
        !           140:   }
        !           141:   BufSM[ExistSM] = '\0';
        !           142:   ExistSM = 0;
        !           143:   token = (char *)sGC_malloc((strlen(BufSM)+1)*sizeof(char));
        !           144:   strcpy(token,BufSM);
        !           145:   r.token = token;
        !           146:   r.kind = TypeSM;
        !           147:   if (r.kind == ID) {
        !           148:     if (isLiteral(r.token)) {
        !           149:       r.object = lookupLiteralString(r.token);
        !           150:     }else{
        !           151:       r = lookupTokens(r); /* Compute hashing values */
        !           152:     }
        !           153:   }
        !           154:   return(r);
        !           155: }
        !           156:
        !           157: static isSpaceSM(c)
        !           158: int c;
        !           159: {
        !           160:   if ((c <= ' ') && (c!= EOF)) return(1);
        !           161:   else return(0);
        !           162: }
        !           163:
        !           164: static isDollarSM(c)
        !           165: int c;
        !           166: {
        !           167:   if (c == '$') return(1);
        !           168:   else return(0);
        !           169: }
        !           170:
        !           171: static isBraceSM(c)
        !           172: int c;
        !           173: {
        !           174:   if (c == '{') return(1);
        !           175:   else return(0);
        !           176: }
        !           177:
        !           178: static isKakkoSM(c)
        !           179: int c;
        !           180: {
        !           181:   if (c == '(') return(1);
        !           182:   else return(0);
        !           183: }
        !           184:
        !           185: static isSymbolSM(c)
        !           186: int c;
        !           187: {
        !           188:   if ((c == '{') ||
        !           189:       (c == '}') ||
        !           190:       (c == '[') ||
        !           191:       (c == ']') ||
        !           192:       (c == '(') ||
        !           193:       (c == ')'))
        !           194:     return(1);
        !           195:   else return(0);
        !           196: }
        !           197:
        !           198: struct tokens getokenSM(kind,str)
        !           199: actionType kind;
        !           200: char *str;
        !           201: {
        !           202:   static int c;
        !           203:   static struct tokens rnull;
        !           204:   int level;
        !           205:   char fname[1024];
        !           206:
        !           207:   if (kind == INIT) {
        !           208:     StrpSM = 0;
        !           209:     ExistSM = 0;
        !           210:
        !           211:     Cfp = BaseFp;  /* set the file name to BaseFp */
        !           212:     FileStackP = 0; /* Clear the file stack */
        !           213:
        !           214:     myungetchar('\n'); /* dummy */
        !           215:     c = mygetchar();  /* Notice that you need at least on input to return
        !           216:                         from the getokenSM(INIT); ^^^^^^^^*/
        !           217:     rnull.token = (char *)NULL; rnull.kind = -1;
        !           218:     return(rnull);
        !           219:   }
        !           220:
        !           221:   if (kind == OPEN) {
        !           222:     rnull.token = (char *)NULL; rnull.kind = -2;
        !           223:     /* -2: suceeded,  -3: fail */
        !           224:     myungetchar(c);
        !           225:     FileStack[FileStackP++] = Cfp;  /* push the current file */
        !           226:     if (FileStackP >= FILESTACK_LIMIT) {
        !           227:       fprintf(stderr,"\nError: I cannot open more than %d files.\n",FILESTACK_LIMIT);
        !           228:       FileStackP--;
        !           229:       c = mygetchar();
        !           230:       rnull.kind = -3;
        !           231:       return(rnull); /* error */
        !           232:     }else {
        !           233:       Cfp = fopen(str,"r");
        !           234:       if (EchoInScanner)
        !           235:        printf("\n%% I open the file %s.\n",str);
        !           236:       if (Cfp == (FILE *)NULL) {
        !           237:
        !           238:        strcpy(fname,getLOAD_SM1_PATH());
        !           239:        strcat(fname,str);
        !           240:        Cfp = fopen(fname,"r");
        !           241:        if (Cfp == (FILE *)NULL) {
        !           242:          strcpy(fname,LOAD_SM1_PATH);
        !           243:          strcat(fname,str);
        !           244:          Cfp = fopen(fname,"r");
        !           245:          if (Cfp == (FILE *)NULL) {
        !           246:            fprintf(stderr,"Warning: Cannot open the file <<%s>> for loading in the current directory nor the library directories %s and %s.\n",str,getLOAD_SM1_PATH(),LOAD_SM1_PATH);
        !           247:
        !           248:            Cfp = FileStack[--FileStackP];
        !           249:            fprintf(stderr,"\nWarning: I could not  open the file %s\n",str);
        !           250:            c = mygetchar();
        !           251:            rnull.kind = -3;
        !           252:            return(rnull); /* error */
        !           253:          }else{
        !           254:            c = mygetchar(); /* input from the new file */
        !           255:            return(rnull);
        !           256:          }
        !           257:        }else{
        !           258:          c = mygetchar(); /* input from the new file */
        !           259:          return(rnull);
        !           260:        }
        !           261:       }else{
        !           262:        c = mygetchar(); /* input from the new file */
        !           263:        return(rnull);
        !           264:       }
        !           265:     }
        !           266:   }
        !           267:
        !           268:   for (;;) {
        !           269:     TypeSM = ID;
        !           270:     if (c == EOF) {
        !           271:       if (FileStackP <= 0) {
        !           272:        if (ExistSM) return(flushSM());
        !           273:        else return(rnull);
        !           274:       }else { /* return to the previous file */
        !           275:        fclose(Cfp); /* close the file */
        !           276:        Cfp = FileStack[--FileStackP];
        !           277:        c = mygetchar(Cfp);
        !           278:       }
        !           279:     } else if (isSpaceSM(c)) {
        !           280:       if (ExistSM) {
        !           281:        c = mygetchar(); return(flushSM());
        !           282:       }else {
        !           283:        while (isSpaceSM(c=mygetchar())) ;
        !           284:       }
        !           285:     } else if (isDollarSM(c)) { /* output contents in dollar signs. */
        !           286:       if (ExistSM) return(flushSM());
        !           287:       else {
        !           288:        c = mygetchar();
        !           289:        while ((c != EOF) && (c != '$')) {
        !           290:          putSM(c);
        !           291:          c = mygetchar();
        !           292:        }
        !           293:        if (c=='$') c=mygetchar();
        !           294:        TypeSM = DOLLAR;
        !           295:        return(flushSM());
        !           296:       }
        !           297:     } else if (isBraceSM(c)) { /* output contents in { }  */
        !           298:       /*  { {  } } */
        !           299:       level = 0;
        !           300:       if (ExistSM) return(flushSM());
        !           301:       else {
        !           302:        c = mygetchar();
        !           303:        while (1) {
        !           304:          if (c == '%') { /* skip the comment in the brace. */
        !           305:            while (((c=mygetchar()) != '\n') && (c != EOF))  ;
        !           306:          }
        !           307:          if (c == EOF) break;
        !           308:          if ((c == '}') && (level <= 0)) break;
        !           309:          if ( c == '{') ++level;
        !           310:          if ( c == '}') --level;
        !           311:          putSM(c);
        !           312:          c = mygetchar();
        !           313:        }
        !           314:        if (c=='}') c=mygetchar();
        !           315:        TypeSM = EXECUTABLE_STRING;
        !           316:        return(flushSM());
        !           317:       }
        !           318:     } else if (isKakkoSM(c)) { /* output contents in (  )  */
        !           319:       level = 0;
        !           320:       if (ExistSM) return(flushSM());
        !           321:       else {
        !           322:        c = mygetchar();
        !           323:        while (1) {
        !           324:          if (c == EOF) break;
        !           325:          if (c == '\\') { /* e.g. \(  */
        !           326:            putSM(c);
        !           327:            c = mygetchar();
        !           328:            if (c == EOF) break;
        !           329:          }else{
        !           330:            if ((c == ')') && (level <= 0)) break;
        !           331:            if ( c == '(') ++level;
        !           332:            if ( c == ')') --level;
        !           333:          }
        !           334:          putSM(c);
        !           335:          c = mygetchar();
        !           336:        }
        !           337:        if (c==')') c=mygetchar();
        !           338:        TypeSM = DOLLAR;
        !           339:        return(flushSM());
        !           340:       }
        !           341:     } else if (c=='%') { /* comment */
        !           342:       while (((c=mygetchar()) != '\n') && (c != EOF))  ;
        !           343:       if(ExistSM) return(flushSM());
        !           344:     } else if (isSymbolSM(c)) { /* symbols. {,} etc */
        !           345:       if(ExistSM) return(flushSM());
        !           346:       else {
        !           347:        putSM(c);
        !           348:        c = mygetchar();
        !           349:        return(flushSM());
        !           350:       }
        !           351:     } else { /* identifier */
        !           352:       putSM(c);
        !           353:       c =mygetchar();
        !           354:       while ((!isDollarSM(c)) &&
        !           355:             (!isSpaceSM(c))  &&
        !           356:             (!isSymbolSM(c)) &&
        !           357:             (c != EOF)) {
        !           358:        putSM(c);
        !           359:        c = mygetchar();
        !           360:       }
        !           361:       return(flushSM());
        !           362:     }
        !           363:   }
        !           364: }
        !           365:
        !           366: /*********** end of code part of lexical analizer ********************/
        !           367:
        !           368: /*
        !           369: main() {
        !           370:   char input[1000];
        !           371:   struct tokens r;
        !           372:
        !           373:   getokenSM(INIT);
        !           374:   r = getokenSM(GET);
        !           375:   while (r.token != (char *)NULL) {
        !           376:     printf("%s     %d\n",r.token,r.kind);
        !           377:     r =getokenSM(GET);
        !           378:   }
        !           379:
        !           380: }
        !           381: */
        !           382:
        !           383: /*
        !           384:   gets(input);
        !           385:   StringSM = (char *)sGC_malloc((strlen(input)+2)*sizeof(char));
        !           386:   strcpy(StringSM,input);
        !           387:   getokenSM(INIT);
        !           388: */
        !           389:
        !           390: char *getLOAD_SM1_PATH() {
        !           391:   char *p;
        !           392:   char *p2;
        !           393:   char *getenv(char *s);
        !           394:   p = getenv("LOAD_SM1_PATH");
        !           395:   if (p == NULL) {
        !           396:     return("/usr/local/lib/sm1/");
        !           397:   }else{
        !           398:     if (strlen(p) == 0) return(p);
        !           399:     if (p[strlen(p)-1] == '/') return(p);
        !           400:     /* Add / */
        !           401:     p2 = (char *) sGC_malloc(sizeof(char)*(strlen(p)+3));
        !           402:     if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); }
        !           403:     strcpy(p2,p); strcat(p2,"/");
        !           404:     return(p2);
        !           405:   }
        !           406: }

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