📄 scanner.c
字号:
(inchar != ' ') && (inchar != ';') &&
isprint(inchar) )
{
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;
int pos = 0;
unsigned 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))
{ EnvPrintRouter(theEnv,WERROR,"\nEncountered 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 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
{
lvalue = atol(ScannerData(theEnv)->GlobalString);
if ((lvalue == LONG_MAX) || (lvalue == LONG_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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -