75 std::regex words_regex(re);
76 auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
77 auto words_end = std::sregex_iterator();
79 return std::distance(words_begin, words_end);
89 const std::string content = read_file_to_string(filename);
90 if (content.empty()) {
94 const std::regex particle_regex(
"(Incoming|Outgoing)\\s*\\(\\s*\"([^\"]+)\"");
96 auto parse_particle_list = [&](
const std::string& particle_list) {
98 auto begin = std::sregex_iterator(particle_list.begin(), particle_list.end(), particle_regex);
99 auto end = std::sregex_iterator();
101 for (
auto it = begin; it != end; ++it) {
102 const std::string direction = (*it)[1].str();
105 if (direction ==
"Incoming") {
106 process.
incoming.push_back(particle);
108 process.
outgoing.push_back(particle);
116 if (
const auto particle_list = first_braced_argument_list_after_compute(content);
117 particle_list.has_value()) {
118 auto process = parse_particle_list(*particle_list);
119 if (!process.
empty()) {
129 for (std::size_t brace = content.find(
'{'); brace != std::string::npos;
130 brace = content.find(
'{', brace + 1)) {
132 bool in_string =
false;
133 bool escaped =
false;
135 for (std::size_t i = brace; i < content.size(); ++i) {
136 const char c = content[i];
141 }
else if (c ==
'\\') {
143 }
else if (c ==
'"') {
156 }
else if (c ==
'}') {
159 auto process = parse_particle_list(content.substr(brace, i - brace + 1));
160 if (!process.
empty()) {
173 particle_name.erase(std::remove_if(particle_name.begin(), particle_name.end(),
174 [](
unsigned char c) { return std::isspace(c); }), particle_name.end());
176 if (!particle_name.empty() && particle_name.front() ==
'~') {
177 particle_name.erase(particle_name.begin());
180 std::transform(particle_name.begin(), particle_name.end(), particle_name.begin(),
181 [](
unsigned char c) { return static_cast<char>(std::tolower(c)); });
183 if (particle_name ==
"gamma" || particle_name ==
"photon") {
187 return particle_name;