=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/scanner2.c,v retrieving revision 1.2 retrieving revision 1.10 diff -u -p -r1.2 -r1.10 --- OpenXM/src/kan96xx/Kan/scanner2.c 2000/01/16 07:55:41 1.2 +++ OpenXM/src/kan96xx/Kan/scanner2.c 2020/10/06 11:33:47 1.10 @@ -1,27 +1,29 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/scanner2.c,v 1.9 2005/07/18 10:55:16 takayama Exp $ */ /* scanner2.c (SM StackMachine) */ /* export: struct tokens decompostToTokens(char *str,int *sizep); scanner2.c is for getting tokens from a string. */ #include +#include +#include #include "datatype.h" #include "stackm.h" struct tokens lookupTokens(struct tokens t); int isLiteral(char *s); struct object lookupLiteralString(char *s); /**************** defined in stackm.h **************************** -typedef enum {INIT,GET,PUT,OPEN} actionType; + typedef enum {INIT,GET,PUT,OPEN} actionType; -struct tokens{ - char *token; - int kind; -}; + struct tokens{ + char *token; + int kind; + }; -#define ID 2 -#define DOLLAR 3 strings enclosed by dollar sign -#define EXECUTABLE_STRING 4 strings enclosed by {} -#define EXECUTABLE_ARRAY 8 Don't set it in this file. + #define ID 2 + #define DOLLAR 3 strings enclosed by dollar sign + #define EXECUTABLE_STRING 4 strings enclosed by {} + #define EXECUTABLE_ARRAY 8 Don't set it in this file. ******************************************************************/ @@ -47,20 +49,26 @@ static int TypeSM = ID; /**************** end of declaration part of lexical analizer ******/ static int getSM(); -static putSM(); +static void putSM(); static struct tokens flushSM(); -static isSpaceSM(); -static isDollarSM(); -static isBraceSM(); -static isKakkoSM(); -static isSymbolSM(); +static int isSpaceSM(); +static int isDollarSM(); +static int isBraceSM(); +static int isKakkoSM(); +static int isSymbolSM(); static struct tokens getokenSM2(); +void errorScanner2(char *str); + +extern int ScannerWhich; +extern unsigned char ScannerBuf[]; +extern int ScannerPt; + /**************** code part of lexical analizer ********************/ struct tokens *decomposeToTokens(str,sizep) -char *str; -int *sizep; + char *str; + int *sizep; { struct tokens *tArray; struct tokens token; @@ -94,18 +102,31 @@ int *sizep; static int getSM() -/* get a letter from StringSM */ + /* get a letter from StringSM */ { int c; - c = StringSM[StrpSM++]; + + 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 = (unsigned char) StringSM[StrpSM++]; + if (c != 0) { + ScannerPt++; if (ScannerPt >= SCANNERBUF_SIZE) ScannerPt = 0; + ScannerBuf[ScannerPt] = c; + } if (c == '\0') { StrpSM--;return(EOF); } else return(c); } -static putSM(c) -int c; -/* put a letter on BufSM */ +static void putSM(c) + int c; + /* put a letter on BufSM */ { char *new; int i; BufSM[ExistSM++] = ((c=='\n')? ' ' : c); @@ -138,9 +159,10 @@ static struct tokens flushSM() strcpy(token,BufSM); r.token = token; r.kind = TypeSM; + r.tflag = 0; if (r.kind == ID) { if (isLiteral(r.token)) { - r.object = lookupLiteralString(r.token); + r.object = lookupLiteralString(r.token); }else{ r = lookupTokens(r); /* Compute hashing values */ } @@ -148,36 +170,36 @@ static struct tokens flushSM() return(r); } -static isSpaceSM(c) -int c; +static int isSpaceSM(c) + int c; { - if ((c <= ' ') && (c!= EOF)) return(1); + if (((c <= ' ') || c == ',') && (c!= EOF)) return(1); else return(0); } -static isDollarSM(c) -int c; +static int isDollarSM(c) + int c; { if (c == '$') return(1); else return(0); } -static isBraceSM(c) -int c; +static int isBraceSM(c) + int c; { if (c == '{') return(1); else return(0); } -static isKakkoSM(c) -int c; +static int isKakkoSM(c) + int c; { if (c == '(') return(1); else return(0); } -static isSymbolSM(c) -int c; +static int isSymbolSM(c) + int c; { if ((c == '{') || (c == '}') || @@ -190,14 +212,18 @@ int c; } static struct tokens getokenSM2(kind,str) -actionType kind; -char *str; + actionType kind; + char *str; { static int c; static struct tokens rnull; int level; if (kind == INIT) { + ScannerWhich = 2; + ScannerPt = 0; + ScannerBuf[0] = 0; + StrpSM = 0; ExistSM = 0; @@ -215,65 +241,65 @@ char *str; else return(rnull); } else if (isSpaceSM(c)) { if (ExistSM) { - c = mygetchar(); return(flushSM()); + c = mygetchar(); return(flushSM()); }else { - while (isSpaceSM(c=mygetchar())) ; + while (isSpaceSM(c=mygetchar())) ; } } else if (isDollarSM(c)) { /* output contents in dollar signs. */ if (ExistSM) return(flushSM()); else { - c = mygetchar(); - while ((c != EOF) && (c != '$')) { - putSM(c); - c = mygetchar(); - } - if (c=='$') c=mygetchar(); - TypeSM = DOLLAR; - return(flushSM()); + c = mygetchar(); + while ((c != EOF) && (c != '$')) { + putSM(c); + c = mygetchar(); + } + if (c=='$') c=mygetchar(); + TypeSM = DOLLAR; + return(flushSM()); } } else if (isBraceSM(c)) { /* output contents in { } */ /* { { } } */ level = 0; if (ExistSM) return(flushSM()); else { - c = mygetchar(); - while (1) { - if (c == '%') { /* skip the comment in the brace. */ - while (((c=mygetchar()) != '\n') && (c != EOF)) ; - } - if (c == EOF) break; - if ((c == '}') && (level <= 0)) break; - if ( c == '{') ++level; - if ( c == '}') --level; - putSM(c); - c = mygetchar(); - } - if (c=='}') c=mygetchar(); - TypeSM = EXECUTABLE_STRING; - return(flushSM()); + c = mygetchar(); + while (1) { + if (c == '%') { /* skip the comment in the brace. */ + while (((c=mygetchar()) != '\n') && (c != EOF)) ; + } + if (c == EOF) break; + if ((c == '}') && (level <= 0)) break; + if ( c == '{') ++level; + if ( c == '}') --level; + putSM(c); + c = mygetchar(); + } + if (c=='}') c=mygetchar(); + TypeSM = EXECUTABLE_STRING; + return(flushSM()); } } else if (isKakkoSM(c)) { /* output contents in ( ) */ level = 0; if (ExistSM) return(flushSM()); else { - c = mygetchar(); - while (1) { - if (c == EOF) break; - if (c == '\\') { /* e.g. \( */ - putSM(c); - c = mygetchar(); - if (c == EOF) break; - }else{ - if ((c == ')') && (level <= 0)) break; - if ( c == '(') ++level; - if ( c == ')') --level; - } - putSM(c); - c = mygetchar(); - } - if (c==')') c=mygetchar(); - TypeSM = DOLLAR; - return(flushSM()); + c = mygetchar(); + while (1) { + if (c == EOF) break; + if (c == '\\') { /* e.g. \( */ + putSM(c); + c = mygetchar(); + if (c == EOF) break; + }else{ + if ((c == ')') && (level <= 0)) break; + if ( c == '(') ++level; + if ( c == ')') --level; + } + putSM(c); + c = mygetchar(); + } + if (c==')') c=mygetchar(); + TypeSM = DOLLAR; + return(flushSM()); } } else if (c=='%') { /* comment */ while (((c=mygetchar()) != '\n') && (c != EOF)) ; @@ -281,19 +307,19 @@ char *str; } else if (isSymbolSM(c)) { /* symbols. {,} etc */ if(ExistSM) return(flushSM()); else { - putSM(c); - c = mygetchar(); - return(flushSM()); + putSM(c); + c = mygetchar(); + return(flushSM()); } } else { /* identifier */ putSM(c); c =mygetchar(); while ((!isDollarSM(c)) && - (!isSpaceSM(c)) && - (!isSymbolSM(c)) && - (c != EOF)) { - putSM(c); - c = mygetchar(); + (!isSpaceSM(c)) && + (!isSymbolSM(c)) && + (c != EOF)) { + putSM(c); + c = mygetchar(); } return(flushSM()); } @@ -303,8 +329,8 @@ char *str; /*********** end of code part of lexical analizer ********************/ -errorScanner2(str) -char *str; +void errorScanner2(str) + char *str; { fprintf(stderr,"Error (scanner2.c): %s\n",str); exit(10);