summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2019-01-20 17:44:01 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2019-10-11 17:31:09 -0500
commitd4f9b8c4efe9ce48aac5b43487c5d6c5d5fbd83b (patch)
tree8969f4613dc1f350053d533d54b0b1df6be300b2 /Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
parent2a377e35ed3f3afefdb5dce5474f2c5bb9c89a54 (diff)
ExpressionParser: Allow unary functions to be used without parens around the argument. e.g. !`Up`
Diffstat (limited to 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp')
-rw-r--r--Source/Core/InputCommon/ControlReference/ExpressionParser.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
index d845939cc3..1c9ea370ce 100644
--- a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
+++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
@@ -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)
{