|
|
@@ -10,90 +10,12 @@
|
|
|
#include "Assert.h"
|
|
|
|
|
|
|
|
|
+namespace Scanner {
|
|
|
+
|
|
|
#define SCANNER_EXCEPTION(x) \
|
|
|
EXCEPTION("Scanner exception (" + scriptName + ':' + boost::lexical_cast<std::string>(lineNmbr) + "): " + x)
|
|
|
|
|
|
|
|
|
-//======================================================================================================================
|
|
|
-// Constructor [Token] =
|
|
|
-//======================================================================================================================
|
|
|
-Scanner::Token::Token(const Token& b): code(b.code), dataType(b.dataType)
|
|
|
-{
|
|
|
- switch(b.dataType)
|
|
|
- {
|
|
|
- case Scanner::DT_FLOAT:
|
|
|
- value.float_ = b.value.float_;
|
|
|
- break;
|
|
|
- case Scanner::DT_INT:
|
|
|
- value.int_ = b.value.int_;
|
|
|
- break;
|
|
|
- case Scanner::DT_CHAR:
|
|
|
- value.char_ = b.value.char_;
|
|
|
- break;
|
|
|
- case Scanner::DT_STR:
|
|
|
- value.string = b.value.string;
|
|
|
- break;
|
|
|
- }
|
|
|
- memcpy(asString, b.asString, Scanner::MAX_SCRIPT_LINE_LEN * sizeof(char));
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//======================================================================================================================
|
|
|
-// getInfoStr =
|
|
|
-//======================================================================================================================
|
|
|
-std::string Scanner::Token::getInfoStr() const
|
|
|
-{
|
|
|
- char tokenInfoStr[512];
|
|
|
- switch(code)
|
|
|
- {
|
|
|
- case TC_COMMENT:
|
|
|
- return "comment";
|
|
|
- case TC_NEWLINE:
|
|
|
- return "newline";
|
|
|
- case TC_EOF:
|
|
|
- return "end of file";
|
|
|
- case TC_STRING:
|
|
|
- sprintf(tokenInfoStr, "string \"%s\"", value.string);
|
|
|
- break;
|
|
|
- case TC_CHAR:
|
|
|
- sprintf(tokenInfoStr, "char '%c' (\"%s\")", value.char_, asString);
|
|
|
- break;
|
|
|
- case TC_NUMBER:
|
|
|
- if(dataType == DT_FLOAT)
|
|
|
- sprintf(tokenInfoStr, "float %f or %e (\"%s\")", value.float_, value.float_, asString);
|
|
|
- else
|
|
|
- sprintf(tokenInfoStr, "int %lu (\"%s\")", value.int_, asString);
|
|
|
- break;
|
|
|
- case TC_IDENTIFIER:
|
|
|
- sprintf(tokenInfoStr, "identifier \"%s\"", value.string);
|
|
|
- break;
|
|
|
- case TC_ERROR:
|
|
|
- return "scanner error";
|
|
|
- break;
|
|
|
- default:
|
|
|
- if(code>=TC_KE && code<=TC_KEYWORD)
|
|
|
- {
|
|
|
- sprintf(tokenInfoStr, "reserved word \"%s\"", value.string);
|
|
|
- }
|
|
|
- else if(code>=TC_SCOPERESOLUTION && code<=TC_ASSIGNOR)
|
|
|
- {
|
|
|
- sprintf(tokenInfoStr, "operator no %d", code - TC_SCOPERESOLUTION);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return tokenInfoStr;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//======================================================================================================================
|
|
|
-// print =
|
|
|
-//======================================================================================================================
|
|
|
-void Scanner::Token::print() const
|
|
|
-{
|
|
|
- std::cout << "Token: " << getInfoStr() << std::endl;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
//======================================================================================================================
|
|
|
// statics =
|
|
|
//======================================================================================================================
|
|
|
@@ -173,7 +95,7 @@ void Scanner::initAsciiMap()
|
|
|
asciiLookupTable['\n'] = AC_ERROR; // newline is unacceptable char
|
|
|
|
|
|
asciiLookupTable['@'] = asciiLookupTable['`'] = asciiLookupTable['$'] = AC_ACCEPTABLE_IN_COMMENTS;
|
|
|
-
|
|
|
+
|
|
|
asciiLookupTable['\"'] = AC_DOUBLEQUOTE;
|
|
|
asciiLookupTable['\''] = AC_QUOTE;
|
|
|
asciiLookupTable[(int)eofChar] = AC_EOF;
|
|
|
@@ -278,13 +200,13 @@ void Scanner::getAllPrintAll()
|
|
|
// loadFile =
|
|
|
//======================================================================================================================
|
|
|
void Scanner::loadFile(const char* filename_)
|
|
|
-{
|
|
|
+{
|
|
|
inFstream.open(filename_);
|
|
|
if(!inFstream.is_open())
|
|
|
{
|
|
|
throw EXCEPTION("Cannot open file \"" + filename_ + '\"');
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
loadIstream(inFstream, filename_);
|
|
|
}
|
|
|
|
|
|
@@ -323,7 +245,7 @@ void Scanner::unload()
|
|
|
//======================================================================================================================
|
|
|
// getNextToken =
|
|
|
//======================================================================================================================
|
|
|
-const Scanner::Token& Scanner::getNextToken()
|
|
|
+const Token& Scanner::getNextToken()
|
|
|
{
|
|
|
start:
|
|
|
|
|
|
@@ -343,7 +265,7 @@ const Scanner::Token& Scanner::getNextToken()
|
|
|
putBackChar();
|
|
|
int line = getLineNumber();
|
|
|
checkComment();
|
|
|
-
|
|
|
+
|
|
|
commentedLines = getLineNumber() - line; // update commentedLines
|
|
|
lineNmbr -= commentedLines; // part of the ultimate hack
|
|
|
}
|
|
|
@@ -421,7 +343,7 @@ const Scanner::Token& Scanner::getNextToken()
|
|
|
{
|
|
|
goto start;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return crntToken;
|
|
|
}
|
|
|
|
|
|
@@ -430,7 +352,7 @@ const Scanner::Token& Scanner::getNextToken()
|
|
|
//======================================================================================================================
|
|
|
void Scanner::checkWord()
|
|
|
{
|
|
|
- char* tmpStr = crntToken.asString;
|
|
|
+ char* tmpStr = &crntToken.asString[0];
|
|
|
char ch = *pchar;
|
|
|
|
|
|
//build the string
|
|
|
@@ -443,9 +365,9 @@ void Scanner::checkWord()
|
|
|
*tmpStr = '\0'; // finalize it
|
|
|
|
|
|
//check if reserved
|
|
|
- int len = tmpStr-crntToken.asString;
|
|
|
+ int len = tmpStr - &crntToken.asString[0];
|
|
|
crntToken.code = TC_IDENTIFIER;
|
|
|
- crntToken.value.string = crntToken.asString;
|
|
|
+ crntToken.value.string = &crntToken.asString[0];
|
|
|
crntToken.dataType = DT_STR; // not important
|
|
|
|
|
|
if(len <= 7 && len >= 2)
|
|
|
@@ -458,7 +380,7 @@ void Scanner::checkWord()
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if(strcmp(rwTable[len][x].string, crntToken.asString) == 0)
|
|
|
+ if(strcmp(rwTable[len][x].string, &crntToken.asString[0]) == 0)
|
|
|
{
|
|
|
crntToken.code = rwTable[len][x].code;
|
|
|
break;
|
|
|
@@ -552,7 +474,7 @@ void Scanner::checkNumber()
|
|
|
long dad = 0; // digits after dot (for floats)
|
|
|
bool expSign = 0; // exponent sign in case float is represented in mant/exp format. 0 means positive and 1 negative
|
|
|
long exp = 0; // the exponent in case float is represented in mant/exp format
|
|
|
- char* tmpStr = crntToken.asString;
|
|
|
+ char* tmpStr = &crntToken.asString[0];
|
|
|
crntToken.dataType = DT_INT;
|
|
|
uint asc;
|
|
|
|
|
|
@@ -841,7 +763,7 @@ void Scanner::checkNumber()
|
|
|
}
|
|
|
|
|
|
*tmpStr = '\0';
|
|
|
- throw SCANNER_EXCEPTION("Bad number suffix \"" + crntToken.asString + '\"');
|
|
|
+ throw SCANNER_EXCEPTION("Bad number suffix \"" + &crntToken.asString[0] + '\"');
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -850,7 +772,7 @@ void Scanner::checkNumber()
|
|
|
//======================================================================================================================
|
|
|
void Scanner::checkString()
|
|
|
{
|
|
|
- char* tmpStr = crntToken.asString;
|
|
|
+ char* tmpStr = &crntToken.asString[0];
|
|
|
char ch = getNextChar();
|
|
|
|
|
|
for(;;)
|
|
|
@@ -860,7 +782,7 @@ void Scanner::checkString()
|
|
|
{
|
|
|
crntToken.code = TC_ERROR;
|
|
|
*tmpStr = '\0';
|
|
|
- throw SCANNER_EXCEPTION("Incorrect string ending \"" + crntToken.asString + '\"');
|
|
|
+ throw SCANNER_EXCEPTION("Incorrect string ending \"" + &crntToken.asString[0] + '\"');
|
|
|
return;
|
|
|
}
|
|
|
// Escape Codes
|
|
|
@@ -871,7 +793,7 @@ void Scanner::checkString()
|
|
|
{
|
|
|
crntToken.code = TC_ERROR;
|
|
|
*tmpStr = '\0';
|
|
|
- throw SCANNER_EXCEPTION("Incorrect string ending \"" + crntToken.asString + '\"');
|
|
|
+ throw SCANNER_EXCEPTION("Incorrect string ending \"" + &crntToken.asString[0] + '\"');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -919,7 +841,7 @@ void Scanner::checkString()
|
|
|
{
|
|
|
*tmpStr = '\0';
|
|
|
crntToken.code = TC_STRING;
|
|
|
- crntToken.value.string = crntToken.asString;
|
|
|
+ crntToken.value.string = &crntToken.asString[0];
|
|
|
getNextChar();
|
|
|
return;
|
|
|
}
|
|
|
@@ -941,7 +863,7 @@ void Scanner::checkChar()
|
|
|
{
|
|
|
char ch = getNextChar();
|
|
|
char ch0 = ch;
|
|
|
- char* tmpStr = crntToken.asString;
|
|
|
+ char* tmpStr = &crntToken.asString[0];
|
|
|
|
|
|
crntToken.code = TC_ERROR;
|
|
|
*tmpStr++ = ch;
|
|
|
@@ -1293,3 +1215,6 @@ void Scanner::checkSpecial()
|
|
|
getNextChar();
|
|
|
crntToken.code = code;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+} // end namesapce
|