| version 1.1, 1999/10/08 02:12:01 |
version 1.10, 2020/10/06 11:33:47 |
|
|
| |
/* $OpenXM: OpenXM/src/kan96xx/Kan/scanner2.c,v 1.9 2005/07/18 10:55:16 takayama Exp $ */ |
| /* scanner2.c (SM StackMachine) */ |
/* scanner2.c (SM StackMachine) */ |
| /* export: struct tokens decompostToTokens(char *str,int *sizep); |
/* export: struct tokens decompostToTokens(char *str,int *sizep); |
| scanner2.c is for getting tokens from a string. |
scanner2.c is for getting tokens from a string. |
| */ |
*/ |
| #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); |
| int isLiteral(char *s); |
int isLiteral(char *s); |
| struct object lookupLiteralString(char *s); |
struct object lookupLiteralString(char *s); |
| /**************** defined in stackm.h **************************** |
/**************** defined in stackm.h **************************** |
| typedef enum {INIT,GET,PUT,OPEN} actionType; |
typedef enum {INIT,GET,PUT,OPEN} actionType; |
| |
|
| struct tokens{ |
struct tokens{ |
| char *token; |
char *token; |
| int kind; |
int kind; |
| }; |
}; |
| |
|
| |
|
| #define ID 2 |
#define ID 2 |
| #define DOLLAR 3 strings enclosed by dollar sign |
#define DOLLAR 3 strings enclosed by dollar sign |
| #define EXECUTABLE_STRING 4 strings enclosed by {} |
#define EXECUTABLE_STRING 4 strings enclosed by {} |
| #define EXECUTABLE_ARRAY 8 Don't set it in this file. |
#define EXECUTABLE_ARRAY 8 Don't set it in this file. |
| ******************************************************************/ |
******************************************************************/ |
| |
|
| |
|
| Line 46 static int TypeSM = ID; |
|
| Line 49 static int TypeSM = ID; |
|
| /**************** 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 struct tokens getokenSM2(); |
static struct tokens getokenSM2(); |
| |
|
| |
void errorScanner2(char *str); |
| |
|
| |
extern int ScannerWhich; |
| |
extern unsigned char ScannerBuf[]; |
| |
extern int ScannerPt; |
| |
|
| /**************** code part of lexical analizer ********************/ |
/**************** code part of lexical analizer ********************/ |
| |
|
| struct tokens *decomposeToTokens(str,sizep) |
struct tokens *decomposeToTokens(str,sizep) |
| char *str; |
char *str; |
| int *sizep; |
int *sizep; |
| { |
{ |
| struct tokens *tArray; |
struct tokens *tArray; |
| struct tokens token; |
struct tokens token; |
|
|
| |
|
| |
|
| static int getSM() |
static int getSM() |
| /* get a letter from StringSM */ |
/* get a letter from StringSM */ |
| { |
{ |
| int c; |
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') { |
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 137 static struct tokens flushSM() |
|
| Line 159 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); |
| }else{ |
}else{ |
| r = lookupTokens(r); /* Compute hashing values */ |
r = lookupTokens(r); /* Compute hashing values */ |
| } |
} |
| Line 147 static struct tokens flushSM() |
|
| Line 170 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 == '}') || |
|
|
| } |
} |
| |
|
| static struct tokens getokenSM2(kind,str) |
static struct tokens getokenSM2(kind,str) |
| actionType kind; |
actionType kind; |
| char *str; |
char *str; |
| { |
{ |
| static int c; |
static int c; |
| static struct tokens rnull; |
static struct tokens rnull; |
| int level; |
int level; |
| |
|
| if (kind == INIT) { |
if (kind == INIT) { |
| |
ScannerWhich = 2; |
| |
ScannerPt = 0; |
| |
ScannerBuf[0] = 0; |
| |
|
| StrpSM = 0; |
StrpSM = 0; |
| ExistSM = 0; |
ExistSM = 0; |
| |
|
|
|
| else return(rnull); |
else return(rnull); |
| } 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)) ; |
|
|
| } 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()); |
| } |
} |
|
|
| /*********** end of code part of lexical analizer ********************/ |
/*********** end of code part of lexical analizer ********************/ |
| |
|
| |
|
| errorScanner2(str) |
void errorScanner2(str) |
| char *str; |
char *str; |
| { |
{ |
| fprintf(stderr,"Error (scanner2.c): %s\n",str); |
fprintf(stderr,"Error (scanner2.c): %s\n",str); |
| exit(10); |
exit(10); |