summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControlReference
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2019-10-12 11:41:02 -0500
committerJordan Woyak <jordan.woyak@gmail.com>2019-10-12 11:41:02 -0500
commit72302d9c4224271a606f2782dec7dc725658b150 (patch)
tree609d7542cc7446a85d0100ace75f416f93854f8a /Source/Core/InputCommon/ControlReference
parentb4e2b3cae330be2a9f050a90c3bbb9d38f047777 (diff)
ExpressionParser: Add support for /* */ style comments.
Diffstat (limited to 'Source/Core/InputCommon/ControlReference')
-rw-r--r--Source/Core/InputCommon/ControlReference/ExpressionParser.cpp35
-rw-r--r--Source/Core/InputCommon/ControlReference/ExpressionParser.h5
2 files changed, 36 insertions, 4 deletions
diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
index 0d1d0fdbea..7e8e54b1ec 100644
--- a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
+++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp
@@ -87,6 +87,14 @@ Token Lexer::GetRealLiteral(char first_char)
return Token(TOK_INVALID);
}
+Token Lexer::PeekToken()
+{
+ const auto old_it = it;
+ const auto tok = NextToken();
+ it = old_it;
+ return tok;
+}
+
Token Lexer::NextToken()
{
if (it == expr.end())
@@ -99,7 +107,7 @@ Token Lexer::NextToken()
case '\t':
case '\n':
case '\r':
- return Token(TOK_DISCARD);
+ return Token(TOK_WHITESPACE);
case '(':
return Token(TOK_LPAREN);
case ')':
@@ -154,8 +162,19 @@ ParseStatus Lexer::Tokenize(std::vector<Token>& tokens)
tok.string_position = string_position;
tok.string_length = it - expr.begin();
- if (tok.type == TOK_DISCARD)
- continue;
+ // Handle /* */ style comments.
+ if (tok.type == TOK_DIV && PeekToken().type == TOK_MUL)
+ {
+ const auto end_of_comment = expr.find("*/", it - expr.begin());
+
+ if (end_of_comment == std::string::npos)
+ return ParseStatus::SyntaxError;
+
+ tok.type = TOK_COMMENT;
+ tok.string_length = end_of_comment + 4;
+
+ it = expr.begin() + end_of_comment + 2;
+ }
tokens.push_back(tok);
@@ -671,9 +690,19 @@ static ParseResult ParseComplexExpression(const std::string& str)
if (tokenize_status != ParseStatus::Successful)
return ParseResult::MakeErrorResult(Token(TOK_INVALID), _trans("Tokenizing failed."));
+ RemoveInertTokens(&tokens);
return ParseTokens(tokens);
}
+void RemoveInertTokens(std::vector<Token>* tokens)
+{
+ tokens->erase(std::remove_if(tokens->begin(), tokens->end(),
+ [](const Token& tok) {
+ return tok.type == TOK_COMMENT || tok.type == TOK_WHITESPACE;
+ }),
+ tokens->end());
+}
+
static std::unique_ptr<Expression> ParseBarewordExpression(const std::string& str)
{
ControlQualifier qualifier;
diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.h b/Source/Core/InputCommon/ControlReference/ExpressionParser.h
index 2f41d2fde7..994f8c201b 100644
--- a/Source/Core/InputCommon/ControlReference/ExpressionParser.h
+++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.h
@@ -15,7 +15,7 @@ namespace ciface::ExpressionParser
{
enum TokenType
{
- TOK_DISCARD,
+ TOK_WHITESPACE,
TOK_INVALID,
TOK_EOF,
TOK_LPAREN,
@@ -25,6 +25,7 @@ enum TokenType
TOK_LITERAL,
TOK_VARIABLE,
TOK_BAREWORD,
+ TOK_COMMENT,
// Binary Ops:
TOK_BINARY_OPS_BEGIN,
TOK_AND = TOK_BINARY_OPS_BEGIN,
@@ -95,6 +96,7 @@ private:
Token GetBareword(char c);
Token GetRealLiteral(char c);
+ Token PeekToken();
Token NextToken();
};
@@ -186,5 +188,6 @@ private:
ParseResult ParseExpression(const std::string& expr);
ParseResult ParseTokens(const std::vector<Token>& tokens);
+void RemoveInertTokens(std::vector<Token>* tokens);
} // namespace ciface::ExpressionParser