mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 17:09:40 +00:00
made usage of comma as argument separator optional (largely untested, because we don't have anything that takes more than one argument)
This commit is contained in:
parent
bf55880ce9
commit
1674d406dc
3 changed files with 116 additions and 20 deletions
|
@ -197,8 +197,12 @@ namespace Compiler
|
||||||
mTokenLoc = loc;
|
mTokenLoc = loc;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return Parser::parseInt (value, loc, scanner);
|
{
|
||||||
|
// no comma was used between arguments
|
||||||
|
scanner.putbackInt (value, loc);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExprParser::parseFloat (float value, const TokenLoc& loc, Scanner& scanner)
|
bool ExprParser::parseFloat (float value, const TokenLoc& loc, Scanner& scanner)
|
||||||
|
@ -211,8 +215,12 @@ namespace Compiler
|
||||||
mTokenLoc = loc;
|
mTokenLoc = loc;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return Parser::parseFloat (value, loc, scanner);
|
{
|
||||||
|
// no comma was used between arguments
|
||||||
|
scanner.putbackFloat (value, loc);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExprParser::parseName (const std::string& name, const TokenLoc& loc,
|
bool ExprParser::parseName (const std::string& name, const TokenLoc& loc,
|
||||||
|
@ -232,6 +240,12 @@ namespace Compiler
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no comma was used between arguments
|
||||||
|
scanner.putbackName (name, loc);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return Parser::parseName (name, loc, scanner);
|
return Parser::parseName (name, loc, scanner);
|
||||||
}
|
}
|
||||||
|
@ -239,16 +253,25 @@ namespace Compiler
|
||||||
bool ExprParser::parseKeyword (int keyword, const TokenLoc& loc, Scanner& scanner)
|
bool ExprParser::parseKeyword (int keyword, const TokenLoc& loc, Scanner& scanner)
|
||||||
{
|
{
|
||||||
mFirst = false;
|
mFirst = false;
|
||||||
|
|
||||||
if (keyword==Scanner::K_getsquareroot && mNextOperand)
|
|
||||||
{
|
|
||||||
mTokenLoc = loc;
|
|
||||||
parseArguments ("f", scanner);
|
|
||||||
|
|
||||||
Generator::squareRoot (mCode);
|
if (mNextOperand)
|
||||||
|
{
|
||||||
mNextOperand = false;
|
if (keyword==Scanner::K_getsquareroot)
|
||||||
return true;
|
{
|
||||||
|
mTokenLoc = loc;
|
||||||
|
parseArguments ("f", scanner);
|
||||||
|
|
||||||
|
Generator::squareRoot (mCode);
|
||||||
|
|
||||||
|
mNextOperand = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no comma was used between arguments
|
||||||
|
scanner.putbackKeyword (keyword, loc);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Parser::parseKeyword (keyword, loc, scanner);
|
return Parser::parseKeyword (keyword, loc, scanner);
|
||||||
|
@ -290,11 +313,20 @@ namespace Compiler
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code==Scanner::S_open && mNextOperand)
|
if (code==Scanner::S_open)
|
||||||
{
|
{
|
||||||
mOperators.push_back ('(');
|
if (mNextOperand)
|
||||||
mTokenLoc = loc;
|
{
|
||||||
return true;
|
mOperators.push_back ('(');
|
||||||
|
mTokenLoc = loc;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no comma was used between arguments
|
||||||
|
scanner.putbackKeyword (code, loc);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code==Scanner::S_close && !mNextOperand)
|
if (code==Scanner::S_close && !mNextOperand)
|
||||||
|
|
|
@ -46,10 +46,29 @@ namespace Compiler
|
||||||
switch (mPutback)
|
switch (mPutback)
|
||||||
{
|
{
|
||||||
case Putback_Special:
|
case Putback_Special:
|
||||||
{
|
|
||||||
mPutback = Putback_None;
|
mPutback = Putback_None;
|
||||||
return parser.parseSpecial (mPutbackCode, mPutbackLoc, *this);
|
return parser.parseSpecial (mPutbackCode, mPutbackLoc, *this);
|
||||||
}
|
|
||||||
|
case Putback_Integer:
|
||||||
|
|
||||||
|
mPutback = Putback_None;
|
||||||
|
return parser.parseInt (mPutbackInteger, mPutbackLoc, *this);
|
||||||
|
|
||||||
|
case Putback_Float:
|
||||||
|
|
||||||
|
mPutback = Putback_None;
|
||||||
|
return parser.parseFloat (mPutbackFloat, mPutbackLoc, *this);
|
||||||
|
|
||||||
|
case Putback_Name:
|
||||||
|
|
||||||
|
mPutback = Putback_None;
|
||||||
|
return parser.parseName (mPutbackName, mPutbackLoc, *this);
|
||||||
|
|
||||||
|
case Putback_Keyword:
|
||||||
|
|
||||||
|
mPutback = Putback_None;
|
||||||
|
return parser.parseKeyword (mPutbackCode, mPutbackLoc, *this);
|
||||||
|
|
||||||
case Putback_None:
|
case Putback_None:
|
||||||
|
|
||||||
|
@ -441,5 +460,33 @@ namespace Compiler
|
||||||
mPutbackCode = code;
|
mPutbackCode = code;
|
||||||
mPutbackLoc = loc;
|
mPutbackLoc = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scanner::putbackInt (int value, const TokenLoc& loc)
|
||||||
|
{
|
||||||
|
mPutback = Putback_Integer;
|
||||||
|
mPutbackInteger = value;
|
||||||
|
mPutbackLoc = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scanner::putbackFloat (float value, const TokenLoc& loc)
|
||||||
|
{
|
||||||
|
mPutback = Putback_Float;
|
||||||
|
mPutbackFloat = value;
|
||||||
|
mPutbackLoc = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scanner::putbackName (const std::string& name, const TokenLoc& loc)
|
||||||
|
{
|
||||||
|
mPutback = Putback_Name;
|
||||||
|
mPutbackName = name;
|
||||||
|
mPutbackLoc = loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scanner::putbackKeyword (int keyword, const TokenLoc& loc)
|
||||||
|
{
|
||||||
|
mPutback = Putback_Keyword;
|
||||||
|
mPutbackCode = keyword;
|
||||||
|
mPutbackLoc = loc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,8 @@ namespace Compiler
|
||||||
{
|
{
|
||||||
enum putback_type
|
enum putback_type
|
||||||
{
|
{
|
||||||
Putback_None, Putback_Special,
|
Putback_None, Putback_Special, Putback_Integer, Putback_Float,
|
||||||
|
Putback_Name, Putback_Keyword
|
||||||
};
|
};
|
||||||
|
|
||||||
ErrorHandler& mErrorHandler;
|
ErrorHandler& mErrorHandler;
|
||||||
|
@ -29,6 +30,9 @@ namespace Compiler
|
||||||
std::istream& mStream;
|
std::istream& mStream;
|
||||||
putback_type mPutback;
|
putback_type mPutback;
|
||||||
int mPutbackCode;
|
int mPutbackCode;
|
||||||
|
int mPutbackInteger;
|
||||||
|
float mPutbackFloat;
|
||||||
|
std::string mPutbackName;
|
||||||
TokenLoc mPutbackLoc;
|
TokenLoc mPutbackLoc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -90,6 +94,19 @@ namespace Compiler
|
||||||
|
|
||||||
void putbackSpecial (int code, const TokenLoc& loc);
|
void putbackSpecial (int code, const TokenLoc& loc);
|
||||||
///< put back a special token
|
///< put back a special token
|
||||||
|
|
||||||
|
void putbackInt (int value, const TokenLoc& loc);
|
||||||
|
///< put back an integer token
|
||||||
|
|
||||||
|
void putbackFloat (float value, const TokenLoc& loc);
|
||||||
|
///< put back a float token
|
||||||
|
|
||||||
|
void putbackName (const std::string& name, const TokenLoc& loc);
|
||||||
|
///< put back a name toekn
|
||||||
|
|
||||||
|
void putbackKeyword (int keyword, const TokenLoc& loc);
|
||||||
|
///< put back a keyword token
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue