?? scanner.c
字號(hào):
ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; inchar = EnvGetcRouter(theEnv,logicalName); } /*===================================================*/ /* Return the last character scanned (the delimiter) */ /* to the input stream so it will be scanned as part */ /* of the next token. */ /*===================================================*/ EnvUngetcRouter(theEnv,inchar,logicalName); /*====================================================*/ /* Add the symbol to the symbol table and return the */ /* symbol table address of the symbol. Symbols of the */ /* form [<symbol>] are instance names, so the type */ /* returned is INSTANCE_NAME rather than SYMBOL. */ /*====================================================*/#if OBJECT_SYSTEM if (count > 2) { if ((ScannerData(theEnv)->GlobalString[0] == '[') ? (ScannerData(theEnv)->GlobalString[count-1] == ']') : FALSE) { *type = INSTANCE_NAME; inchar = ']'; } else { *type = SYMBOL; return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString)); } ScannerData(theEnv)->GlobalString[count-1] = EOS; symbol = EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString+1); ScannerData(theEnv)->GlobalString[count-1] = (char) inchar; return(symbol); } else { *type = SYMBOL; return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString)); }#else *type = SYMBOL; return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString));#endif }/*************************************//* ScanString: Scans a string token. *//*************************************/static void *ScanString( void *theEnv, char *logicalName) { int inchar; size_t pos = 0; size_t max = 0; char *theString = NULL; void *thePtr; /*============================================*/ /* Scan characters and add them to the string */ /* until the " delimiter is found. */ /*============================================*/ inchar = EnvGetcRouter(theEnv,logicalName); while ((inchar != '"') && (inchar != EOF)) { if (inchar == '\\') { inchar = EnvGetcRouter(theEnv,logicalName); } theString = ExpandStringWithChar(theEnv,inchar,theString,&pos,&max,max+80); inchar = EnvGetcRouter(theEnv,logicalName); } if ((inchar == EOF) && (ScannerData(theEnv)->IgnoreCompletionErrors == FALSE)) { PrintErrorID(theEnv,"SCANNER",1,TRUE); EnvPrintRouter(theEnv,WERROR,"Encountered End-Of-File while scanning a string\n"); } /*===============================================*/ /* Add the string to the symbol table and return */ /* the symbol table address of the string. */ /*===============================================*/ if (theString == NULL) { thePtr = EnvAddSymbol(theEnv,""); } else { thePtr = EnvAddSymbol(theEnv,theString); rm(theEnv,theString,max); } return(thePtr); }/**************************************//* ScanNumber: Scans a numeric token. *//**************************************/static void ScanNumber( void *theEnv, char *logicalName, struct token *theToken) { int count = 0; int inchar, phase; int digitFound = FALSE; int processFloat = FALSE; double fvalue; long long lvalue; unsigned short type; /* Phases: */ /* -1 = sign */ /* 0 = integral */ /* 1 = decimal */ /* 2 = exponent-begin */ /* 3 = exponent-value */ /* 5 = done */ /* 9 = error */ inchar = EnvGetcRouter(theEnv,logicalName); phase = -1; while ((phase != 5) && (phase != 9)) { if (phase == -1) { if (isdigit(inchar)) { phase = 0; digitFound = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } else if ((inchar == '+') || (inchar == '-')) { phase = 0; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } else if (inchar == '.') { processFloat = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 1; } else if ((inchar == 'E') || (inchar == 'e')) { processFloat = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 2; } else if ( (inchar == '<') || (inchar == '"') || (inchar == '(') || (inchar == ')') || (inchar == '&') || (inchar == '|') || (inchar == '~') || (inchar == ' ') || (inchar == ';') || (isprint(inchar) == 0) ) { phase = 5; } else { phase = 9; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } } else if (phase == 0) { if (isdigit(inchar)) { digitFound = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } else if (inchar == '.') { processFloat = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 1; } else if ((inchar == 'E') || (inchar == 'e')) { processFloat = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 2; } else if ( (inchar == '<') || (inchar == '"') || (inchar == '(') || (inchar == ')') || (inchar == '&') || (inchar == '|') || (inchar == '~') || (inchar == ' ') || (inchar == ';') || (isprint(inchar) == 0) ) { phase = 5; } else { phase = 9; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } } else if (phase == 1) { if (isdigit(inchar)) { digitFound = TRUE; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } else if ((inchar == 'E') || (inchar == 'e')) { ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 2; } else if ( (inchar == '<') || (inchar == '"') || (inchar == '(') || (inchar == ')') || (inchar == '&') || (inchar == '|') || (inchar == '~') || (inchar == ' ') || (inchar == ';') || (isprint(inchar) == 0) ) { phase = 5; } else { phase = 9; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } } else if (phase == 2) { if (isdigit(inchar)) { ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 3; } else if ((inchar == '+') || (inchar == '-')) { ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; phase = 3; } else if ( (inchar == '<') || (inchar == '"') || (inchar == '(') || (inchar == ')') || (inchar == '&') || (inchar == '|') || (inchar == '~') || (inchar == ' ') || (inchar == ';') || (isprint(inchar) == 0) ) { digitFound = FALSE; phase = 5; } else { phase = 9; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } } else if (phase == 3) { if (isdigit(inchar)) { ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } else if ( (inchar == '<') || (inchar == '"') || (inchar == '(') || (inchar == ')') || (inchar == '&') || (inchar == '|') || (inchar == '~') || (inchar == ' ') || (inchar == ';') || (isprint(inchar) == 0) ) { if ((ScannerData(theEnv)->GlobalString[count-1] == '+') || (ScannerData(theEnv)->GlobalString[count-1] == '-')) { digitFound = FALSE; } phase = 5; } else { phase = 9; ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80); count++; } } if ((phase != 5) && (phase != 9)) { inchar = EnvGetcRouter(theEnv,logicalName); } } if (phase == 9) { theToken->value = (void *) ScanSymbol(theEnv,logicalName,count,&type); theToken->type = type; theToken->printForm = ValueToString(theToken->value); return; } /*=======================================*/ /* Stuff last character back into buffer */ /* and return the number. */ /*=======================================*/ EnvUngetcRouter(theEnv,inchar,logicalName); if (! digitFound) { theToken->type = SYMBOL; theToken->value = (void *) EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString); theToken->printForm = ValueToString(theToken->value); return; } if (processFloat) { fvalue = atof(ScannerData(theEnv)->GlobalString); theToken->type = FLOAT; theToken->value = (void *) EnvAddDouble(theEnv,fvalue); theToken->printForm = FloatToString(theEnv,ValueToDouble(theToken->value)); } else {#if IBM_MSC lvalue = _strtoi64(ScannerData(theEnv)->GlobalString,NULL,10);#else lvalue = strtoll(ScannerData(theEnv)->GlobalString,NULL,10);#endif if ((lvalue == LLONG_MAX) || (lvalue == LLONG_MIN)) { PrintWarningID(theEnv,"SCANNER",1,FALSE); EnvPrintRouter(theEnv,WWARNING,"Over or underflow of long integer.\n"); } theToken->type = INTEGER; theToken->value = (void *) EnvAddLong(theEnv,lvalue); theToken->printForm = LongIntegerToString(theEnv,ValueToLong(theToken->value)); } return; }/***********************************************************//* CopyToken: Copies values of one token to another token. *//***********************************************************/globle void CopyToken( struct token *destination, struct token *source) { destination->type = source->type; destination->value = source->value; destination->printForm = source->printForm; }/****************************************//* ResetLineCount: Resets the scanner's *//* line count to zero. *//****************************************/globle void ResetLineCount( void *theEnv) { ScannerData(theEnv)->LineCount = 0; }/****************************************************//* GettLineCount: Returns the scanner's line count. *//****************************************************/globle long GetLineCount( void *theEnv) { return(ScannerData(theEnv)->LineCount); }/**********************************//* IncrementLineCount: Increments *//* the scanner's line count. *//**********************************/globle void IncrementLineCount( void *theEnv) { ScannerData(theEnv)->LineCount++; }/**********************************//* DecrementLineCount: Decrements *//* the scanner's line count. *//**********************************/globle void DecrementLineCount( void *theEnv) { ScannerData(theEnv)->LineCount--; }
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -