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

Annotation of OpenXM/src/kan96xx/Kan/scanner2.c, Revision 1.1.1.1

1.1       maekawa     1: /*  scanner2.c (SM StackMachine) */
                      2: /* export: struct tokens decompostToTokens(char *str,int *sizep);
                      3:    scanner2.c is for getting tokens from a string.
                      4: */
                      5: #include <stdio.h>
                      6: #include "datatype.h"
                      7: #include "stackm.h"
                      8: struct tokens lookupTokens(struct tokens t);
                      9: int isLiteral(char *s);
                     10: struct object lookupLiteralString(char *s);
                     11: /****************  defined in stackm.h ****************************
                     12: typedef enum {INIT,GET,PUT,OPEN} actionType;
                     13:
                     14: struct tokens{
                     15:   char *token;
                     16:   int kind;
                     17: };
                     18:
                     19:
                     20: #define ID   2
                     21: #define DOLLAR 3    strings enclosed by dollar sign
                     22: #define EXECUTABLE_STRING 4  strings enclosed by {}
                     23: #define EXECUTABLE_ARRAY  8  Don't set it in this file.
                     24: ******************************************************************/
                     25:
                     26:
                     27: /*******   declaration-part of lexical analizer ********************/
                     28: #define mygetchar()  getSM()
                     29: /* to use getSM()  ( input from StringSM ),
                     30:    setup  StringSM;
                     31:    getokenSM(INIT);
                     32: */
                     33:
                     34:
                     35:
                     36:
                     37: #define BUF0LIMIT 40000
                     38: static char *StringSM;
                     39: static int StrpSM = 0;
                     40: static char BufSMorg[BUF0LIMIT];
                     41: static char *BufSM = BufSMorg;
                     42: static int Buf0limit = BUF0LIMIT ;
                     43: static int ExistSM = 0;
                     44: static int TypeSM = ID;
                     45:
                     46: /****************  end of declaration part of lexical analizer ******/
                     47:
                     48: static int getSM();
                     49: static putSM();
                     50: static struct tokens flushSM();
                     51: static isSpaceSM();
                     52: static isDollarSM();
                     53: static isBraceSM();
                     54: static isKakkoSM();
                     55: static isSymbolSM();
                     56: static struct tokens getokenSM2();
                     57:
                     58: /****************  code part of lexical analizer ********************/
                     59:
                     60: struct tokens *decomposeToTokens(str,sizep)
                     61: char *str;
                     62: int *sizep;
                     63: {
                     64:   struct tokens *tArray;
                     65:   struct tokens token;
                     66:   int k;
                     67:   int size;
                     68:
                     69:   StringSM = (char *) sGC_malloc((strlen(str)+3)*sizeof(char));
                     70:   if (StringSM == (char *)NULL) {
                     71:     errorScanner2("I have no memormy.");
                     72:   }
                     73:   strcpy(StringSM,str);
                     74:   getokenSM2(INIT);
                     75:   size = 0;
                     76:   token = getokenSM2(GET);
                     77:   while (token.kind != -1) {
                     78:     size++;
                     79:     token = getokenSM2(GET);
                     80:   }
                     81:
                     82:   tArray = (struct tokens *)sGC_malloc((size+1)*sizeof(struct tokens));
                     83:   strcpy(StringSM,str);
                     84:   getokenSM2(INIT);
                     85:   for (k=0; k<size; k++) {
                     86:     tArray[k] = getokenSM2(GET);
                     87:   }
                     88:
                     89:   *sizep = size;
                     90:   return(tArray);
                     91: }
                     92:
                     93:
                     94:
                     95: static int getSM()
                     96: /* get a letter from StringSM */
                     97: {
                     98:   int c;
                     99:   c = StringSM[StrpSM++];
                    100:   if (c == '\0') {
                    101:     StrpSM--;return(EOF);
                    102:   } else return(c);
                    103: }
                    104:
                    105: static putSM(c)
                    106: int c;
                    107: /* put a letter on BufSM */
                    108: {
                    109:   char *new; int i;
                    110:   BufSM[ExistSM++] = ((c=='\n')? ' ' : c);
                    111:   if (ExistSM >= Buf0limit-1)  {
                    112:     new = (char *) sGC_malloc(sizeof(char *)*Buf0limit*2) ;
                    113:     if (new == (char *)NULL) {
                    114:       fprintf(stderr,"No more memory in parserpass0.c\n");
                    115:       exit(18);
                    116:     }
                    117:     fprintf(stderr,"\nSystem Message: Increasing BufSM to %d in scanner2.c\n",Buf0limit*2);
                    118:     for (i=0; i<Buf0limit; i++) {
                    119:       new[i] = BufSM[i];
                    120:     }
                    121:     BufSM = new; Buf0limit *= 2;
                    122:   }
                    123: }
                    124:
                    125: static struct tokens flushSM()
                    126: {
                    127:   char *token;
                    128:   struct tokens r;
                    129:   if (ExistSM<=0) {
                    130:     fprintf(stderr,"\n flushSM() is called without data. Don't use the empty string $$. \n");
                    131:     r.token = (char *)NULL; r.kind = -10; /* -1 ==> -10 ***/
                    132:     return(r);
                    133:   }
                    134:   BufSM[ExistSM] = '\0';
                    135:   ExistSM = 0;
                    136:   token = (char *)sGC_malloc((strlen(BufSM)+1)*sizeof(char));
                    137:   strcpy(token,BufSM);
                    138:   r.token = token;
                    139:   r.kind = TypeSM;
                    140:   if (r.kind == ID) {
                    141:     if (isLiteral(r.token)) {
                    142:        r.object = lookupLiteralString(r.token);
                    143:     }else{
                    144:       r = lookupTokens(r); /* Compute hashing values */
                    145:     }
                    146:   }
                    147:   return(r);
                    148: }
                    149:
                    150: static isSpaceSM(c)
                    151: int c;
                    152: {
                    153:   if ((c <= ' ') && (c!= EOF)) return(1);
                    154:   else return(0);
                    155: }
                    156:
                    157: static isDollarSM(c)
                    158: int c;
                    159: {
                    160:   if (c == '$') return(1);
                    161:   else return(0);
                    162: }
                    163:
                    164: static isBraceSM(c)
                    165: int c;
                    166: {
                    167:   if (c == '{') return(1);
                    168:   else return(0);
                    169: }
                    170:
                    171: static isKakkoSM(c)
                    172: int c;
                    173: {
                    174:   if (c == '(') return(1);
                    175:   else return(0);
                    176: }
                    177:
                    178: static isSymbolSM(c)
                    179: int c;
                    180: {
                    181:   if ((c == '{') ||
                    182:       (c == '}') ||
                    183:       (c == '[') ||
                    184:       (c == ']') ||
                    185:       (c == '(') ||
                    186:       (c == ')'))
                    187:     return(1);
                    188:   else return(0);
                    189: }
                    190:
                    191: static struct tokens getokenSM2(kind,str)
                    192: actionType kind;
                    193: char *str;
                    194: {
                    195:   static int c;
                    196:   static struct tokens rnull;
                    197:   int level;
                    198:
                    199:   if (kind == INIT) {
                    200:     StrpSM = 0;
                    201:     ExistSM = 0;
                    202:
                    203:     c = mygetchar();
                    204:     rnull.token = (char *)NULL; rnull.kind = -1;
                    205:     return(rnull);
                    206:   }
                    207:
                    208:
                    209:
                    210:   for (;;) {
                    211:     TypeSM = ID;
                    212:     if (c == EOF) {
                    213:       if (ExistSM) return(flushSM());
                    214:       else return(rnull);
                    215:     } else if (isSpaceSM(c)) {
                    216:       if (ExistSM) {
                    217:        c = mygetchar(); return(flushSM());
                    218:       }else {
                    219:        while (isSpaceSM(c=mygetchar())) ;
                    220:       }
                    221:     } else if (isDollarSM(c)) { /* output contents in dollar signs. */
                    222:       if (ExistSM) return(flushSM());
                    223:       else {
                    224:        c = mygetchar();
                    225:        while ((c != EOF) && (c != '$')) {
                    226:          putSM(c);
                    227:          c = mygetchar();
                    228:        }
                    229:        if (c=='$') c=mygetchar();
                    230:        TypeSM = DOLLAR;
                    231:        return(flushSM());
                    232:       }
                    233:     } else if (isBraceSM(c)) { /* output contents in { }  */
                    234:       /*  { {  } } */
                    235:       level = 0;
                    236:       if (ExistSM) return(flushSM());
                    237:       else {
                    238:        c = mygetchar();
                    239:        while (1) {
                    240:          if (c == '%') { /* skip the comment in the brace. */
                    241:            while (((c=mygetchar()) != '\n') && (c != EOF))  ;
                    242:          }
                    243:          if (c == EOF) break;
                    244:          if ((c == '}') && (level <= 0)) break;
                    245:          if ( c == '{') ++level;
                    246:          if ( c == '}') --level;
                    247:          putSM(c);
                    248:          c = mygetchar();
                    249:        }
                    250:        if (c=='}') c=mygetchar();
                    251:        TypeSM = EXECUTABLE_STRING;
                    252:        return(flushSM());
                    253:       }
                    254:     } else if (isKakkoSM(c)) { /* output contents in (  )  */
                    255:       level = 0;
                    256:       if (ExistSM) return(flushSM());
                    257:       else {
                    258:        c = mygetchar();
                    259:        while (1) {
                    260:          if (c == EOF) break;
                    261:          if (c == '\\') { /* e.g. \(  */
                    262:            putSM(c);
                    263:            c = mygetchar();
                    264:            if (c == EOF) break;
                    265:          }else{
                    266:            if ((c == ')') && (level <= 0)) break;
                    267:            if ( c == '(') ++level;
                    268:            if ( c == ')') --level;
                    269:          }
                    270:          putSM(c);
                    271:          c = mygetchar();
                    272:        }
                    273:        if (c==')') c=mygetchar();
                    274:        TypeSM = DOLLAR;
                    275:        return(flushSM());
                    276:       }
                    277:     } else if (c=='%') { /* comment */
                    278:       while (((c=mygetchar()) != '\n') && (c != EOF))  ;
                    279:       if(ExistSM) return(flushSM());
                    280:     } else if (isSymbolSM(c)) { /* symbols. {,} etc */
                    281:       if(ExistSM) return(flushSM());
                    282:       else {
                    283:        putSM(c);
                    284:        c = mygetchar();
                    285:        return(flushSM());
                    286:       }
                    287:     } else { /* identifier */
                    288:       putSM(c);
                    289:       c =mygetchar();
                    290:       while ((!isDollarSM(c)) &&
                    291:             (!isSpaceSM(c))  &&
                    292:             (!isSymbolSM(c)) &&
                    293:             (c != EOF)) {
                    294:        putSM(c);
                    295:        c = mygetchar();
                    296:       }
                    297:       return(flushSM());
                    298:     }
                    299:   }
                    300: }
                    301:
                    302: /*********** end of code part of lexical analizer ********************/
                    303:
                    304:
                    305: errorScanner2(str)
                    306: char *str;
                    307: {
                    308:   fprintf(stderr,"Error (scanner2.c): %s\n",str);
                    309:   exit(10);
                    310: }
                    311:

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