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:
Marc Zinnschlag 2010-07-01 11:07:21 +02:00
parent bf55880ce9
commit 1674d406dc
3 changed files with 116 additions and 20 deletions

View file

@ -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)

View file

@ -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;
}
} }

View file

@ -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
}; };
} }