ExpressionParser: Allow unary functions to be used without parens around the argument. e.g. !`Up`

This commit is contained in:
Jordan Woyak 2019-01-20 17:44:01 -06:00
parent 2a377e35ed
commit d4f9b8c4ef
1 changed files with 26 additions and 5 deletions

View File

@ -839,7 +839,14 @@ private:
std::vector<Token> tokens;
std::vector<Token>::iterator m_it;
Token Chew() { return *m_it++; }
Token Chew()
{
const Token tok = Peek();
if (TOK_EOF != tok.type)
++m_it;
return tok;
}
Token Peek() { return *m_it; }
bool Expects(TokenType type)
@ -850,14 +857,28 @@ private:
FunctionArguments ParseFunctionArguments()
{
if (!Expects(TOK_LPAREN))
return {ParseStatus::SyntaxError};
std::vector<std::unique_ptr<Expression>> args;
if (TOK_LPAREN != Peek().type)
{
// Single argument with no parens (useful for unary ! function)
auto arg = ParseAtom(Chew());
if (ParseStatus::Successful != arg.status)
return {ParseStatus::SyntaxError};
args.emplace_back(std::move(arg.expr));
return {ParseStatus::Successful, std::move(args)};
}
// Chew the L-Paren
Chew();
// Check for empty argument list:
if (TOK_RPAREN == Peek().type)
{
Chew();
return {ParseStatus::Successful};
std::vector<std::unique_ptr<Expression>> args;
}
while (true)
{