Initial
This commit is contained in:
265
http/HOLD/SCAN.CPP
Normal file
265
http/HOLD/SCAN.CPP
Normal file
@@ -0,0 +1,265 @@
|
||||
#if 0
|
||||
#include <http/table.hpp>
|
||||
#include <http/scan.hpp>
|
||||
|
||||
Scan::Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,WORD allowUserSymbols)
|
||||
: Emit(srcView,dstView), mSymbolTable(symbolTable), mUserSymbols(allowUserSymbols),
|
||||
mLogFile("scan.log",FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite)
|
||||
{
|
||||
}
|
||||
|
||||
Scan::~Scan(void)
|
||||
{
|
||||
}
|
||||
|
||||
void Scan::analyze(void)
|
||||
{
|
||||
readch();
|
||||
while((int)mChar!=-1&&mChar!=0x001A)
|
||||
{
|
||||
skipSeparators();
|
||||
if(0xFFFF==mChar||0x001A==mChar)break;
|
||||
if(isdigit(mChar))scanNumeral();
|
||||
else if(isalpha(mChar))scanWord();
|
||||
else if(mChar=='\r')scanNewLine();
|
||||
else if(mChar=='"')scanLiteral();
|
||||
else if(mChar=='<')scanLeftAngle();
|
||||
else if(mChar=='>')scanRightAngle();
|
||||
else if(mChar=='/')scanForwardSlash();
|
||||
else if(mChar=='&')scanAmpersand();
|
||||
else if(mChar==';')scanSemicolon();
|
||||
else if(mChar=='#')scanPound();
|
||||
else if(mChar=='!')scanExclamation();
|
||||
else if(mChar=='-')scanMinus();
|
||||
else if(mChar=='=')scanEqual();
|
||||
else if(mChar==':')scanColon();
|
||||
else if(mChar=='(')scanRightParen();
|
||||
else if(mChar==')')scanLeftParen();
|
||||
else if(mChar==' ')scanSpace();
|
||||
else scanUnknown();
|
||||
}
|
||||
emit(endtext1);
|
||||
}
|
||||
|
||||
void Scan::scanNewLine(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanNewLine");
|
||||
readch();
|
||||
if(mChar=='\n')
|
||||
{
|
||||
emit(newline1);
|
||||
readch();
|
||||
}
|
||||
else emit(unknown1);
|
||||
}
|
||||
|
||||
void Scan::skipSeparators(void)
|
||||
{
|
||||
while(mChar==TabChar||mChar==LineFeed)readch(); // mChar==SpaceChar||
|
||||
}
|
||||
|
||||
void Scan::scanWord(void)
|
||||
{
|
||||
String wordString;
|
||||
int tableIndex(0);
|
||||
|
||||
if(mChar=='"')readch();
|
||||
while(0xFFFF!=mChar&&0x0D!=mChar&&mChar!='"'&&mChar!='>'&&mChar!='<'&&mChar!='='&&mChar!='"'&&mChar!='&'&&mChar!=';'&&mChar!=')'&&mChar!='#'&&!isspace(mChar)) // &&mChar!='/'
|
||||
{
|
||||
wordString+=String((char)mChar);
|
||||
readch();
|
||||
}
|
||||
if(mChar=='"')readch();
|
||||
if(wordString.isNull())return;
|
||||
mLogFile.writeLine(String("Scan::scanWord")+String(" '")+wordString+String("'"));
|
||||
if(mSymbolTable.locateSymbolString(wordString,tableIndex))
|
||||
{
|
||||
if(Symbol::UserSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),tableIndex);
|
||||
else if(Symbol::AssignedSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::ConstantSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::SystemSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::CommandSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else emit(unknown1);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit(literal1);
|
||||
emit(wordString.length());
|
||||
emit((char*)wordString);
|
||||
}
|
||||
}
|
||||
|
||||
void Scan::scanLiteral(void)
|
||||
{
|
||||
String wordString;
|
||||
int tableIndex(0);
|
||||
|
||||
readch();
|
||||
while(0xFFFF!=mChar&&'"'!=mChar)
|
||||
{
|
||||
wordString+=String((char)mChar);
|
||||
readch();
|
||||
}
|
||||
if(mChar=='"')readch();
|
||||
if(wordString.isNull())return;
|
||||
mLogFile.writeLine(String("Scan::scanLiteral")+String(" '")+wordString+String("'"));
|
||||
if(mSymbolTable.locateSymbolString(wordString,tableIndex))
|
||||
{
|
||||
if(Symbol::UserSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),tableIndex);
|
||||
else if(Symbol::AssignedSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::ConstantSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::SystemSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else if(Symbol::CommandSymbol==mSymbolTable[tableIndex].symbolType())
|
||||
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
|
||||
else emit(unknown1);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit(literal1);
|
||||
emit(wordString.length());
|
||||
emit((char*)wordString);
|
||||
}
|
||||
}
|
||||
|
||||
void Scan::scanNumeral(void)
|
||||
{
|
||||
int multiplier=10;
|
||||
double value=0;
|
||||
double digits;
|
||||
|
||||
while(0xFFFF!=mChar&&isdigit(mChar))
|
||||
{
|
||||
digits=atof((char *)&mChar);
|
||||
value=multiplier*value+digits;
|
||||
readch();
|
||||
}
|
||||
|
||||
String numberString;
|
||||
::sprintf(numberString,"%lf",value);
|
||||
mLogFile.writeLine(String("Scan::scanNumeral")+String(" '")+numberString+String("'"));
|
||||
|
||||
if(mChar=='.')
|
||||
{
|
||||
readch();
|
||||
while(isdigit(mChar))
|
||||
{
|
||||
digits=atof((char *)&mChar);
|
||||
value=(digits/multiplier)+value;
|
||||
multiplier*=10;
|
||||
readch();
|
||||
}
|
||||
}
|
||||
emit(numeral1,value);
|
||||
}
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
void Scan::scanLeftAngle(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanLeftAngle");
|
||||
emit(leftangle1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanRightAngle(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanRightAngle");
|
||||
emit(rightangle1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanForwardSlash(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanForwardSlash");
|
||||
emit(forwardslash1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanAmpersand(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanAmpersand");
|
||||
emit(ampersand1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanSemicolon(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanSemicolon");
|
||||
emit(semicolon1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanPound(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanPound");
|
||||
emit(pound1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanExclamation(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanExclamation");
|
||||
emit(exclamation1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanMinus(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanMinus");
|
||||
emit(minus1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanEqual(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanEqual");
|
||||
emit(equal1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanColon(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanColon");
|
||||
emit(colon1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanRightParen(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanRightParen");
|
||||
emit(rightparen1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanLeftParen(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanLeftParen");
|
||||
emit(leftparen1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanSpace(void)
|
||||
{
|
||||
mLogFile.writeLine("Scan::scanSpace");
|
||||
emit(space1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanUnknown(void)
|
||||
{
|
||||
String logString;
|
||||
::sprintf(logString,"Scan::unknown '0x%x' %d",(int)mChar,(int)mChar);
|
||||
mLogFile.writeLine(logString);
|
||||
emit(unknown1);
|
||||
readch();
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user