diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2019-01-20 17:44:01 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2019-10-11 17:31:09 -0500 |
| commit | d4f9b8c4efe9ce48aac5b43487c5d6c5d5fbd83b (patch) | |
| tree | 8969f4613dc1f350053d533d54b0b1df6be300b2 /Source/Core/InputCommon/ControlReference/ExpressionParser.cpp | |
| parent | 2a377e35ed3f3afefdb5dce5474f2c5bb9c89a54 (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.cpp | 31 |
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) { |
