23[[nodiscard]] std::vector<std::vector<Token>>
24parse_arguments(
const std::vector<Token> &tokens, std::size_t start_index, std::size_t &end_index)
26 std::vector<std::vector<Token>> arguments;
27 std::vector<Token> current_arg;
30 for (std::size_t i = start_index; i < tokens.size(); ++i) {
31 const Token &tok = tokens[i];
35 current_arg.push_back(tok);
39 if (paren_depth == 0) {
41 if (!current_arg.empty()) {
42 arguments.push_back(std::move(current_arg));
47 current_arg.push_back(tok);
51 arguments.push_back(std::move(current_arg));
55 current_arg.push_back(tok);
60 end_index = tokens.size();
61 if (!current_arg.empty()) {
62 arguments.push_back(std::move(current_arg));
69std::vector<FunctionCallInfo>
72 std::vector<FunctionCallInfo> result;
74 for (std::size_t i = 0; i + 1 < tokens.size(); ++i) {
79 std::size_t end_index = 0;
80 auto arguments = parse_arguments(tokens, i + 2, end_index);
82 result.emplace_back(target_function_name, std::move(arguments), i);
94 std::vector<FunctionCallInfo> result;
96 for (std::size_t i = 0; i + 1 < tokens.size(); ++i) {
99 std::string func_name = tokens[i].text();
101 std::size_t end_index = 0;
102 auto arguments = parse_arguments(tokens, i + 2, end_index);
104 result.emplace_back(std::move(func_name), std::move(arguments), i);
std::vector< FunctionCallInfo > find_all_function_calls(const std::vector< Token > &tokens)
Finds all function call expressions within a token stream.
std::vector< FunctionCallInfo > find_function_calls(const std::vector< Token > &tokens, const std::string &target_function_name)
Finds all calls to a specific function within a token stream.