Это кажется слишком широким, чтобы отвечать.
Что вы делаете, это парсинг ввода и преобразование его во что-то другое. То, что вы не делаете, это находите / заменяйте (в противном случае вы будете в порядке с помощью регулярных выражений).
Конечно, вы можете делать то же, что и регулярные выражения, но я не уверен, что это что-то вас купит:
template <typename It, typename Out>
Out preprocess(It f, It l, Out out) {
namespace qi = boost::spirit::qi;
using boost::spirit::repository::qi::seek;
auto passthrough = [&out](boost::iterator_range<It> ignored, auto&&...) {
for (auto ch : ignored) *out++ = ch;
};
auto transform = [&out](std::string const& literal, auto&&...) {
for (auto ch : "someObject.find(\"~"s) *out++ = ch;
for (auto ch : literal) *out++ = ch;
for (auto ch : "\")"s) *out++ = ch;
};
auto pattern = qi::copy("\"~" >> (*~qi::char_('"')) >> '"');
qi::rule<It> ignore = qi::raw[+(!pattern >> qi::char_)] [passthrough];
qi::parse(f, l, -qi::as_string[pattern][transform] % ignore);
return out;
}
Хорошая особенность этого способа записи в том, что он будет работать с любым исходным итератором:
for (std::string const input : {
R"(function foo(a, b) { var path = "~/1/2"; })",
})
{
std::cout << "Input: " << input << "\n";
std::string result;
preprocess(begin(input), end(input), back_inserter(result));
std::cout << "Result: " << result << "\n";
}
std::cout << "\n -- Or directly transformed stdin to stdout:\n";
preprocess(
boost::spirit::istream_iterator(std::cin >> std::noskipws), {},
std::ostreambuf_iterator<char>(std::cout));
Просмотр Live On Coliru , печать вывод:
Input: function foo(a, b) { var path = "~/1/2"; }
Result: function foo(a, b) { var path = someObject.find("~/1/2"); }
-- Or directly transformed stdin to stdout:
function bar(c, d) { var path = someObject.find("~/1/42"); }
Но это очень ограничено, поскольку он даже не будет делать правильные вещи, если такие вещи являются частями комментариев или многострочных строк et c.
Так что вместо этого вы, вероятно, захотите выделенную библиотеку, которая знает, как анализировать javascript и использовать ее для выполнения преобразования, например (один из первых попаданий при поиске в Google tooling library preprocess javascript transform
): https://clojurescript.org/reference/javascript-library-preprocessing