diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2019-10-12 11:41:02 -0500 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2019-10-12 11:41:02 -0500 |
| commit | 72302d9c4224271a606f2782dec7dc725658b150 (patch) | |
| tree | 609d7542cc7446a85d0100ace75f416f93854f8a /Source/Core/InputCommon/ControlReference | |
| parent | b4e2b3cae330be2a9f050a90c3bbb9d38f047777 (diff) | |
ExpressionParser: Add support for /* */ style comments.
Diffstat (limited to 'Source/Core/InputCommon/ControlReference')
| -rw-r--r-- | Source/Core/InputCommon/ControlReference/ExpressionParser.cpp | 35 | ||||
| -rw-r--r-- | Source/Core/InputCommon/ControlReference/ExpressionParser.h | 5 |
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 |
