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

Diff for /OpenXM/src/kan96xx/Kan/scanner.c between version 1.3 and 1.11

version 1.3, 2000/03/20 01:53:46 version 1.11, 2020/10/06 11:33:47
Line 1 
Line 1 
 /*$OpenXM: OpenXM/src/kan96xx/Kan/scanner.c,v 1.2 1999/11/18 08:08:24 takayama Exp $*/  /*$OpenXM: OpenXM/src/kan96xx/Kan/scanner.c,v 1.10 2018/09/07 00:15:44 takayama Exp $*/
 /*  scanner.c (SM StackMachine) */  /*  scanner.c (SM StackMachine) */
 /* export: struct tokens getokenSM(actionType kind,char *str);  /* export: struct tokens getokenSM(actionType kind,char *str);
    scanner.c is used to get tokens from streams.     scanner.c is used to get tokens from streams.
    files: none     files: none
 */  */
 #include <stdio.h>  #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
 #include "datatype.h"  #include "datatype.h"
 #include "stackm.h"  #include "stackm.h"
 struct tokens lookupTokens(struct tokens t);  struct tokens lookupTokens(struct tokens t);
Line 60  static int FileStackP = 0;
Line 62  static int FileStackP = 0;
 /****************  end of declaration part of lexical analizer ******/  /****************  end of declaration part of lexical analizer ******/
   
 static int getSM();  static int getSM();
 static putSM();  static void putSM();
 static struct tokens flushSM();  static struct tokens flushSM();
 static isSpaceSM();  static int isSpaceSM();
 static isDollarSM();  static int isDollarSM();
 static isBraceSM();  static int isBraceSM();
 static isKakkoSM();  static int isKakkoSM();
 static isSymbolSM();  static int isSymbolSM();
 static mygetchar();  static int mygetchar();
 static myungetchar();  static int myungetchar();
   
   int ScannerWhich = 0;
   unsigned char ScannerBuf[SCANNERBUF_SIZE];
   int ScannerPt = 0;
   
 /*  /*
 static mygetchar()  static mygetchar()
 {  {
   
   return( getc(Cfp) );    return( getc(Cfp) );
 }  }
 */  */
   
 static mygetchar()  static int mygetchar()
 { int c;  { int c;
   if (EchoInScanner) {    c = getc(Cfp);
     c = getc(Cfp);    if (c > 0) { /* ungetchar is ignored */
     if (c==EOF) {      ScannerPt++; if (ScannerPt >= SCANNERBUF_SIZE) ScannerPt = 0;
       printf("\n%% EOF of file %x\n",(int) Cfp);      ScannerBuf[ScannerPt] = c;
     }else{  
       printf("%c",c);  
     }  
     return( c );  
   }else{  
     return( getc(Cfp) );  
   }    }
    if (EchoInScanner) {
      if (c==EOF) {
        printf("\n%% EOF of file %p\n",Cfp);
      }else{
        printf("%c",c);
      }
      return( c );
    }else{
      return( c );
    }
 }  }
   
   
 static myungetchar(c)  static int myungetchar(c)
 int c;       int c;
 {  {
   return( ungetc(c,Cfp) );    return( ungetc(c,Cfp) );
 }  }
   
 /****************  code part of lexical analizer ********************/  /****************  code part of lexical analizer ********************/
 static int getSM()  static int getSM()
 /* get a letter from StringSM */       /* get a letter from StringSM */
 {  {
   int c;    int c;
   
     if ((StrpSM > 0) && (StringSM[StrpSM] == ',') && (StringSM[StrpSM-1] == ',')) {  int i;
           fprintf(stderr,"Warning: ,, is found.");
           for (i=(StrpSM-30>0?StrpSM-30:0); i<=StrpSM; i++) {
             fprintf(stderr,"%c",StringSM[i]);
           }
           fprintf(stderr,"\n");
     }
   
   c = StringSM[StrpSM++];    c = StringSM[StrpSM++];
   if (c == '\0') {    if (c == '\0') {
     StrpSM--;return(EOF);      StrpSM--;return(EOF);
   } else return(c);    } else return(c);
 }  }
   
 static putSM(c)  static void putSM(c)
 int c;       int c;
 /* put a letter on BufSM */       /* put a letter on BufSM */
 {  {
   char *new; int i;    char *new; int i;
   BufSM[ExistSM++] = ((c=='\n')? ' ' : c);    BufSM[ExistSM++] = ((c=='\n')? ' ' : c);
Line 146  static struct tokens flushSM()
Line 165  static struct tokens flushSM()
   strcpy(token,BufSM);    strcpy(token,BufSM);
   r.token = token;    r.token = token;
   r.kind = TypeSM;    r.kind = TypeSM;
     r.tflag = 0;
   if (r.kind == ID) {    if (r.kind == ID) {
     if (isLiteral(r.token)) {      if (isLiteral(r.token)) {
       r.object = lookupLiteralString(r.token);        r.object = lookupLiteralString(r.token);
Line 156  static struct tokens flushSM()
Line 176  static struct tokens flushSM()
   return(r);    return(r);
 }  }
   
 static isSpaceSM(c)  static int isSpaceSM(c)
 int c;       int c;
 {  {
   if ((c <= ' ') && (c!= EOF)) return(1);    if (((c <= ' ') || c == ',') && (c!= EOF)) return(1);
   else return(0);    else return(0);
 }  }
   
 static isDollarSM(c)  static int isDollarSM(c)
 int c;       int c;
 {  {
   if (c == '$') return(1);    if (c == '$') return(1);
   else return(0);    else return(0);
 }  }
   
 static isBraceSM(c)  static int isBraceSM(c)
 int c;       int c;
 {  {
   if (c == '{') return(1);    if (c == '{') return(1);
   else return(0);    else return(0);
 }  }
   
 static isKakkoSM(c)  static int isKakkoSM(c)
 int c;       int c;
 {  {
   if (c == '(') return(1);    if (c == '(') return(1);
   else return(0);    else return(0);
 }  }
   
 static isSymbolSM(c)  static int isSymbolSM(c)
 int c;       int c;
 {  {
   if ((c == '{') ||    if ((c == '{') ||
       (c == '}') ||        (c == '}') ||
Line 198  int c;
Line 218  int c;
 }  }
   
 struct tokens getokenSM(kind,str)  struct tokens getokenSM(kind,str)
 actionType kind;       actionType kind;
 char *str;       char *str;
 {  {
   static int c;    static int c;
   static struct tokens rnull;    static struct tokens rnull;
Line 207  char *str;
Line 227  char *str;
   char fname[1024];    char fname[1024];
   
   if (kind == INIT) {    if (kind == INIT) {
       ScannerWhich = 2;
       ScannerPt = 0;
       ScannerBuf[0] = 0;
   
     StrpSM = 0;      StrpSM = 0;
     ExistSM = 0;      ExistSM = 0;
   
Line 215  char *str;
Line 239  char *str;
   
     myungetchar('\n'); /* dummy */      myungetchar('\n'); /* dummy */
     c = mygetchar();  /* Notice that you need at least on input to return      c = mygetchar();  /* Notice that you need at least on input to return
                          from the getokenSM(INIT); ^^^^^^^^*/                           from the getokenSM(INIT); ^^^^^^^^*/
     rnull.token = (char *)NULL; rnull.kind = -1;      rnull.token = (char *)NULL; rnull.kind = -1;
     return(rnull);      return(rnull);
   }    }
Line 234  char *str;
Line 258  char *str;
     }else {      }else {
       Cfp = fopen(str,"r");        Cfp = fopen(str,"r");
       if (EchoInScanner)        if (EchoInScanner)
         printf("\n%% I open the file %s.\n",str);          printf("\n%% I open the file %s.\n",str);
       if (Cfp == (FILE *)NULL) {        if (Cfp == (FILE *)NULL) {
   
         strcpy(fname,getLOAD_SM1_PATH());          strcpy(fname,getLOAD_SM1_PATH());
         strcat(fname,str);          strcat(fname,str);
         Cfp = fopen(fname,"r");          Cfp = fopen(fname,"r");
         if (Cfp == (FILE *)NULL) {          if (Cfp == (FILE *)NULL) {
           strcpy(fname,LOAD_SM1_PATH);            strcpy(fname,LOAD_SM1_PATH);
           strcat(fname,str);            strcat(fname,str);
           Cfp = fopen(fname,"r");            Cfp = fopen(fname,"r");
           if (Cfp == (FILE *)NULL) {            if (Cfp == (FILE *)NULL) {
             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);              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);
   
             Cfp = FileStack[--FileStackP];              Cfp = FileStack[--FileStackP];
             fprintf(stderr,"\nWarning: I could not  open the file %s\n",str);              fprintf(stderr,"\nWarning: I could not  open the file %s\n",str);
             c = mygetchar();              c = mygetchar();
             rnull.kind = -3;              rnull.kind = -3;
             return(rnull); /* error */              return(rnull); /* error */
           }else{            }else{
             c = mygetchar(); /* input from the new file */              c = mygetchar(); /* input from the new file */
             return(rnull);              return(rnull);
           }            }
         }else{          }else{
           c = mygetchar(); /* input from the new file */            c = mygetchar(); /* input from the new file */
           return(rnull);            return(rnull);
         }          }
       }else{        }else{
         c = mygetchar(); /* input from the new file */          c = mygetchar(); /* input from the new file */
         return(rnull);          return(rnull);
       }        }
     }      }
   }    }
Line 271  char *str;
Line 295  char *str;
     TypeSM = ID;      TypeSM = ID;
     if (c == EOF) {      if (c == EOF) {
       if (FileStackP <= 0) {        if (FileStackP <= 0) {
         if (ExistSM) return(flushSM());          if (ExistSM) return(flushSM());
         else return(rnull);          else return(rnull);
       }else { /* return to the previous file */        }else { /* return to the previous file */
         fclose(Cfp); /* close the file */          fclose(Cfp); /* close the file */
         Cfp = FileStack[--FileStackP];          Cfp = FileStack[--FileStackP];
         c = mygetchar(Cfp);          c = mygetchar(Cfp);
       }        }
     } else if (isSpaceSM(c)) {      } else if (isSpaceSM(c)) {
       if (ExistSM) {        if (ExistSM) {
         c = mygetchar(); return(flushSM());          c = mygetchar(); return(flushSM());
       }else {        }else {
         while (isSpaceSM(c=mygetchar())) ;          while (isSpaceSM(c=mygetchar())) ;
       }        }
     } else if (isDollarSM(c)) { /* output contents in dollar signs. */      } else if (isDollarSM(c)) { /* output contents in dollar signs. */
       if (ExistSM) return(flushSM());        if (ExistSM) return(flushSM());
       else {        else {
         c = mygetchar();          c = mygetchar();
         while ((c != EOF) && (c != '$')) {          while ((c != EOF) && (c != '$')) {
           putSM(c);            putSM(c);
           c = mygetchar();            c = mygetchar();
         }          }
         if (c=='$') c=mygetchar();          if (c=='$') c=mygetchar();
         TypeSM = DOLLAR;          TypeSM = DOLLAR;
         return(flushSM());          return(flushSM());
       }        }
     } else if (isBraceSM(c)) { /* output contents in { }  */      } else if (isBraceSM(c)) { /* output contents in { }  */
       /*  { {  } } */        /*  { {  } } */
       level = 0;        level = 0;
       if (ExistSM) return(flushSM());        if (ExistSM) return(flushSM());
       else {        else {
         c = mygetchar();          c = mygetchar();
         while (1) {          while (1) {
           if (c == '%') { /* skip the comment in the brace. */            if (c == '%') { /* skip the comment in the brace. */
             while (((c=mygetchar()) != '\n') && (c != EOF))  ;              while (((c=mygetchar()) != '\n') && (c != EOF))  ;
           }            }
           if (c == EOF) break;            if (c == EOF) break;
           if ((c == '}') && (level <= 0)) break;            if ((c == '}') && (level <= 0)) break;
           if ( c == '{') ++level;            if ( c == '{') ++level;
           if ( c == '}') --level;            if ( c == '}') --level;
           putSM(c);            putSM(c);
           c = mygetchar();            c = mygetchar();
         }          }
         if (c=='}') c=mygetchar();          if (c=='}') c=mygetchar();
         TypeSM = EXECUTABLE_STRING;          TypeSM = EXECUTABLE_STRING;
         return(flushSM());          return(flushSM());
       }        }
     } else if (isKakkoSM(c)) { /* output contents in (  )  */      } else if (isKakkoSM(c)) { /* output contents in (  )  */
       level = 0;        level = 0;
       if (ExistSM) return(flushSM());        if (ExistSM) return(flushSM());
       else {        else {
         c = mygetchar();          c = mygetchar();
         while (1) {          while (1) {
           if (c == EOF) break;            if (c == EOF) break;
           if (c == '\\') { /* e.g. \(  */            if (c == '\\') { /* e.g. \(  */
             putSM(c);              putSM(c);
             c = mygetchar();              c = mygetchar();
             if (c == EOF) break;              if (c == EOF) break;
           }else{            }else{
             if ((c == ')') && (level <= 0)) break;              if ((c == ')') && (level <= 0)) break;
             if ( c == '(') ++level;              if ( c == '(') ++level;
             if ( c == ')') --level;              if ( c == ')') --level;
           }            }
           putSM(c);            putSM(c);
           c = mygetchar();            c = mygetchar();
         }          }
         if (c==')') c=mygetchar();          if (c==')') c=mygetchar();
         TypeSM = DOLLAR;          TypeSM = DOLLAR;
         return(flushSM());          return(flushSM());
       }        }
     } else if (c=='%') { /* comment */      } else if (c=='%') { /* comment */
       while (((c=mygetchar()) != '\n') && (c != EOF))  ;        while (((c=mygetchar()) != '\n') && (c != EOF))  ;
Line 346  char *str;
Line 370  char *str;
     } else if (isSymbolSM(c)) { /* symbols. {,} etc */      } else if (isSymbolSM(c)) { /* symbols. {,} etc */
       if(ExistSM) return(flushSM());        if(ExistSM) return(flushSM());
       else {        else {
         putSM(c);          putSM(c);
         c = mygetchar();          c = mygetchar();
         return(flushSM());          return(flushSM());
       }        }
     } else { /* identifier */      } else { /* identifier */
       putSM(c);        putSM(c);
       c =mygetchar();        c =mygetchar();
       while ((!isDollarSM(c)) &&        while ((!isDollarSM(c)) &&
              (!isSpaceSM(c))  &&               (!isSpaceSM(c))  &&
              (!isSymbolSM(c)) &&               (!isSymbolSM(c)) &&
              (c != EOF)) {               (c != EOF)) {
         putSM(c);          putSM(c);
         c = mygetchar();          c = mygetchar();
       }        }
       return(flushSM());        return(flushSM());
     }      }
Line 392  main() {
Line 416  main() {
 char *getLOAD_SM1_PATH() {  char *getLOAD_SM1_PATH() {
   char *p;    char *p;
   char *p2;    char *p2;
   char *getenv(char *s);    char *getenv(const char *s);
   p = getenv("LOAD_SM1_PATH");    p = getenv("LOAD_SM1_PATH");
   if (p == NULL) {    if (p == NULL) {
     p = getenv("OpenXM_HOME");      p = getenv("OpenXM_HOME");
Line 403  char *getLOAD_SM1_PATH() {
Line 427  char *getLOAD_SM1_PATH() {
       p2 = (char *) sGC_malloc(sizeof(char)*(strlen(p)+strlen("/lib/sm1/")+3));        p2 = (char *) sGC_malloc(sizeof(char)*(strlen(p)+strlen("/lib/sm1/")+3));
       if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); }        if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); }
       if (p[strlen(p)-1] != '/') {        if (p[strlen(p)-1] != '/') {
         strcpy(p2,p); strcat(p2,"/lib/sm1/");          strcpy(p2,p); strcat(p2,"/lib/sm1/");
       }else{        }else{
         strcpy(p2,p); strcat(p2,"lib/sm1/");          strcpy(p2,p); strcat(p2,"lib/sm1/");
       }        }
       return(p2);        return(p2);
     }      }
Line 418  char *getLOAD_SM1_PATH() {
Line 442  char *getLOAD_SM1_PATH() {
     strcpy(p2,p); strcat(p2,"/");      strcpy(p2,p); strcat(p2,"/");
     return(p2);      return(p2);
   }    }
   }
   
   char *traceShowScannerBuf() {
     char *s;
     int i,k;
     s = NULL;
     /*
     printf("ScannerPt=%d\n",ScannerPt);
     for (i=0; i<SCANNERBUF_SIZE; i++) {
           printf("%x ",(int) (ScannerBuf[i]));
     }
     printf("\n");  fflush(NULL); sleep(10);
     */
     if ((ScannerPt == 0) && (ScannerBuf[0] == 0)) {
       s = sGC_malloc(1); s[0] = 0;
       return s;
     }
     if ((ScannerPt > 0) && (ScannerBuf[0] == 0)) {
       s = sGC_malloc(ScannerPt+1);
       for (i=1; i<=ScannerPt; i++) {
         s[i-1] = ScannerBuf[i]; s[i] = 0;
       }
       return s;
     }
     if (ScannerBuf[0] != 0) {
       s = sGC_malloc(SCANNERBUF_SIZE+1);
       k = ScannerPt+1;
       if (k >= SCANNERBUF_SIZE) k = 0;
       for (i=0; i<SCANNERBUF_SIZE; i++) {
         s[i] = ScannerBuf[k]; s[i+1] = 0;
         k++; if (k >= SCANNERBUF_SIZE) k = 0;
       }
       return s;
     }
     return s;
 }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.11

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