#include #include 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(); }