227 lines
5.4 KiB
C++
227 lines
5.4 KiB
C++
#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();
|
|
}
|