replaced context-sensitive implementation of allowing digits at the beginning of names with a more general implementation (Fixes #1730)

sceneinput
Marc Zinnschlag 9 years ago
parent c693656307
commit 4d94f38f4b

@ -63,7 +63,6 @@ namespace Compiler
if (mState==BeginState && keyword==Scanner::K_begin) if (mState==BeginState && keyword==Scanner::K_begin)
{ {
mState = NameState; mState = NameState;
scanner.allowNameStartingwithDigit();
return true; return true;
} }
@ -110,7 +109,6 @@ namespace Compiler
scanner.scan (mScriptParser); scanner.scan (mScriptParser);
mState = EndNameState; mState = EndNameState;
scanner.allowNameStartingwithDigit();
return true; return true;
} }

@ -47,9 +47,6 @@ namespace Compiler
bool Scanner::scanToken (Parser& parser) bool Scanner::scanToken (Parser& parser)
{ {
bool allowDigit = mNameStartingWithDigit;
mNameStartingWithDigit = false;
switch (mPutback) switch (mPutback)
{ {
case Putback_Special: case Putback_Special:
@ -114,7 +111,6 @@ namespace Compiler
else if (isWhitespace (c)) else if (isWhitespace (c))
{ {
mLoc.mLiteral.clear(); mLoc.mLiteral.clear();
mNameStartingWithDigit = allowDigit;
return true; return true;
} }
else if (c==':') else if (c==':')
@ -123,7 +119,7 @@ namespace Compiler
mLoc.mLiteral.clear(); mLoc.mLiteral.clear();
return true; return true;
} }
else if (std::isalpha (c) || c=='_' || c=='"' || (allowDigit && std::isdigit (c))) else if (std::isalpha (c) || c=='_' || c=='"')
{ {
bool cont = false; bool cont = false;
@ -179,10 +175,18 @@ namespace Compiler
{ {
value += c; value += c;
} }
else if (std::isalpha (c) || c=='_') else if (isStringCharacter (c))
{
error = true; error = true;
else if (c=='.' && !error) value += c;
}
else if (c=='.')
{ {
if (error)
{
putback (c);
break;
}
return scanFloat (value, parser, cont); return scanFloat (value, parser, cont);
} }
else else
@ -193,7 +197,15 @@ namespace Compiler
} }
if (error) if (error)
return false; {
/// workaround that allows names to begin with digits
/// \todo disable
TokenLoc loc (mLoc);
mLoc.mLiteral.clear();
cont = parser.parseName (value, loc, *this);
return true;
// return false;
}
TokenLoc loc (mLoc); TokenLoc loc (mLoc);
mLoc.mLiteral.clear(); mLoc.mLiteral.clear();
@ -555,8 +567,7 @@ namespace Compiler
Scanner::Scanner (ErrorHandler& errorHandler, std::istream& inputStream, Scanner::Scanner (ErrorHandler& errorHandler, std::istream& inputStream,
const Extensions *extensions) const Extensions *extensions)
: mErrorHandler (errorHandler), mStream (inputStream), mExtensions (extensions), : mErrorHandler (errorHandler), mStream (inputStream), mExtensions (extensions),
mPutback (Putback_None), mPutbackCode(0), mPutbackInteger(0), mPutbackFloat(0), mPutback (Putback_None), mPutbackCode(0), mPutbackInteger(0), mPutbackFloat(0)
mNameStartingWithDigit (false)
{ {
} }
@ -608,9 +619,4 @@ namespace Compiler
if (mExtensions) if (mExtensions)
mExtensions->listKeywords (keywords); mExtensions->listKeywords (keywords);
} }
void Scanner::allowNameStartingwithDigit()
{
mNameStartingWithDigit = true;
}
} }

@ -124,9 +124,6 @@ namespace Compiler
void listKeywords (std::vector<std::string>& keywords); void listKeywords (std::vector<std::string>& keywords);
///< Append all known keywords to \a kaywords. ///< Append all known keywords to \a kaywords.
/// For the next token allow names to start with a digit.
void allowNameStartingwithDigit();
}; };
} }

Loading…
Cancel
Save