8#include <unordered_set>
17#include <unordered_map>
29 "bool",
"char",
"double",
"float",
"long",
"short",
"int",
"void",
35const std::unordered_set<std::string>
access_specifiers = {
"public",
"protected",
"private"};
109 "alignas",
"alignof",
"and",
"and_eq",
"asm",
110 "auto",
"bitand",
"bitor",
"break",
"case",
111 "catch",
"char16_t",
"char32_t",
"class",
"compl",
112 "const",
"constexpr",
"const_cast",
"continue",
"decltype",
113 "default",
"delete",
"do",
"dynamic_cast",
"else",
114 "enum",
"explicit",
"export",
"extern",
"false",
115 "for",
"friend",
"goto",
"if",
"inline",
116 "mutable",
"namespace",
"new",
"noexcept",
"not",
117 "not_eq",
"nullptr",
"operator",
"or",
"or_eq",
118 "private",
"protected",
"public",
"register",
"reinterpret_cast",
119 "return",
"signed",
"sizeof",
"static",
"static_assert",
120 "static_cast",
"struct",
"switch",
"template",
"this",
121 "thread_local",
"throw",
"true",
"try",
"typedef",
122 "typeid",
"typename",
"union",
"unsigned",
"using",
123 "virtual",
"volatile",
"wchar_t",
"while",
"xor",
126inline std::string
truncate(
const std::string &
s,
int cutoff = 50) {
150 mla.
add(
"ParseResult {");
152 mla.
add(
"succeeded: ", (
r.succeeded ?
"true" :
"false"));
153 mla.
add(
"parser_name: \"",
r.parser_name,
"\"");
154 mla.
add(
"start: ",
r.start,
", end: ",
r.end);
155 mla.
add(
"match: \"",
r.match,
"\"");
157 if (!
r.sub_results.empty()) {
158 mla.
add(
"sub_results: [");
160 for (
const auto &sub :
r.sub_results) {
182 const std::string &substr);
186 std::vector<const cpp_parsing::ParseResult *> &out);
191 const std::vector<std::string> &names);
196std::ostream &
print_parse_result(std::ostream &os,
const ParseResult &result,
int indent = 0);
197std::ostream &
operator<<(std::ostream &os,
const ParseResult &result);
218CharParserPtr until_char(std::vector<char> target_chars,
bool inclusive =
true,
bool ignore_in_strings_and_chars =
true,
219 const std::string &name =
"");
224 std::vector<CharParserPtr> ls;
225 for (
const auto &
l : literals) {
233 std::string right =
"}");
235 std::string left =
"{", std::string right =
"}");
239CharParserPtr if_then(std::shared_ptr<CharParser> condition_parser, std::shared_ptr<CharParser> then_parser,
240 const std::string &name =
"if_then");
241CharParserPtr any_of(std::vector<CharParserPtr> parsers,
const std::string &name =
"any_of");
243 std::string name =
"not_any_of");
259 auto result = inner->parse(input, start);
264 std::shared_ptr<CharParser> inner;
274 while (
i < input.size() && std::isdigit(
static_cast<unsigned char>(input[
i]))) {
283 std::string matched = input.substr(start,
i - start);
297 const size_t len = input.size();
300 logger.debug(
"{} parser failed: start position {} beyond input length {}",
name, start, len);
301 return {
false,
name, start, start,
"", {}};
305 if (!isIdentifierStartChar(
c)) {
306 logger.debug(
"{} parser failed: first char '{}' at position {} is not valid start char",
name,
c, pos);
307 return {
false,
name, start, start,
"", {}};
311 while (pos < len && isIdentifierContinueChar(input[pos])) {
315 std::string matched = input.substr(start, pos - start);
316 logger.debug(
"{} parser succeeded: matched '{}' from {} to {}",
name, matched, start, pos);
318 return {
true,
name, start, pos, std::move(matched), {}};
322 static bool isIdentifierStartChar(
char c) {
return (std::isalpha(
static_cast<unsigned char>(
c)) ||
c ==
'_'); }
323 static bool isIdentifierContinueChar(
char c) {
return (std::isalnum(
static_cast<unsigned char>(
c)) ||
c ==
'_'); }
335 auto result = inner_parser->parse(input, start);
338 if (result.succeeded) {
339 logger.debug(
"{} parser: inner parser succeeded, returning {}",
name, result.to_string());
343 logger.debug(
"OptionalParser: inner parser failed, returning original position ");
349 std::shared_ptr<CharParser> inner_parser;
354 IfThenParser(std::shared_ptr<CharParser> condition_parser, std::shared_ptr<CharParser> then_parser,
355 const std::string &
name =
"if_then")
356 :
CharParser(
name), condition(
std::move(condition_parser)), then_clause(
std::move(then_parser)) {}
362 size_t current = start;
363 std::vector<ParseResult> results;
366 auto first_result = condition->parse(input, current);
367 results.push_back(first_result);
369 if (!first_result.succeeded) {
376 current = first_result.end;
377 auto second_result = then_clause->parse(input, current);
378 results.push_back(second_result);
380 return {first_result.succeeded && second_result.succeeded,
name, start, second_result.end,
385 std::shared_ptr<CharParser> condition;
386 std::shared_ptr<CharParser> then_clause;
393 std::shared_ptr<CharParser> actual_parser;
406 if (!actual_parser) {
407 throw std::runtime_error(
"DeferredParser: actual parser not set");
409 return actual_parser->parse(input, start);
422 while (
i < input.size()) {
424 if (std::isspace(
static_cast<unsigned char>(
c))) {
425 logger.debug(
" Whitespace at position {}",
i);
428 logger.debug(
" Non-whitespace at position {} we got {} instead, stopping",
i,
c);
433 std::string ws = input.substr(start,
i - start);
434 return {
true,
name, start,
i, ws};
448 if (
i >= input.size()) {
449 logger.debug(
" Empty input or out of bounds");
450 return {
false,
name,
i,
i,
""};
453 char first_char = input[
i];
454 if (!(std::isalpha(first_char) || first_char ==
'_')) {
455 logger.debug(
" First character '{}' is not a valid start of variable", first_char);
456 return {
false,
name,
i,
i,
""};
460 while (
i < input.size()) {
462 if (std::isalnum(
c) ||
c ==
'_') {
469 std::string var_name = input.substr(start,
i - start);
470 logger.debug(
" Parsed variable name: '{}'", var_name);
473 if (is_cpp_keyword) {
474 logger.debug(
" Rejected: '{}' is a C++ keyword", var_name);
475 return {
false,
name,
i,
i,
""};
478 return {
true,
name, start,
i, var_name};
486 return parse_type_internal(input, start, 0);
490 bool is_valid_char(
char c)
const {
return std::isalnum(
static_cast<unsigned char>(
c)) ||
c ==
'_' ||
c ==
':'; }
492 ParseResult parse_type_internal(
const std::string &input,
size_t start,
int depth)
const {
498 while (
i < input.size()) {
502 if (is_valid_char(
c)) {
505 }
else if (
c ==
'<') {
506 logger.
debug(
" Found '<', parsing type argument list...");
509 while (
i < input.size()) {
511 auto inner_result = parse_type_internal(input,
i, depth + 1);
512 if (!inner_result.succeeded) {
513 logger.
debug(
" Failed to parse inner type at position {}",
i);
514 return {
false,
name,
i,
i,
""};
517 i = inner_result.end;
518 logger.
debug(
" Parsed type argument up to position ",
i);
520 if (
i >= input.size()) {
521 logger.
debug(
" Unexpected end of input after type argument");
522 return {
false,
name,
i,
i,
""};
525 if (input[
i] ==
',') {
526 if (input[
i] ==
',') {
527 logger.
debug(
" Found ',', continuing to next type argument");
531 while (
i < input.size() && std::isspace(
static_cast<unsigned char>(input[
i]))) {
537 }
else if (input[
i] ==
'>') {
546 logger.
debug(
" Unexpected character '{}' while parsing type "
549 return {
false,
name,
i,
i,
""};
553 logger.
debug(
" Reached end of input while parsing type arguments");
554 return {
false,
name,
i,
i,
""};
555 }
else if (
c ==
'>') {
557 logger.
debug(
" Found '>' at depth 0, stopping parse here at position {}",
i);
563 }
else if (
c ==
',') {
565 logger.
debug(
" Found ',' at depth 0, treating as end of type");
568 logger.
debug(
" Found ',' at depth {}, returning to caller", depth);
577 std::string
type = input.substr(start,
i - start);
582 return {
false,
name, start, start,
""};
585 logger.
debug(
"Exiting parse_type at position {} with depth {}",
i, depth);
594 static const std::unordered_set<std::string> qualifiers = {
"const",
"volatile",
"static",
"extern",
595 "mutable",
"register",
"inline",
"thread_local",
596 "constexpr",
"consteval",
"constinit"};
602 std::vector<std::string> found_qualifiers;
604 while (
i < input.size()) {
606 size_t whitespace_start =
i;
607 while (
i < input.size() && std::isspace(input[
i]))
609 if (
i >= input.size())
613 size_t word_start =
i;
614 while (
i < input.size() && std::isalpha(input[
i]))
616 std::string word = input.substr(word_start,
i - word_start);
621 logger.debug(
" Found word: {}", word);
623 if (qualifiers.count(word)) {
624 found_qualifiers.push_back(word);
626 logger.debug(
" Word: {} is not a qualifier. Stopping", word);
633 if (!found_qualifiers.empty()) {
634 logger.debug(
" Parsed qualifiers:");
635 for (
const auto &
q : found_qualifiers)
640 logger.debug(
" No qualifiers found");
641 return {
false,
name,
i,
i,
""};
654 if (start + literal_.size() > input.size()) {
656 logger.debug(
" Not enough input left to match. Needed: {}, available: {}", literal_.size(),
657 (input.size() - start));
659 return {
false,
name, start, start,
""};
662 std::string_view slice = std::string_view(input).substr(start, literal_.size());
664 logger.debug(
" Comparing {} to {}", slice, literal_);
666 if (slice == literal_) {
667 logger.debug(
" Match succeeded. Advancing to position {}", start + literal_.size());
668 auto end = start + literal_.size();
671 logger.debug(
" Match failed.");
672 return {
false,
name, start, start,
""};
677 std::string literal_;
693 if (start >= input.size() || !starts_with(input, start,
left_str)) {
695 return {
false,
name, start, start,
""};
699 bool in_string =
false;
700 bool in_char =
false;
701 bool escape_next =
false;
704 while (
i < input.size()) {
716 }
else if (
c ==
'"') {
726 }
else if (
c ==
'\'') {
756 logger.debug(
" Found matching closing sequence at position {}", end -
right_str.size());
765 logger.debug(
" Matching closing sequence not found");
770 static bool starts_with(
const std::string &
s,
size_t pos,
const std::string &prefix) {
771 return s.compare(pos, prefix.size(), prefix) == 0;
779 :
CharParser(
name), left_parser_(
std::move(left_parser)), right_parser_(
std::move(right_parser)) {}
786 auto left_result = left_parser_->parse(input, start);
787 if (!left_result.succeeded) {
788 logger.debug(
" Left delimiter parse failed");
789 return {
false,
name, start, start,
""};
793 bool in_string =
false;
794 bool in_char =
false;
795 bool escape_next =
false;
796 size_t i = left_result.end;
798 while (
i < input.size()) {
810 }
else if (
c ==
'"') {
820 }
else if (
c ==
'\'') {
841 auto inner_left = left_parser_->parse(input,
i);
842 if (inner_left.succeeded) {
851 auto inner_right = right_parser_->parse(input,
i);
852 if (inner_right.succeeded) {
856 logger.debug(
" Found matching closing delimiter at {}",
i);
862 {left_result, inner_right}};
871 logger.debug(
" Matching closing delimiter not found");
897 logger.debug(
" Outer string parse failed");
898 return {
false,
name, start, start,
""};
903 logger.debug(
" Match too small to contain delimiters");
904 return {
false,
name, start, start,
""};
907 std::string inner_text =
909 size_t inner_start = 0;
911 logger.debug(
" Inner content to parse: {}",
truncate(inner_text));
913 ParseResult inner_result = inner_parser_->parse(inner_text, inner_start);
916 logger.debug(
" Inner parse failed");
917 return {
false,
name, start, start,
""};
930 {outer_result, inner_result}
941 bool ignore_in_strings_and_chars =
true,
const std::string &
name =
"until_char")
943 ignore_in_strings_and_chars_(ignore_in_strings_and_chars) {}
950 logger.debug(
"Starting UntilCharParser at position {} , looking for any target "
952 start, (ignore_in_strings_and_chars_ ?
" outside of strings and chars" :
""));
954 bool in_string =
false;
955 bool in_char =
false;
956 bool escape_next =
false;
958 for (
size_t i = start;
i < input.size(); ++
i) {
960 logger.debug(
" At position {}, char = {}",
i,
c);
962 if (ignore_in_strings_and_chars_) {
964 logger.debug(
" (escaped)");
971 logger.debug(
" (backslash in string, escaping next)");
973 }
else if (
c ==
'"') {
974 logger.debug(
" (end of string)");
977 logger.debug(
" (inside string)");
984 logger.debug(
" (backslash in char, escaping next)");
986 }
else if (
c ==
'\'') {
987 logger.debug(
" (end of char)");
990 logger.debug(
" (inside char)");
996 logger.debug(
" (begin string)");
999 }
else if (
c ==
'\'') {
1000 logger.debug(
" (begin char)");
1006 if (std::find(targets.begin(), targets.end(),
c) != targets.end()) {
1007 size_t end = inclusive_ ?
i + 1 :
i;
1008 logger.debug(
" (found target, stopping at position {})", end);
1015 logger.debug(
" None of the target characters found {}",
1016 (ignore_in_strings_and_chars_ ?
" outside of strings or chars\n" :
"\n"));
1017 return {
false,
name, start, start,
""};
1021 std::vector<char> targets;
1023 bool ignore_in_strings_and_chars_;
1035 auto comma_then_element =
sequence({
literal(
","), element_parser},
"comma_then_element");
1036 auto repeating_comma_elements =
repeating(comma_then_element,
"repeating_comma_elements");
1037 auto full_sequence =
optional(
sequence({element_parser, repeating_comma_elements},
"tuple_core"),
name);
1039 return full_sequence->parse(input, start);
1054 size_t current = start;
1055 bool matched_once =
false;
1060 std::vector<ParseResult> results;
1064 auto result = parser->parse(input, current);
1066 if (!result.succeeded) {
1070 results.push_back(result);
1072 if (result.end == current) {
1078 current = result.end;
1079 matched_once =
true;
1088 return {
false,
name, start, start,
""};
1093 std::shared_ptr<CharParser> parser;
1098 AnyOfParser(std::vector<std::shared_ptr<CharParser>> sub_parsers,
const std::string &
name =
"any_of")
1104 for (
const auto &parser : parsers) {
1106 auto result = parser->parse(input, start);
1107 if (result.succeeded) {
1116 return {
false,
name, start, start,
""};
1120 std::vector<std::shared_ptr<CharParser>> parsers;
1133 size_t current = start;
1135 std::vector<ParseResult> results;
1137 for (
const auto &parser : parsers_) {
1138 auto result = parser->parse(input, current);
1139 if (!result.succeeded) {
1140 logger.debug(
"{}: did not succeed on parser {}",
name, parser->name);
1143 results.push_back(result);
1144 current = result.end;
1150 std::vector<CharParserPtr> parsers_;
1157 logger.info(
"Testing input: {}", input);
1158 auto result = parser->parse(input, 0);
1159 if (result.succeeded && result.end == input.size()) {
1160 logger.info(
">> SUCCESS: matched full string");
1161 }
else if (result.succeeded) {
1162 logger.info(
">> PARTIAL MATCH: stopped at {}", result.end);
1164 logger.info(
">> FAILURE: no match");
1169 std::vector<CharParserPtr> result;
1170 result.reserve(base_parsers.size() * 2 + 1);
1174 for (
size_t i = 0;
i < base_parsers.size(); ++
i) {
1175 result.push_back(base_parsers[
i]);
1187 "comma_element_" + element_parser->name)),
1188 "after_the_first_element_parser");
1193 "one_or_more_element_" + element_parser->name),
1196 "optional_elements");
1198 return optional_element_parser;
1203std::unordered_map<std::string, std::vector<std::string>>
1251 "type_with_optional_reference for " + base_parser->name);
1260 "lambda_parameters",
"(",
")"),
1287 "optional_parameter_sequence");
1298 std::vector<CharParserPtr> result;
1301 result.push_back(
literal(op));
1313 "function_invocation");
1320 "constructor_def_parser");
1327 "base_function_signature");
1332 "function_signature");
1341 std::vector<CharParserPtr> result;
1344 result.push_back(
literal(as));
1400 "source_file_body");
1404 "source_file_namespace_body");
1417std::unordered_map<std::string, std::vector<std::string>>
Definition logger.hpp:182
void debug(fmt::format_string< Args... > fmt_str, Args &&...args)
Definition logger.hpp:88
AnyOfParser(std::vector< std::shared_ptr< CharParser > > sub_parsers, const std::string &name="any_of")
Definition cpp_parsing.hpp:1098
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:1101
virtual ~CharParser()=default
std::string name
Definition cpp_parsing.hpp:207
CharParser(std::string name="")
Definition cpp_parsing.hpp:201
virtual ParseResult parse(const std::string &input, size_t start=0) const =0
ParseResult parse(const std::string &input, size_t start=0) const override
Definition cpp_parsing.hpp:1032
CommaSeparatedTupleParser(CharParserPtr element_parser, std::string name="comma_separated_tuple")
Definition cpp_parsing.hpp:1029
ParseResult parse(const std::string &input, size_t start=0) const override
Definition cpp_parsing.hpp:272
DecimalLiteralParser(std::string name="decimal_literal")
Definition cpp_parsing.hpp:270
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:401
void set_parser(CharParserPtr parser)
Definition cpp_parsing.hpp:399
DeferredParser()
Definition cpp_parsing.hpp:396
IdentifierParser()
Definition cpp_parsing.hpp:290
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:292
IfThenParser(std::shared_ptr< CharParser > condition_parser, std::shared_ptr< CharParser > then_parser, const std::string &name="if_then")
Definition cpp_parsing.hpp:354
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:358
LiteralParser(std::string literal)
Definition cpp_parsing.hpp:647
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:649
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:781
MatchingPairParser(CharParserPtr left_parser, CharParserPtr right_parser, const std::string &name="matching_pair")
Definition cpp_parsing.hpp:778
Definition cpp_parsing.hpp:680
std::string right_str
Definition cpp_parsing.hpp:687
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:689
std::string left_str
Definition cpp_parsing.hpp:686
MatchingStringPairParser(const std::string &name="matching_strings", std::string left_str="{", std::string right_str="}")
Definition cpp_parsing.hpp:682
NestedStringPairParser(CharParserPtr inner_parser, const std::string &name="nested_string", std::string left_str="{", std::string right_str="}")
Definition cpp_parsing.hpp:882
std::string right_str
Definition cpp_parsing.hpp:887
std::string left_str
Definition cpp_parsing.hpp:887
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:889
OptionalParser(std::shared_ptr< CharParser > inner, const std::string &name="optional")
Definition cpp_parsing.hpp:328
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:331
OptionalWhitespaceParser()
Definition cpp_parsing.hpp:415
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:417
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:1053
RepeatingParser(std::shared_ptr< CharParser > inner_parser, const std::string &name="repeating")
Definition cpp_parsing.hpp:1050
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:1128
SequenceParser(std::vector< CharParserPtr > parsers, const std::string &name)
Definition cpp_parsing.hpp:1125
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:485
TypeParser()
Definition cpp_parsing.hpp:484
TypeQualifierSequenceParser()
Definition cpp_parsing.hpp:592
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:593
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:945
UntilCharParser(std::vector< char > target_chars, bool inclusive=true, bool ignore_in_strings_and_chars=true, const std::string &name="until_char")
Definition cpp_parsing.hpp:940
VariableParser()
Definition cpp_parsing.hpp:440
ParseResult parse(const std::string &input, size_t start) const override
Definition cpp_parsing.hpp:442
Definition text_utils.hpp:81
void indent()
Increase indentation level.
Definition text_utils.hpp:86
void add(Args &&...args)
Add a line with current indentation applied.
Definition text_utils.hpp:100
void unindent()
Decrease indentation level (no-op if already at 0).
Definition text_utils.hpp:89
std::string str() const
Get the accumulated text as a single string with newlines.
Definition text_utils.hpp:180
Definition cpp_parsing.cpp:4
const std::vector< CharParserPtr > access_specifier_parsers
Definition cpp_parsing.hpp:1340
std::vector< std::string > extract_top_level_classes(const std::string &source_code_path)
Definition cpp_parsing.cpp:336
CharParserPtr full_non_recursive_type
Definition cpp_parsing.hpp:1265
CharParserPtr function_def_parser
Definition cpp_parsing.hpp:1334
CharParserPtr constructor_def_parser
Definition cpp_parsing.hpp:1318
std::string truncate(const std::string &s, int cutoff=50)
Definition cpp_parsing.hpp:126
std::vector< std::string > extract_top_level_enum_classes(const std::string &source_code_path)
Definition cpp_parsing.cpp:340
CharParserPtr macro_if_statement
Definition cpp_parsing.hpp:1213
std::string remove_comments_from_file(const std::string &filename)
Definition cpp_parsing.cpp:217
const CharParserPtr access_specifier_parser
Definition cpp_parsing.hpp:1349
const CharParserPtr class_inheritance_parser
Definition cpp_parsing.hpp:1351
void collect_by_name(const cpp_parsing::ParseResult *root, const std::string &target, std::vector< const cpp_parsing::ParseResult * > &out)
Definition cpp_parsing.cpp:56
CharParserPtr optionally_namespaced_variable_parser
Definition cpp_parsing.hpp:1308
CharParserPtr base_function_signature_parser
Definition cpp_parsing.hpp:1322
CharParserPtr system_include_parser
Definition cpp_parsing.hpp:1217
CharParserPtr local_or_system_includes_parser
Definition cpp_parsing.hpp:1406
CharParserPtr function_invocation
Definition cpp_parsing.hpp:1311
CharParserPtr add_optional_type_surroundings(CharParserPtr base_parser)
Definition cpp_parsing.hpp:1241
std::vector< CharParserPtr > make_operator_literals()
Definition cpp_parsing.hpp:1297
CharParserPtr parameter_tuple_parser
Definition cpp_parsing.hpp:1294
CharParserPtr optional_parameters
Definition cpp_parsing.hpp:1291
CharParserPtr nested_string_pair(CharParserPtr parser, const std::string &name, std::string left, std::string right)
Definition cpp_parsing.cpp:152
CharParserPtr matching_string_pair(const std::string &name, std::string left, std::string right)
Definition cpp_parsing.cpp:145
std::vector< std::string > extract_top_level_functions(const std::string &source_code_path)
Definition cpp_parsing.cpp:328
CharParserPtr class_def_parser
Definition cpp_parsing.hpp:1355
CharParserPtr if_then(std::shared_ptr< CharParser > condition_parser, std::shared_ptr< CharParser > then_parser, const std::string &name)
Definition cpp_parsing.cpp:166
CharParserPtr declaration_parser
Definition cpp_parsing.hpp:1277
CharParserPtr sequence(std::vector< CharParserPtr > parsers, const std::string &name)
Definition cpp_parsing.cpp:175
CharParserPtr header_file_parser
Definition cpp_parsing.hpp:1413
const cpp_parsing::ParseResult * find_first_name_contains(const cpp_parsing::ParseResult *root, const std::string &substr)
Definition cpp_parsing.cpp:42
CharParserPtr lambda_type_parser()
Definition cpp_parsing.hpp:1257
CharParserPtr type_qualifier_sequence()
Definition cpp_parsing.cpp:136
std::vector< CharParserPtr > create_literal_parsers(std::vector< std::string > literals)
Definition cpp_parsing.hpp:223
CharParserPtr assignment_parser
Definition cpp_parsing.hpp:1272
CharParserPtr until_char(std::vector< char > target_chars, bool inclusive, bool ignore_in_strings_and_chars, const std::string &name)
Definition cpp_parsing.cpp:138
CharParserPtr function_decl_parser
Definition cpp_parsing.hpp:1337
const std::vector< std::string > cpp_size_specifier
Definition cpp_parsing.hpp:33
const std::vector< std::string > overloadable_operators
Definition cpp_parsing.hpp:37
CharParserPtr struct_def_parser
Definition cpp_parsing.hpp:1393
CharParserPtr struct_def_parser_good
Definition cpp_parsing.hpp:1370
CharParserPtr using_statement_parser
Definition cpp_parsing.hpp:1384
CharParserPtr default_value_for_parameter_suffix_parser
Definition cpp_parsing.hpp:1227
CharParserPtr enum_class_def_parser
Definition cpp_parsing.hpp:1379
CharParserPtr source_file_body_parser
Definition cpp_parsing.hpp:1396
std::string node_text(const cpp_parsing::ParseResult *node)
Definition cpp_parsing.cpp:95
void test()
Definition cpp_parsing.hpp:1424
CharParserPtr local_include_parser
Definition cpp_parsing.hpp:1223
std::shared_ptr< CharParser > CharParserPtr
Definition cpp_parsing.hpp:210
const std::unordered_set< std::string > cpp_built_in_types
Definition cpp_parsing.hpp:28
std::vector< std::string > extract_top_level_function_declarations(const std::string &header_code_path)
Definition cpp_parsing.cpp:332
CharParserPtr base_type()
Definition cpp_parsing.cpp:135
const std::unordered_set< std::string > cpp_keywords
Definition cpp_parsing.hpp:108
const cpp_parsing::ParseResult * find_first_by_name(const cpp_parsing::ParseResult *root, const std::string &target)
Definition cpp_parsing.cpp:29
std::vector< CharParserPtr > operator_literals
Definition cpp_parsing.hpp:1306
Logger logger("cpp_parsing")
std::unordered_map< std::string, std::vector< std::string > > collect_matches_by_parser_name(const ParseResult &result, const std::vector< std::string > &target_names)
Definition cpp_parsing.cpp:254
CharParserPtr literal(const std::string &s)
Definition cpp_parsing.cpp:143
CharParserPtr comma_separated_sequence_parser(CharParserPtr element_parser)
Definition cpp_parsing.hpp:1183
std::unordered_map< std::string, std::vector< std::string > > get_parser_name_to_matches_for_source_file(const std::string &source_code_path)
Definition cpp_parsing.cpp:288
CharParserPtr parameter_parser
Definition cpp_parsing.hpp:1280
CharParserPtr type
Definition cpp_parsing.hpp:1270
CharParserPtr optional_reference_or_pointer()
Definition cpp_parsing.hpp:1239
CharParserPtr class_def_parser_good
Definition cpp_parsing.hpp:1361
CharParserPtr optional_whitespace()
Definition cpp_parsing.cpp:132
CharParserPtr optional(CharParserPtr parser, const std::string &name)
Definition cpp_parsing.cpp:160
CharParserPtr initializer_list_parser
Definition cpp_parsing.hpp:1315
CharParserPtr source_file_namespace_body_parser
Definition cpp_parsing.hpp:1402
void log_start_of_parser(const std::string &name, const std::string &input, size_t start)
Definition cpp_parsing.hpp:247
std::vector< CharParserPtr > whitespace_between(const std::vector< CharParserPtr > &base_parsers)
Definition cpp_parsing.hpp:1168
ParseResult clean_parse_result(const ParseResult &r)
Definition cpp_parsing.cpp:6
CharParserPtr variable()
Definition cpp_parsing.cpp:134
CharParserPtr repeating(CharParserPtr parser, const std::string &name)
Definition cpp_parsing.cpp:156
const std::unordered_set< std::string > access_specifiers
Definition cpp_parsing.hpp:35
CharParserPtr source_file_parser
Definition cpp_parsing.hpp:1409
CharParserPtr identifier()
Definition cpp_parsing.cpp:133
std::ostream & operator<<(std::ostream &os, const ParseResult &result)
Definition cpp_parsing.cpp:130
CharParserPtr get_templated_type_parser()
Definition cpp_parsing.cpp:344
std::ostream & print_parse_result(std::ostream &os, const ParseResult &result, int indent)
Definition cpp_parsing.cpp:110
CharParserPtr optionally_namespaced_identifier()
Definition cpp_parsing.hpp:1235
CharParserPtr optional_parameter_sequence
Definition cpp_parsing.hpp:1285
CharParserPtr not_any_of(std::shared_ptr< CharParser > inner, std::unordered_set< std::string > forbidden, std::string name)
Definition cpp_parsing.cpp:179
CharParserPtr any_of(std::vector< CharParserPtr > parsers, const std::string &name)
Definition cpp_parsing.cpp:171
void test_parser(const std::string &input, const CharParserPtr &parser)
Definition cpp_parsing.hpp:1155
CharParserPtr deferred()
Definition cpp_parsing.cpp:164
CharParserPtr function_signature_parser
Definition cpp_parsing.hpp:1330
const std::vector< std::string > cpp_sign_specifier
Definition cpp_parsing.hpp:32
std::string get_next_part_of_string(const std::string &input, int start, int lookahead=50)
Definition cpp_parsing.hpp:130
ParseResult parse_source_or_header_file(const std::string &source_code_path)
Definition cpp_parsing.cpp:272
std::vector< std::pair< std::string, std::string > > bfs_collect_matches(const cpp_parsing::ParseResult *root, const std::vector< std::string > &names)
Definition cpp_parsing.cpp:66
std::string get_substring(const std::string &input, size_t start, size_t end)
Extract a substring from start to end indices.
Definition text_utils.cpp:236
Definition cpp_parsing.hpp:134
std::string match
Definition cpp_parsing.hpp:143
bool succeeded
Definition cpp_parsing.hpp:140
ParseResult(bool succeeded, std::string parser_name="", size_t start=0, size_t end=0, std::string match="", std::vector< ParseResult > sub_results={})
Definition cpp_parsing.hpp:135
size_t end
Definition cpp_parsing.hpp:142
std::vector< ParseResult > sub_results
Definition cpp_parsing.hpp:145
std::string parser_name
Definition cpp_parsing.hpp:144
size_t start
Definition cpp_parsing.hpp:141
std::string to_string() const
Definition cpp_parsing.hpp:146