Initial
This commit is contained in:
226
http/SCAN.CPP
Normal file
226
http/SCAN.CPP
Normal file
@@ -0,0 +1,226 @@
|
||||
#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)
|
||||
{
|
||||
}
|
||||
|
||||
Scan::~Scan(void)
|
||||
{
|
||||
mWinConsole.writeLine("press enter to continue");
|
||||
mWinConsole.read();
|
||||
}
|
||||
|
||||
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 scanUnknown();
|
||||
}
|
||||
emit(endtext1);
|
||||
}
|
||||
|
||||
void Scan::scanNewLine(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanNewLine");
|
||||
readch();
|
||||
if(mChar=='\n')
|
||||
{
|
||||
emit(newline1);
|
||||
readch();
|
||||
}
|
||||
else emit(unknown1);
|
||||
}
|
||||
|
||||
void Scan::skipSeparators(void)
|
||||
{
|
||||
while(mChar==SpaceChar||mChar==TabChar)readch();
|
||||
}
|
||||
|
||||
void Scan::scanWord(void)
|
||||
{
|
||||
String wordString;
|
||||
int tableIndex(0);
|
||||
|
||||
mWinConsole.writeLine("Scan::scanWord");
|
||||
if(mChar=='"')readch();
|
||||
while(0xFFFF!=mChar&&0x0D!=mChar&&mChar!='"'&&mChar!='>'&&mChar!='/'&&mChar!='='&&mChar!='"'&&!isspace(mChar))
|
||||
{
|
||||
wordString+=String((char)mChar);
|
||||
readch();
|
||||
}
|
||||
if(mChar=='"')readch();
|
||||
if(wordString.isNull())return;
|
||||
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(startliteral1);
|
||||
emit(wordString.length());
|
||||
emit((char*)wordString);
|
||||
}
|
||||
}
|
||||
|
||||
void Scan::scanLiteral(void)
|
||||
{
|
||||
String wordString;
|
||||
int tableIndex(0);
|
||||
|
||||
mWinConsole.writeLine("Scan::scanLiteral");
|
||||
readch();
|
||||
while(0xFFFF!=mChar&&'"'!=mChar)
|
||||
{
|
||||
wordString+=String((char)mChar);
|
||||
readch();
|
||||
}
|
||||
if(mChar=='"')readch();
|
||||
if(wordString.isNull())return;
|
||||
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(startliteral1);
|
||||
emit(wordString.length());
|
||||
emit((char*)wordString);
|
||||
}
|
||||
}
|
||||
|
||||
void Scan::scanNumeral(void)
|
||||
{
|
||||
int multiplier=10;
|
||||
double value=0;
|
||||
double digits;
|
||||
|
||||
mWinConsole.writeLine("Scan::scanNumeral");
|
||||
while(0xFFFF!=mChar&&isdigit(mChar))
|
||||
{
|
||||
digits=atof((char *)&mChar);
|
||||
value=multiplier*value+digits;
|
||||
readch();
|
||||
}
|
||||
if(mChar=='.')
|
||||
{
|
||||
readch();
|
||||
while(isdigit(mChar))
|
||||
{
|
||||
digits=atof((char *)&mChar);
|
||||
value=(digits/multiplier)+value;
|
||||
multiplier*=10;
|
||||
readch();
|
||||
}
|
||||
}
|
||||
emit(numeral1,value);
|
||||
}
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
void Scan::scanLeftAngle(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanLeftAngle");
|
||||
emit(leftangle1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanRightAngle(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanRightAngle");
|
||||
emit(rightangle1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanForwardSlash(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanForwardSlash");
|
||||
emit(forwardslash1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanAmpersand(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanAmpersand");
|
||||
emit(ampersand1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanSemicolon(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanSemicolon");
|
||||
emit(semicolon1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanPound(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanPound");
|
||||
emit(pound1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanExclamation(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanExclamation");
|
||||
emit(exclamation1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanMinus(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanMinus");
|
||||
emit(minus1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanEqual(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanEqual");
|
||||
emit(equal1);
|
||||
readch();
|
||||
}
|
||||
|
||||
void Scan::scanUnknown(void)
|
||||
{
|
||||
mWinConsole.writeLine("Scan::scanUnknown");
|
||||
emit(unknown1);
|
||||
readch();
|
||||
}
|
||||
Reference in New Issue
Block a user