scanner.c

来自「clips源代码」· C语言 代码 · 共 788 行 · 第 1/2 页

C
788
字号
      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--;  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?