21[[nodiscard]] std::vector<std::vector<Token>>
22parse_arguments(
const std::vector<Token> &tokens, std::size_t start_index, std::size_t &end_index)
24 std::vector<std::vector<Token>> arguments;
25 std::vector<Token> current_arg;
28 for (std::size_t i = start_index; i < tokens.size(); ++i) {
29 const Token &tok = tokens[i];
33 current_arg.push_back(tok);
37 if (paren_depth == 0) {
39 if (!current_arg.empty()) {
40 arguments.push_back(std::move(current_arg));
45 current_arg.push_back(tok);
49 arguments.push_back(std::move(current_arg));
53 current_arg.push_back(tok);
58 end_index = tokens.size();
59 if (!current_arg.empty()) {
60 arguments.push_back(std::move(current_arg));
67std::vector<FunctionCallInfo>
70 std::vector<FunctionCallInfo> result;
72 for (std::size_t i = 0; i + 1 < tokens.size(); ++i) {
77 std::size_t end_index = 0;
78 auto arguments = parse_arguments(tokens, i + 2, end_index);
80 result.emplace_back(target_function_name, std::move(arguments), i);
92 std::vector<FunctionCallInfo> result;
94 for (std::size_t i = 0; i + 1 < tokens.size(); ++i) {
97 std::string func_name = tokens[i].text();
99 std::size_t end_index = 0;
100 auto arguments = parse_arguments(tokens, i + 2, end_index);
102 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.