| | |
| | | |
| | | namespace ScriptInterpreterHelpers { |
| | | |
| | | static std::string extractSubstring(const std::string & str, size_t start, size_t end) { |
| | | static std::string extractSubstring(const std::string & str, const size_t & start, const size_t & end) { |
| | | if (start >= 0 && start < str.length() && end >= start && end < str.length()) { |
| | | return str.substr(start, end - start + 1); |
| | | } |
| | |
| | | |
| | | // check the arguments types |
| | | if (tokens[i].type != TokenType::StringDeclaration && tokens[i].type != TokenType::BooleanDeclaration && |
| | | tokens[i].type != TokenType::IntDeclaration && tokens[i].type != TokenType::DoubleDeclaration) { |
| | | tokens[i].type != TokenType::IntDeclaration && tokens[i].type != TokenType::DoubleDeclaration && |
| | | tokens[i].type != TokenType::RightParenthesis) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "variable declaration", file, line); |
| | | } |
| | | const auto parameter_type = getVariableTypeFromTokenTypeDeclaration(tokens[i].type); |
| | | if (parameter_type == Variables::Type::VT_NOT_DEFINED) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | if (tokens[i].type != TokenType::RightParenthesis) { |
| | | const auto parameter_type = getVariableTypeFromTokenTypeDeclaration(tokens[i].type); |
| | | if (parameter_type == Variables::Type::VT_NOT_DEFINED) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | } |
| | | |
| | | if (parameter_type == Variables::Type::VT_FUNCTION) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | } |
| | | |
| | | if (parameter_type == Variables::Type::VT_NULL) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | } |
| | | |
| | | Value val; |
| | | val.type = parameter_type; |
| | | val.token = tokens[i]; |
| | | |
| | | arguments.emplace_back(std::move(val)); |
| | | i++; // Skip variable declaration |
| | | } |
| | | |
| | | if (parameter_type == Variables::Type::VT_FUNCTION) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | } |
| | | |
| | | if (parameter_type == Variables::Type::VT_NULL) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], "valid type identifier", file, line); |
| | | } |
| | | |
| | | Value val; |
| | | val.type = parameter_type; |
| | | val.token = tokens[i]; |
| | | |
| | | arguments.emplace_back(std::move(val)); |
| | | i++; // Skip variable declaration |
| | | |
| | | if (tokens[i].type != TokenType::RightParenthesis) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR_HELPER(tokens[i], ") - Only one argument is allowed", file, line); |
| | |
| | | return arguments; |
| | | } |
| | | |
| | | [[nodiscard]] static std::string getFunctionBody(const std::vector<Token> & tokens, std::size_t & i) { |
| | | const size_t first_index = i; |
| | | static void getFunctionBody(const std::vector<Token> & tokens, std::size_t & i, std::size_t & start, |
| | | std::size_t & end) { |
| | | start = tokens[i].pos.end; |
| | | std::cout << "START Token: " << tokens[i].lexeme << " start pos: " << std::to_string(tokens[i].pos.start) |
| | | << " end pos: " << std::to_string(tokens[i].pos.end) << std::endl; |
| | | |
| | | if (i >= tokens.size() || tokens[i].type != TokenType::LeftCurlyBracket) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR(tokens[i], "{"); |
| | | } |
| | | i++; // Skip '{' |
| | | std::string lines; |
| | | |
| | | while (i < tokens.size() && tokens[i].type != TokenType::RightCurlyBracket) { |
| | | if (tokens[i].type == TokenType::EndOfLine) { |
| | | lines += "\n"; |
| | | i++; |
| | | continue; |
| | | } |
| | |
| | | throw std::runtime_error("Unexpected end of file"); |
| | | break; |
| | | } |
| | | lines += tokens[i].lexeme + " "; |
| | | i++; |
| | | } |
| | | end = tokens[i].pos.start - 1; |
| | | |
| | | std::cout << "END Token: " << tokens[i].lexeme << " start pos: " << std::to_string(tokens[i].pos.start) |
| | | << " end pos: " << std::to_string(tokens[i].pos.end) << std::endl; |
| | | |
| | | if (i >= tokens.size() || tokens[i].type != TokenType::RightCurlyBracket) { |
| | | THROW_UNEXPECTED_TOKEN_ERROR(tokens[i], "}"); |
| | | } |
| | | return lines; |
| | | }; |
| | | |
| | | }; // namespace ScriptInterpreterHelpers |