10#define CPPPEGLIB_VERSION "1.16.0"
11#define CPPPEGLIB_VERSION_NUM "0x011000"
17#ifndef CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT
18#define CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT 32
26#if __has_include(<charconv>)
31#include <initializer_list>
41#include <unordered_map>
42#include <unordered_set>
46#if !defined(__cplusplus) || __cplusplus < 201703L
47#error "Requires complete C++17 support"
92 auto b =
static_cast<uint8_t
>(s8[0]);
93 if ((b & 0x80) == 0) {
95 }
else if ((b & 0xE0) == 0xC0 && l >= 2) {
97 }
else if ((b & 0xF0) == 0xE0 && l >= 3) {
99 }
else if ((b & 0xF8) == 0xF0 && l >= 4) {
108 for (
size_t i = 0; i < l;) {
122 buff[0] =
static_cast<char>(cp & 0x7F);
124 }
else if (cp < 0x0800) {
125 buff[0] =
static_cast<char>(0xC0 | ((cp >> 6) & 0x1F));
126 buff[1] =
static_cast<char>(0x80 | (cp & 0x3F));
128 }
else if (cp < 0xD800) {
129 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
130 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
131 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
133 }
else if (cp < 0xE000) {
136 }
else if (cp < 0x10000) {
137 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
138 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
139 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
141 }
else if (cp < 0x110000) {
142 buff[0] =
static_cast<char>(0xF0 | ((cp >> 18) & 0x7));
143 buff[1] =
static_cast<char>(0x80 | ((cp >> 12) & 0x3F));
144 buff[2] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
145 buff[3] =
static_cast<char>(0x80 | (cp & 0x3F));
154 return std::string(buff, l);
160 auto b =
static_cast<uint8_t
>(s8[0]);
161 if ((b & 0x80) == 0) {
165 }
else if ((b & 0xE0) == 0xC0) {
168 cp = ((
static_cast<char32_t>(s8[0] & 0x1F)) << 6) |
169 (
static_cast<char32_t>(s8[1] & 0x3F));
172 }
else if ((b & 0xF0) == 0xE0) {
175 cp = ((
static_cast<char32_t>(s8[0] & 0x0F)) << 12) |
176 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 6) |
177 (
static_cast<char32_t>(s8[2] & 0x3F));
180 }
else if ((b & 0xF8) == 0xF0) {
183 cp = ((
static_cast<char32_t>(s8[0] & 0x07)) << 18) |
184 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 12) |
185 ((
static_cast<char32_t>(s8[2] & 0x3F)) << 6) |
186 (
static_cast<char32_t>(s8[3] & 0x3F));
206inline std::u32string
decode(
const char *s8,
size_t l) {
211 while (i < l && (s8[i] & 0xc0) == 0x80) {
219template <
typename T>
const char *
u8(
const T *s) {
220 return reinterpret_cast<const char *
>(s);
229 for (
size_t i = 0; i < n; i++) {
232 case '\f': str +=
"\\f";
break;
233 case '\n': str +=
"\\n";
break;
234 case '\r': str +=
"\\r";
break;
235 case '\t': str +=
"\\t";
break;
236 case '\v': str +=
"\\v";
break;
237 default: str += c;
break;
252 if (
'0' <= c && c <=
'9') {
255 }
else if (
'a' <= c && c <=
'f') {
258 }
else if (
'A' <= c && c <=
'F') {
266 if (
'0' <= c && c <=
'9') {
277 while (i < n &&
is_hex(s[i], val)) {
278 ret =
static_cast<int>(ret * 16 + val);
281 return std::pair(ret, i);
288 while (i < n &&
is_digit(s[i], val)) {
289 ret =
static_cast<int>(ret * 8 + val);
292 return std::pair(ret, i);
380inline const std::vector<std::pair<char32_t, char32_t>> *
382 static const std::map<std::string_view,
383 std::vector<std::pair<char32_t, char32_t>>>
385 {
"alnum", {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}}},
386 {
"alpha", {{
'A',
'Z'}, {
'a',
'z'}}},
387 {
"ascii", {{0x00, 0x7F}}},
388 {
"blank", {{
'\t',
'\t'}, {
' ',
' '}}},
389 {
"cntrl", {{0x00, 0x1F}, {0x7F, 0x7F}}},
390 {
"digit", {{
'0',
'9'}}},
391 {
"graph", {{0x21, 0x7E}}},
392 {
"lower", {{
'a',
'z'}}},
393 {
"print", {{0x20, 0x7E}}},
394 {
"punct", {{0x21, 0x2F}, {0x3A, 0x40}, {0x5B, 0x60}, {0x7B, 0x7E}}},
395 {
"space", {{
'\t',
'\r'}, {
' ',
' '}}},
396 {
"upper", {{
'A',
'Z'}}},
397 {
"word", {{
'0',
'9'}, {
'A',
'Z'}, {
'_',
'_'}, {
'a',
'z'}}},
398 {
"xdigit", {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}},
400 auto it = table.find(name);
401 return it != table.end() ? &it->second :
nullptr;
406 const std::vector<std::pair<char32_t, char32_t>> &ranges) {
407 std::vector<std::pair<char32_t, char32_t>> r;
409 for (
const auto &[lo, hi] : ranges) {
410 if (lo > next) { r.emplace_back(next, lo - 1); }
413 if (next <= 0x10FFFF) { r.emplace_back(next, 0x10FFFF); }
423#if __has_include(<charconv>)
424 if constexpr (!std::is_floating_point<T>::value) {
425 std::from_chars(sv.data(), sv.data() + sv.size(), n);
427 if constexpr (
false) {
430 auto s = std::string(sv);
431 std::istringstream ss(s);
439 c =
static_cast<char>(std::tolower(
static_cast<unsigned char>(c)));
450 Trie(
const std::vector<std::string> &items,
bool ignore_case)
453 for (
const auto &item : items) {
454 const auto &s = ignore_case ?
to_lower(item) : item;
456 for (
size_t len = 1; len <= item.size(); len++) {
457 auto last = len == item.size();
458 std::string_view sv(s.data(), len);
459 auto it =
dic_.find(sv);
460 if (it ==
dic_.end()) {
461 dic_.emplace(sv,
Info{last, last,
id});
463 it->second.match =
true;
465 it->second.done =
false;
472 size_t match(
const char *text,
size_t text_len,
size_t &
id)
const {
473 auto limit = std::min(text_len,
max_len_);
474 std::string lower_text;
476 lower_text =
to_lower(std::string(text, limit));
477 text = lower_text.data();
480 size_t match_len = 0;
483 while (!done && len <= limit) {
484 std::string_view sv(text, len);
485 auto it =
dic_.find(sv);
486 if (it ==
dic_.end()) {
489 if (it->second.match) {
493 if (it->second.done) { done =
true; }
515 std::map<std::string, Info, std::less<>>
dic_;
529inline std::pair<size_t, size_t>
line_info(
const char *start,
const char *cur) {
544 return std::pair(no, col);
554 (h * 33) ^
static_cast<unsigned char>(*s));
557inline constexpr unsigned int str2tag(std::string_view sv) {
563inline constexpr unsigned int operator""_(
const char *s,
size_t l) {
580 const char *
ss =
nullptr;
583 std::string_view
sv()
const {
return sv_; }
588 std::vector<unsigned int>
tags;
591 std::pair<size_t, size_t>
line_info()
const;
602 std::string_view
token(
size_t id = 0)
const {
604 assert(
id <
tokens.size());
610 return std::string(
token(
id));
618 template <
typename T>
620 size_t end =
static_cast<size_t>(-1))
const {
622 end = (std::min)(end, size());
623 for (
size_t i = beg; i < end; i++) {
624 r.emplace_back(std::any_cast<T>((*
this)[i]));
629 using std::vector<std::any>::iterator;
630 using std::vector<std::any>::const_iterator;
631 using std::vector<std::any>::size;
632 using std::vector<std::any>::empty;
633 using std::vector<std::any>::assign;
634 using std::vector<std::any>::begin;
635 using std::vector<std::any>::end;
636 using std::vector<std::any>::rbegin;
637 using std::vector<std::any>::rend;
638 using std::vector<std::any>::operator[];
639 using std::vector<std::any>::at;
640 using std::vector<std::any>::resize;
641 using std::vector<std::any>::front;
642 using std::vector<std::any>::back;
643 using std::vector<std::any>::push_back;
644 using std::vector<std::any>::pop_back;
645 using std::vector<std::any>::insert;
646 using std::vector<std::any>::erase;
647 using std::vector<std::any>::clear;
648 using std::vector<std::any>::swap;
649 using std::vector<std::any>::emplace;
650 using std::vector<std::any>::emplace_back;
671template <
typename F,
typename... Args> std::any
call(F fn, Args &&...args) {
672 using R =
decltype(fn(std::forward<Args>(args)...));
673 if constexpr (std::is_void<R>::value) {
674 fn(std::forward<Args>(args)...);
676 }
else if constexpr (std::is_same<typename std::remove_cv<R>::type,
678 return fn(std::forward<Args>(args)...);
680 return std::any(fn(std::forward<Args>(args)...));
686template <
typename R,
typename... Args>
688 : std::integral_constant<unsigned,
sizeof...(Args)> {};
689template <
typename R,
typename C,
typename... Args>
691 : std::integral_constant<unsigned, sizeof...(Args)> {};
692template <
typename R,
typename C,
typename... Args>
694 : std::integral_constant<unsigned, sizeof...(Args)> {};
704 operator bool()
const {
return bool(
fn_); }
707 const std::any &predicate_data)
const {
708 return fn_(vs, dt, predicate_data);
713 const std::any &predicate_data)>;
717 return [fn](
auto &vs,
auto & ,
const auto & ) {
721 return [fn](
auto &vs,
auto &dt,
const auto & ) {
722 return call(fn, vs, dt);
725 return [fn](
auto &vs,
auto &dt,
const auto &predicate_data) {
726 return call(fn, vs, dt, predicate_data);
742 operator bool()
const {
return bool(
fn_); }
745 std::string &msg, std::any &predicate_data)
const {
746 return fn_(vs, dt, msg, predicate_data);
751 std::string &msg, std::any &predicate_data)>;
755 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
756 auto & ) {
return fn(vs, dt, msg); };
758 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
759 auto &predicate_data) {
760 return fn(vs, dt, msg, predicate_data);
771inline bool success(
size_t len) {
return len !=
static_cast<size_t>(-1); }
773inline bool fail(
size_t len) {
return len ==
static_cast<size_t>(-1); }
778using Log = std::function<void(
size_t line,
size_t col,
const std::string &msg,
779 const std::string &rule)>;
823 if (t == error_literal && r == error_rule) {
return; }
835 int cast_char(
char c)
const {
return static_cast<unsigned char>(c); }
838 const char *pos)
const {
839 auto len = n - std::distance(s, pos);
843 if (!std::ispunct(c) && !std::isspace(c)) {
844 while (i < len && !std::ispunct(
cast_char(pos[i])) &&
852 while (count > 0 && j < i) {
859 return std::string();
863 const std::string &to)
const {
865 while ((pos = str.find(from, pos)) != std::string::npos) {
866 str.replace(pos, from.length(), to);
880 const Context &c,
const std::any &dt, std::any &trace_data)>;
884 const Context &c,
const std::any &dt,
size_t, std::any &trace_data)>;
903 bool find(
size_t key,
size_t &len, std::any &val)
const {
904 if (
slots_.empty()) {
return false; }
905 auto mask =
slots_.size() - 1;
906 auto i =
mix(key) & mask;
909 if (slot.key == key) {
911 if (!
vals_.empty()) {
918 if (slot.key ==
kEmpty) {
return false; }
925 auto mask =
slots_.size() - 1;
926 auto i =
mix(key) & mask;
930 if (slot.key == key) {
935 if (insert_pos ==
kEmpty) { insert_pos = i; }
936 }
else if (slot.key ==
kEmpty) {
937 if (insert_pos ==
kEmpty) { insert_pos = i; }
943 auto &dest =
slots_[insert_pos];
946 if (val.has_value()) {
948 vals_[insert_pos] = val;
949 }
else if (!
vals_.empty()) {
950 vals_[insert_pos].reset();
955 if (
slots_.empty()) {
return; }
956 auto mask =
slots_.size() - 1;
957 auto i =
mix(key) & mask;
960 if (slot.key == key) {
965 if (slot.key ==
kEmpty) {
return; }
971 static constexpr size_t kEmpty =
static_cast<size_t>(-1);
972 static constexpr size_t kTombstone =
static_cast<size_t>(-2);
979 static size_t mix(
size_t key) {
982 auto h =
static_cast<uint64_t
>(key) * 0x9E3779B97F4A7C15ull;
983 return static_cast<size_t>(h ^ (h >> 32));
988 std::vector<Slot> old_slots = std::move(
slots_);
989 std::vector<std::any> old_vals = std::move(
vals_);
991 if (!old_vals.empty()) {
vals_.assign(new_cap, std::any()); }
993 auto mask = new_cap - 1;
994 for (
size_t j = 0; j < old_slots.size(); j++) {
995 auto &slot = old_slots[j];
997 auto i =
mix(slot.key) & mask;
1002 if (!old_vals.empty()) {
vals_[i] = std::move(old_vals[j]); }
1030 std::vector<std::shared_ptr<Ope>>
args;
1060 size_t len =
static_cast<size_t>(-1);
1067 using LRRule = std::pair<const Definition *, size_t>;
1068 using LRKey = std::pair<LRRule, const char *>;
1087 if (!
packrat_index) {
return static_cast<int32_t
>(def_id); }
1088 return def_id <
packrat_index->size() ? (*packrat_index)[def_id] : -1;
1094 if (slot < 0) {
return; }
1095 auto col =
static_cast<size_t>(pos -
s);
1105 const std::any &val) {
1108 if (slot < 0) {
return; }
1111 static_cast<size_t>(slot);
1153 for (
size_t i = 0; i < 256; i++) {
1155 static_cast<unsigned char>(std::tolower(
static_cast<int>(i)));
1177 template <
typename T>
1178 void packrat(
const char *a_s,
size_t def_id,
size_t &len, std::any &val,
1191 (*packrat_stats)[def_id].hits++;
1193 len =
static_cast<size_t>(-1);
1197 (*packrat_stats)[def_id].misses++;
1208 static_cast<size_t>(slot);
1212 (*packrat_stats)[def_id].hits++;
1221 len =
static_cast<size_t>(-1);
1230 (*packrat_stats)[def_id].misses++;
1244 value_stack.emplace_back(std::make_unique<SemanticValues>(
this));
1249 if (!vs.tags.empty()) { vs.tags.clear(); }
1251 vs.sv_ = std::string_view();
1252 vs.choice_count_ = 0;
1254 if (!vs.tokens.empty()) { vs.tokens.clear(); }
1267 size_t macro_inst = 0) {
1268 args_stack.push_back({std::move(args), macro_inst});
1273 const std::vector<std::shared_ptr<Ope>> &
top_args()
const {
1287 auto [it, inserted] =
1305 return {vs.size(), vs.
tags.size(), vs.
tokens.size(), vs.
sv_,
1326 void set_error_pos(
const char *a_s,
const char *literal =
nullptr);
1336 std::pair<size_t, size_t>
line_info(
const char *cur)
const {
1338 for (
size_t pos = 0; pos <
l; pos++) {
1344 auto pos =
static_cast<size_t>(std::distance(
s, cur));
1346 auto it = std::lower_bound(
1348 [](
size_t element,
size_t value) { return element < value; });
1352 return std::pair(
id + 1, off + 1);
1371 std::any &dt)
const;
1373 Context &c, std::any &dt)
const = 0;
1391 std::string_view input) {
1392 return std::any_of(keywords.begin(), keywords.end(),
1393 [&](
const auto &kw) { return kw == input; });
1399 template <
typename... Args>
1401 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...} {}
1406 std::any &dt)
const override {
1416 for (
const auto &ope :
opes_) {
1417 auto len = ope->parse(s + i, n - i, vs, c, dt);
1418 if (
fail(len)) {
return len; }
1424 void accept(Visitor &v)
override;
1426 std::vector<std::shared_ptr<Ope>>
opes_;
1435 std::any &dt)
const {
1437 if (n < 1 || !kw.identifier_first.test(
static_cast<unsigned char>(*s))) {
1439 return static_cast<size_t>(-1);
1443 while (id_len < n &&
1444 kw.identifier_rest.test(
static_cast<unsigned char>(s[id_len]))) {
1448 if (id_len >= kw.min_keyword_len && id_len <= kw.max_keyword_len) {
1450 std::unique_ptr<char[]> lower_heap;
1451 char *lower = lower_buf;
1452 if (id_len >
sizeof(lower_buf)) {
1453 lower_heap.reset(
new char[id_len]);
1454 lower = lower_heap.get();
1456 std::transform(s, s + id_len, lower, [&c](
unsigned char ch) {
1459 std::string_view lower_sv(lower, id_len);
1463 return static_cast<size_t>(-1);
1466 return std::nullopt;
1470 vs.
tokens.emplace_back(std::string_view(s, id_len));
1472 if (
fail(wl)) {
return wl; }
1497 template <
typename... Args>
1499 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...},
1508 :
opes_(std::move(opes)) {
1513 std::any &dt)
const override {
1514 size_t len =
static_cast<size_t>(-1);
1522 for (
const auto &ope :
opes_) {
1526 if (!fs.any_char && !fs.can_be_empty &&
1527 !fs.chars.test(
static_cast<unsigned char>(*s))) {
1529 (fs.first_literal || fs.first_rule)) {
1535 if (fs.first_literal) {
1552 len = ope->parse(s, n, vs, c, dt);
1571 void accept(Visitor &v)
override;
1575 std::vector<std::shared_ptr<Ope>>
opes_;
1582 Repetition(
const std::shared_ptr<Ope> &ope,
size_t min,
size_t max)
1586 std::any &dt)
const override {
1593 if (
max_ == std::numeric_limits<size_t>::max()) {
1595 while (i < n && bitset.test(
static_cast<unsigned char>(s[i]))) {
1599 auto limit = std::min(n,
max_);
1600 while (i < limit && bitset.test(
static_cast<unsigned char>(s[i]))) {
1606 return static_cast<size_t>(-1);
1613 while (count <
min_) {
1614 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1615 if (
fail(len)) {
return len; }
1620 while (count <
max_) {
1622 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1633 void accept(Visitor &v)
override;
1636 return min_ == 0 &&
max_ == std::numeric_limits<size_t>::max();
1639 static std::shared_ptr<Repetition>
zom(
const std::shared_ptr<Ope> &ope) {
1640 return std::make_shared<Repetition>(ope, 0,
1641 std::numeric_limits<size_t>::max());
1644 static std::shared_ptr<Repetition>
oom(
const std::shared_ptr<Ope> &ope) {
1645 return std::make_shared<Repetition>(ope, 1,
1646 std::numeric_limits<size_t>::max());
1649 static std::shared_ptr<Repetition>
opt(
const std::shared_ptr<Ope> &ope) {
1650 return std::make_shared<Repetition>(ope, 0, 1);
1665 std::any &dt)
const override {
1667 auto len =
ope_->parse(s, n, vs, c, dt);
1676 void accept(Visitor &v)
override;
1686 std::any &dt)
const override {
1688 auto len =
ope_->parse(s, n, vs, c, dt);
1692 return static_cast<size_t>(-1);
1698 void accept(Visitor &v)
override;
1706 :
trie_(v, ignore_case) {
1711 std::any &dt)
const override;
1713 void accept(Visitor &v)
override;
1719 public std::enable_shared_from_this<LiteralString> {
1732 std::any &dt)
const override;
1734 void accept(Visitor &v)
override;
1744 public std::enable_shared_from_this<CharacterClass> {
1748 auto chars =
decode(s.data(), s.length());
1750 while (i < chars.size()) {
1751 if (i + 2 < chars.size() && chars[i + 1] ==
'-') {
1752 auto cp1 = chars[i];
1753 auto cp2 = chars[i + 2];
1754 ranges_.emplace_back(std::pair(cp1, cp2));
1758 ranges_.emplace_back(std::pair(cp, cp));
1767 bool negated,
bool ignore_case)
1774 Context &c, std::any & )
const override {
1777 return static_cast<size_t>(-1);
1783 for (
const auto &range :
ranges_) {
1787 return static_cast<size_t>(-1);
1798 return static_cast<size_t>(-1);
1802 void accept(Visitor &v)
override;
1812 bool in_range(
const std::pair<char32_t, char32_t> &range,
char32_t cp)
const {
1814 auto cpl = std::tolower(cp);
1815 return std::tolower(range.first) <= cpl &&
1816 cpl <= std::tolower(range.second);
1818 return range.first <= cp && cp <= range.second;
1824 for (
const auto &[lo, hi] :
ranges_) {
1825 if (lo > 0x7F || hi > 0x7F) {
return; }
1828 for (
const auto &[lo, hi] :
ranges_) {
1829 for (
auto cp = lo; cp <= hi; cp++) {
1830 auto ch =
static_cast<unsigned char>(cp);
1833 ascii_bitset_.set(
static_cast<unsigned char>(std::toupper(ch)));
1834 ascii_bitset_.set(
static_cast<unsigned char>(std::tolower(ch)));
1840 std::vector<std::pair<char32_t, char32_t>>
ranges_;
1847class Character :
public Ope,
public std::enable_shared_from_this<Character> {
1852 Context &c, std::any & )
const override {
1855 return static_cast<size_t>(-1);
1863 return static_cast<size_t>(-1);
1868 void accept(Visitor &v)
override;
1874 public std::enable_shared_from_this<AnyCharacter> {
1877 Context &c, std::any & )
const override {
1881 return static_cast<size_t>(-1);
1886 void accept(Visitor &v)
override;
1894 std::any &dt)
const override {
1896 auto len =
ope_->parse(s, n, vs, c, dt);
1901 void accept(Visitor &v)
override;
1914 std::any &dt)
const override {
1915 auto len =
ope_->parse(s, n, vs, c, dt);
1920 void accept(Visitor &v)
override;
1933 std::any &dt)
const override;
1935 void accept(Visitor &v)
override;
1945 Context &c, std::any &dt)
const override {
1948 return ope_->parse(s, n, chvs, c, dt);
1951 void accept(Visitor &v)
override;
1963 Context & , std::any &dt)
const override {
1965 return fn_(s, n, vs, dt);
1967 void accept(Visitor &v)
override;
1968 std::function<size_t(
const char *s,
size_t n,
SemanticValues &vs,
1978 std::any &dt)
const override {
1979 auto ope =
weak_.lock();
1981 return ope->parse(s, n, vs, c, dt);
1984 void accept(Visitor &v)
override;
1994 std::any &dt)
const override;
1996 void accept(Visitor &v)
override;
1999 const std::any &predicate_data)
const;
2001 const std::string &
name()
const;
2012using Grammar = std::unordered_map<std::string, Definition>;
2014class Reference :
public Ope,
public std::enable_shared_from_this<Reference> {
2017 bool is_macro,
const std::vector<std::shared_ptr<Ope>> &args)
2022 std::any &dt)
const override;
2024 void accept(Visitor &v)
override;
2033 const std::vector<std::shared_ptr<Ope>>
args_;
2044 std::any &dt)
const override {
2048 return ope_->parse(s, n, vs, c, dt);
2051 void accept(Visitor &v)
override;
2063 std::any &dt)
const override;
2065 void accept(Visitor &v)
override;
2072 using BinOpeInfo = std::map<std::string_view, std::pair<size_t, char>>;
2075 const std::shared_ptr<Ope> &binop,
const BinOpeInfo &info,
2080 std::any &dt)
const override {
2084 void accept(Visitor &v)
override;
2097 Context &c, std::any &dt,
size_t min_prec)
const;
2107 std::any &dt)
const override;
2109 void accept(Visitor &v)
override;
2114class Cut :
public Ope,
public std::enable_shared_from_this<Cut> {
2117 Context &c, std::any & )
const override {
2122 void accept(Visitor &v)
override;
2128template <
typename... Args> std::shared_ptr<Ope>
seq(Args &&...args) {
2129 return std::make_shared<Sequence>(
static_cast<std::shared_ptr<Ope>
>(args)...);
2132template <
typename... Args> std::shared_ptr<Ope>
cho(Args &&...args) {
2133 return std::make_shared<PrioritizedChoice>(
2134 false,
static_cast<std::shared_ptr<Ope>
>(args)...);
2137template <
typename... Args> std::shared_ptr<Ope>
cho4label_(Args &&...args) {
2138 return std::make_shared<PrioritizedChoice>(
2139 true,
static_cast<std::shared_ptr<Ope>
>(args)...);
2142inline std::shared_ptr<Ope>
zom(
const std::shared_ptr<Ope> &ope) {
2146inline std::shared_ptr<Ope>
oom(
const std::shared_ptr<Ope> &ope) {
2150inline std::shared_ptr<Ope>
opt(
const std::shared_ptr<Ope> &ope) {
2154inline std::shared_ptr<Ope>
rep(
const std::shared_ptr<Ope> &ope,
size_t min,
2156 return std::make_shared<Repetition>(ope, min, max);
2159inline std::shared_ptr<Ope>
apd(
const std::shared_ptr<Ope> &ope) {
2160 return std::make_shared<AndPredicate>(ope);
2163inline std::shared_ptr<Ope>
npd(
const std::shared_ptr<Ope> &ope) {
2164 return std::make_shared<NotPredicate>(ope);
2167inline std::shared_ptr<Ope>
dic(
const std::vector<std::string> &v,
2169 return std::make_shared<Dictionary>(v, ignore_case);
2172inline std::shared_ptr<Ope>
lit(std::string &&s) {
2173 return std::make_shared<LiteralString>(s,
false);
2176inline std::shared_ptr<Ope>
liti(std::string &&s) {
2177 return std::make_shared<LiteralString>(s,
true);
2180inline std::shared_ptr<Ope>
cls(
const std::string &s) {
2181 return std::make_shared<CharacterClass>(s,
false,
false);
2184inline std::shared_ptr<Ope>
2185cls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
2186 bool ignore_case =
false) {
2187 return std::make_shared<CharacterClass>(ranges,
false, ignore_case);
2190inline std::shared_ptr<Ope>
ncls(
const std::string &s) {
2191 return std::make_shared<CharacterClass>(s,
true,
false);
2194inline std::shared_ptr<Ope>
2195ncls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
2196 bool ignore_case =
false) {
2197 return std::make_shared<CharacterClass>(ranges,
true, ignore_case);
2200inline std::shared_ptr<Ope>
chr(
char32_t dt) {
2201 return std::make_shared<Character>(dt);
2204inline std::shared_ptr<Ope>
dot() {
return std::make_shared<AnyCharacter>(); }
2206inline std::shared_ptr<Ope>
csc(
const std::shared_ptr<Ope> &ope) {
2207 return std::make_shared<CaptureScope>(ope);
2210inline std::shared_ptr<Ope>
cap(
const std::shared_ptr<Ope> &ope,
2212 return std::make_shared<Capture>(ope, ma);
2215inline std::shared_ptr<Ope>
tok(
const std::shared_ptr<Ope> &ope) {
2216 return std::make_shared<TokenBoundary>(ope);
2219inline std::shared_ptr<Ope>
ign(
const std::shared_ptr<Ope> &ope) {
2220 return std::make_shared<Ignore>(ope);
2223inline std::shared_ptr<Ope>
2227 return std::make_shared<User>(fn);
2230inline std::shared_ptr<Ope>
ref(
const Grammar &grammar,
const std::string &name,
2231 const char *s,
bool is_macro,
2232 const std::vector<std::shared_ptr<Ope>> &args) {
2233 return std::make_shared<Reference>(grammar, name, s, is_macro, args);
2236inline std::shared_ptr<Ope>
wsp(
const std::shared_ptr<Ope> &ope) {
2237 return std::make_shared<Whitespace>(std::make_shared<Ignore>(ope));
2240inline std::shared_ptr<Ope>
bkr(std::string &&name) {
2241 return std::make_shared<BackReference>(name);
2244inline std::shared_ptr<Ope>
pre(
const std::shared_ptr<Ope> &atom,
2245 const std::shared_ptr<Ope> &binop,
2248 return std::make_shared<PrecedenceClimbing>(atom, binop, info, rule);
2251inline std::shared_ptr<Ope>
rec(
const std::shared_ptr<Ope> &ope) {
2252 return std::make_shared<Recovery>(ope);
2255inline std::shared_ptr<Ope>
cut() {
return std::make_shared<Cut>(); }
2290 for (
auto &op : ope.
opes_) {
2295 for (
auto &op : ope.
opes_) {
2357 std::unordered_map<void *, size_t>
ids;
2364 for (
const auto &op : ope.
opes_) {
2430 for (
const auto &op : ope.
opes_) {
2441 for (
const auto &op : ope.
opes_) {
2450 ope.
ope_->accept(*
this);
2454 ope.
ope_->accept(*
this);
2458 ope.
ope_->accept(*
this);
2499 std::set<std::pair<const Definition *, size_t>>
refs_;
2513 ComputeCanBeEmpty vis;
2520 ComputeCanBeEmpty vis;
2551 s +=
"(rep " + std::to_string(ope.
min_) +
" " +
2552 (ope.
max_ == std::numeric_limits<size_t>::max()
2553 ? std::string(
"inf")
2554 : std::to_string(ope.
max_));
2570 if (
auto p = ope.
weak_.lock()) {
2577 s +=
"(ref " + ope.
name_;
2578 for (
auto &arg : ope.
args_) {
2588 s +=
"(cls " + std::to_string(ope.
negated_) +
" " +
2590 for (
const auto &[lo, hi] : ope.
ranges_) {
2591 s +=
" " + std::to_string(
static_cast<uint32_t
>(lo)) +
"-" +
2592 std::to_string(
static_cast<uint32_t
>(hi));
2597 s +=
"(chr " + std::to_string(
static_cast<uint32_t
>(ope.
ch_)) +
")";
2609 return std::move(vis.
s);
2613 void group(
const char *tag,
const std::vector<std::shared_ptr<Ope>> &v) {
2616 for (
const auto &op : v) {
2633 s +=
"(opq " + std::to_string(
reinterpret_cast<std::uintptr_t
>(p)) +
")";
2641 std::unordered_map<std::string, bool> &has_error_cache)
2646 for (
const auto &op : ope.
opes_) {
2652 if (ope.
min_ == 0) {
2655 ope.
ope_->accept(*
this);
2674 std::vector<std::pair<const char *, std::string>> &
refs_;
2682 std::vector<std::pair<const char *, std::string>> &refs,
2683 std::unordered_map<std::string, bool> &has_error_cache)
2685 refs_.emplace_back(s, name);
2689 std::unordered_map<std::string, bool> &has_error_cache)
2693 for (
const auto &op : ope.
opes_) {
2699 for (
const auto &op : ope.
opes_) {
2705 if (ope.
max_ == std::numeric_limits<size_t>::max()) {
2707 ope.
ope_->accept(vis);
2714 ope.
ope_->accept(*
this);
2724 std::vector<std::pair<const char *, std::string>> &
refs_;
2732 const std::vector<std::string> ¶ms)
2737 std::unordered_map<std::string, const char *>
error_s;
2763 const std::vector<std::string> ¶ms)
2767 std::vector<std::shared_ptr<Ope>> opes;
2768 for (
const auto &o : ope.
opes_) {
2770 opes.emplace_back(std::move(
found_ope));
2772 found_ope = std::make_shared<Sequence>(opes);
2775 std::vector<std::shared_ptr<Ope>> opes;
2776 for (
const auto &o : ope.
opes_) {
2778 opes.emplace_back(std::move(
found_ope));
2780 found_ope = std::make_shared<PrioritizedChoice>(opes);
2783 ope.
ope_->accept(*
this);
2787 ope.
ope_->accept(*
this);
2791 ope.
ope_->accept(*
this);
2804 ope.
ope_->accept(*
this);
2808 ope.
ope_->accept(*
this);
2812 ope.
ope_->accept(*
this);
2816 ope.
ope_->accept(*
this);
2823 ope.
ope_->accept(*
this);
2827 ope.
atom_->accept(*
this);
2831 ope.
ope_->accept(*
this);
2839 const std::vector<std::shared_ptr<Ope>> &
args_;
2850 for (
const auto &op : ope.
opes_) {
2870 for (
const auto &op : ope.
opes_) {
2878 ope.
ope_->accept(*
this);
2879 if (ope.
min_ == 0) {
result_.can_be_empty =
true; }
2884 for (
const auto &[key, info] : ope.
trie_.
dic_) {
2886 auto ch =
static_cast<unsigned char>(key[0]);
2889 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2890 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2896 if (ope.
lit_.empty()) {
2899 auto ch =
static_cast<unsigned char>(ope.
lit_[0]);
2902 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2903 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2909 for (
const auto &range : ope.
ranges_) {
2910 auto cp1 = range.first;
2911 auto cp2 = range.second;
2912 if (cp1 > 0x7F || cp2 > 0x7F) {
2917 for (
auto cp = cp1; cp <= cp2; cp++) {
2918 auto ch =
static_cast<unsigned char>(cp);
2921 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2922 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2932 if (ope.
ch_ > 0x7F) {
2935 result_.chars.set(
static_cast<unsigned char>(ope.
ch_));
2958 std::unordered_set<const Definition *>
refs_;
2971 for (
const auto &op : ope.
opes_) {
2976 for (
const auto &op : ope.
opes_) {
2981 ope.
ope_->accept(*
this);
2984 if (cc && cc->is_ascii_only()) { ope.
span_bitset_ = &cc->ascii_bitset(); }
3024 operator std::shared_ptr<Ope>() {
3025 return std::make_shared<WeakHolder>(
holder_);
3038 return parse_core(s, n, vs, dt, path, log, error_reporter);
3044 return parse(s, n, path, log, error_reporter);
3048 const char *path =
nullptr,
Log log =
nullptr,
3051 return parse_core(s, n, vs, dt, path, log, error_reporter);
3058 return parse(s, n, dt, path, log, error_reporter);
3061 template <
typename T>
3063 const char *path =
nullptr,
Log log =
nullptr,
3067 auto r =
parse_core(s, n, vs, dt, path, log, error_reporter);
3068 if (r.ret && !vs.empty() && vs.front().has_value()) {
3069 val = std::any_cast<T>(vs[0]);
3074 template <
typename T>
3082 template <
typename T>
3084 const char *path =
nullptr,
Log log =
nullptr,
3087 auto r =
parse_core(s, n, vs, dt, path, log, error_reporter);
3088 if (r.ret && !vs.empty() && vs.front().has_value()) {
3089 val = std::any_cast<T>(vs[0]);
3094 template <
typename T>
3096 const char *path =
nullptr,
Log log =
nullptr,
3102#if defined(__cpp_lib_char8_t)
3103 Result parse(
const char8_t *s,
size_t n,
const char *path =
nullptr,
3104 Log log =
nullptr)
const {
3105 return parse(
reinterpret_cast<const char *
>(s), n, path, log);
3108 Result parse(
const char8_t *s,
const char *path =
nullptr,
3109 Log log =
nullptr)
const {
3110 return parse(
reinterpret_cast<const char *
>(s), path, log);
3113 Result parse(
const char8_t *s,
size_t n, std::any &dt,
3114 const char *path =
nullptr,
Log log =
nullptr)
const {
3115 return parse(
reinterpret_cast<const char *
>(s), n, dt, path, log);
3118 Result parse(
const char8_t *s, std::any &dt,
const char *path =
nullptr,
3119 Log log =
nullptr)
const {
3120 return parse(
reinterpret_cast<const char *
>(s), dt, path, log);
3123 template <
typename T>
3125 const char *path =
nullptr,
3126 Log log =
nullptr)
const {
3131 template <
typename T>
3133 const char *path =
nullptr,
3134 Log log =
nullptr)
const {
3139 template <
typename T>
3141 const char *path =
nullptr,
3142 Log log =
nullptr)
const {
3147 template <
typename T>
3149 const char *path =
nullptr,
3150 Log log =
nullptr)
const {
3180 const char *
s_ =
nullptr;
3181 std::pair<size_t, size_t>
line_ = {1, 1};
3187 std::function<void(
const Context &c,
const char *s,
size_t n, std::any &dt)>
3189 std::function<void(
const Context &c,
const char *s,
size_t n,
size_t matchlen,
3190 std::any &value, std::any &dt)>
3241 const char *path,
Log log,
3245 std::shared_ptr<Ope> ope =
holder_;
3247 std::any trace_data;
3253 const std::vector<int32_t> *packrat_index =
nullptr;
3254 size_t packrat_cached_count = 0;
3268 packrat_cached_count);
3289 auto len = ope->parse(s + i, n - i, vs, c, dt);
3322 Context &c, std::any &dt,
const std::string &
lit,
3323 std::once_flag &init_is_word,
bool &is_word,
3324 bool ignore_case,
const std::string &lower_lit) {
3326 for (; i <
lit.size(); i++) {
3329 ? (
static_cast<char>(
3332 : (s[i] !=
lit[i]))) {
3334 return static_cast<size_t>(-1);
3345 std::call_once(init_is_word, [&]() {
3347 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
3348 nullptr,
nullptr,
false,
nullptr);
3352 c.
wordOpe->parse(
lit.data(),
lit.size(), dummy_vs, dummy_c, dummy_dt);
3358 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
3359 nullptr,
nullptr,
false,
nullptr);
3363 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
3374 if (
fail(wl)) {
return wl; }
3382 return c_->line_info(
sv_.data());
3386 const char *s,
size_t n) {
3393 if (!unexpected_token.empty()) {
3396 auto unexpected_char = unexpected_token.substr(
3406 report.
line = line.first;
3407 report.
col = line.second;
3414 if (log) { log(line.first, line.second, msg,
label); }
3422 report.
line = line.first;
3423 report.
col = line.second;
3428 msg =
"syntax error.";
3430 msg =
"syntax error";
3434 !unexpected_token.empty()) {
3435 msg +=
", unexpected '";
3436 msg += unexpected_token;
3441 auto first_item =
true;
3447 if (!(error_rule && error_rule->name[0] ==
'_')) {
3448 msg += (first_item ?
", expecting " :
", ");
3449 if (error_literal) {
3451 msg += error_literal;
3455 msg +=
"<" + error_rule->name +
">";
3456 if (
label.empty()) {
label = error_rule->name; }
3470 if (log) { log(line.first, line.second, msg,
label); }
3492 const char *error_literal =
nullptr;
3496 error_literal = literal;
3499 auto ope = rule->get_core_operator();
3501 token && token[0] !=
'\0') {
3502 error_literal = token;
3508 if (r->is_token()) {
break; }
3511 if (error_literal || error_rule) {
3540 Context &c, std::any &dt)
const {
3552 std::any &dt)
const {
3554 auto i =
trie_.match(s, n,
id);
3558 return static_cast<size_t>(-1);
3573 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
3574 nullptr,
nullptr,
false,
nullptr);
3578 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
3589 if (
fail(wl)) {
return wl; }
3597 std::any &dt)
const {
3604 std::any &dt)
const {
3614 len =
ope_->parse(s, n, vs, c, dt);
3618 vs.
tokens.emplace_back(std::string_view(s, len));
3621 if (
fail(wl)) {
return wl; }
3632 auto pos = msg.find(
"%{");
3633 if (pos == std::string::npos) {
return msg; }
3637 while (pos != std::string::npos) {
3638 auto end = msg.find(
'}', pos + 2);
3639 if (end == std::string::npos) {
break; }
3640 r.append(msg, i, pos - i);
3641 auto name = std::string_view(msg).substr(pos + 2, end - (pos + 2));
3644 if (it->first == name) {
3647 auto v = std::string_view(it->second);
3648 while (!v.empty() &&
3649 std::isspace(
static_cast<unsigned char>(v.back()))) {
3652 while (!v.empty() &&
3653 std::isspace(
static_cast<unsigned char>(v.front()))) {
3661 pos = msg.find(
"%{", i);
3663 r.append(msg, i, msg.size() - i);
3668 Context &c, std::any &dt)
const {
3670 throw std::logic_error(
"Uninitialized definition ope was used...");
3678 auto len =
ope_->parse(s, n, vs, c, dt);
3689 auto do_parse = [&]() {
3697 if (
outer_->leave) {
outer_->leave(c, s, n, parse_len, parse_val, dt); }
3701 if (
outer_->no_whitespace) {
3705 parse_len =
ope_->parse(s, n, chvs, c, dt);
3716 parse_len =
ope_->parse(s, n, chvs, c, dt);
3721 chvs.sv_ = std::string_view(s, parse_len);
3722 chvs.name_ =
outer_->name;
3724 auto ope_ptr =
ope_.get();
3725 if (ope_ptr->is_token_boundary) {
3728 if (!ope_ptr->is_choice_like) {
3729 chvs.choice_count_ = 0;
3734 std::any predicate_data;
3736 if (!
outer_->predicate(chvs, dt, msg, predicate_data)) {
3743 parse_len =
static_cast<size_t>(-1);
3767 return std::make_pair(parse_len, std::move(parse_val));
3770 if (
outer_->is_left_recursive) {
3777 auto it = c.
lr_memo.find(lr_key);
3779 if (
success(it->second.len)) {
3780 len = it->second.len;
3781 val = it->second.val;
3783 len =
static_cast<size_t>(-1);
3790 c.
lr_memo[lr_key] = {
static_cast<size_t>(-1), {}};
3802 auto [initial_len, initial_val] = do_parse();
3809 if (!cycle_rules.empty()) { cycle_rules.insert(lr_rule); }
3813 c.
lr_refs_hit.insert(cycle_rules.begin(), cycle_rules.end());
3817 len =
static_cast<size_t>(-1);
3821 val = std::move(initial_val);
3822 c.
lr_memo[lr_key] = {len, val};
3834 for (
auto memo_it = c.
lr_memo.begin(); memo_it != c.
lr_memo.end();) {
3835 if (memo_it->first.second == s && memo_it->first.first != lr_rule &&
3836 cycle_rules.count(memo_it->first.first) &&
3838 memo_it = c.
lr_memo.erase(memo_it);
3844 auto [new_len, new_val] = do_parse();
3846 if (!
success(new_len) || new_len <= len) {
3851 val = std::move(new_val);
3852 c.
lr_memo[lr_key] = {len, val};
3867 auto [parse_len, parse_val] = do_parse();
3869 if (success(len)) { a_val = std::move(parse_val); }
3875 if (c.
lr_memo.count(guard_key)) {
3876 len =
static_cast<size_t>(-1);
3878 c.
lr_memo[guard_key] = {
static_cast<size_t>(-1), {}};
3879 auto [parse_len, parse_val] = do_parse();
3881 val = std::move(parse_val);
3888 if (!outer_->ignoreSemanticValue) {
3889 vs.emplace_back(std::move(val));
3890 vs.tags.emplace_back(
str2tag(outer_->name));
3898 const std::any &predicate_data)
const {
3900 return outer_->action(vs, dt, predicate_data);
3901 }
else if (vs.empty()) {
3904 return std::move(vs.front());
3919inline std::vector<const void *>
3921 const std::vector<std::shared_ptr<Ope>> &args) {
3922 std::vector<const void *> key;
3923 key.reserve(args.size() + 1);
3925 for (
const auto &arg : args) {
3927 key.push_back(
ref &&
ref->rule_ ?
static_cast<const void *
>(
ref->rule_)
3928 :
static_cast<const void *
>(arg.get()));
3934 Context &c, std::any &dt)
const {
3944 if (
rule_->is_macro) {
3949 std::vector<std::shared_ptr<Ope>> args;
3950 for (
const auto &arg :
args_) {
3952 args.emplace_back(std::move(vis.
found_ope));
3955 auto inst =
rule_->is_left_recursive
3960 return rule_->holder_->parse(s, n, vs, c, dt);
3963 c.
push_args(std::vector<std::shared_ptr<Ope>>());
3965 return rule_->holder_->parse(s, n, vs, c, dt);
3970 return args[
iarg_]->parse(s, n, vs, c, dt);
3975 return rule_->holder_;
3980 std::any &dt)
const {
3983 if (it->first ==
name_) {
3984 const auto &
lit = it->second;
3985 std::once_flag init_is_word;
3986 auto is_word =
false;
3987 static const std::string empty;
3995 return static_cast<size_t>(-1);
4000 if (
rule_.is_macro) {
4004 auto arg = args[iarg];
4014 size_t min_prec)
const {
4015 auto len =
atom_->parse(s, n, vs, c, dt);
4016 if (
fail(len)) {
return len; }
4020 auto action = std::move(rule.action);
4023 const std::any &predicate_data2) {
4026 return action(vs2, dt2, predicate_data2);
4027 }
else if (!vs2.empty()) {
4032 auto action_se =
scope_exit([&]() { rule.action = std::move(action); });
4036 std::vector<std::any> save_values(vs.begin(), vs.end());
4037 auto save_tokens = vs.
tokens;
4040 auto chlen =
binop_->parse(s + i, n - i, chvs, c, dt);
4043 if (
fail(chlen)) {
break; }
4046 if (it ==
info_.end()) {
break; }
4048 auto level = std::get<0>(it->second);
4049 auto assoc = std::get<1>(it->second);
4051 if (level < min_prec) {
break; }
4053 vs.emplace_back(std::move(chvs[0]));
4056 auto next_min_prec = level;
4057 if (assoc ==
'L') { next_min_prec = level + 1; }
4064 vs.assign(save_values.begin(), save_values.end());
4070 vs.emplace_back(std::move(chvs[0]));
4075 vs.
sv_ = std::string_view(s, i);
4076 static const std::any empty_predicate_data;
4077 val =
rule_.action(vs, dt, empty_predicate_data);
4078 }
else if (!vs.empty()) {
4082 vs.emplace_back(std::move(val));
4090 std::any & )
const {
4091 const auto &rule =
dynamic_cast<Reference &
>(*ope_);
4095 auto label =
dynamic_cast<Reference *
>(rule.args_[0].get());
4096 if (label && !label->rule_->error_message.empty()) {
4105 auto len =
static_cast<size_t>(-1);
4107 auto save_log = c.
log;
4119 len = rule.parse(s, n, dummy_vs, c, dummy_dt);
4168 auto p =
static_cast<void *
>(ope.
outer_);
4169 if (
ids.count(p)) {
return; }
4170 auto id =
ids.size();
4173 ope.
ope_->accept(*
this);
4178 for (
const auto &arg : ope.
args_) {
4186 ope.
atom_->accept(*
this);
4187 ope.
binop_->accept(*
this);
4192 for (
const auto &arg : ope.
args_) {
4203 for (
const auto &arg : ope.
args_) {
4222 }
else if (param.ope) {
4224 if (
done_ ==
false) {
return; }
4228 }
else if (ope.
rule_ &&
4235 if (
done_ ==
false) {
return; }
4244 param.ope->accept(cbe);
4258 std::vector<std::shared_ptr<Ope>> args;
4259 args.reserve(ope.
args_.size());
4260 for (
const auto &arg : ope.
args_) {
4265 args.push_back(resolved ? resolved : arg);
4282 arg.
ope->accept(*
this);
4289 if (iarg >= args.size()) {
return {}; }
4290 auto ref =
dynamic_cast<Reference *
>(args[iarg].get());
4291 if (
ref && !
ref->rule_) {
4296 return {args[iarg],
static_cast<size_t>(i)};
4302 auto save_is_empty =
false;
4303 const char *save_error_s =
nullptr;
4304 std::string save_error_name;
4306 auto it = ope.
opes_.begin();
4307 while (it != ope.
opes_.end()) {
4308 (*it)->accept(*
this);
4311 while (it != ope.
opes_.end()) {
4339 auto it = std::find_if(
refs_.begin(),
refs_.end(),
4340 [&](
const std::pair<const char *, std::string> &
ref) {
4341 return ope.name_ == ref.second;
4343 if (it !=
refs_.end()) {
return; }
4353 auto it = std::find_if(
refs_.begin(),
refs_.end(),
4354 [&](
const std::pair<const char *, std::string> &
ref) {
4355 return ope.name_ == ref.second;
4357 if (it !=
refs_.end()) {
return; }
4372 for (
const auto &arg : ope.
args_) {
4380 if (it !=
params_.end()) {
return; }
4388 if (rule.is_macro) {
4397 for (
const auto &arg : ope.
args_) {
4413 if (it !=
cache_.end()) {
4414 rule_fs = &it->second;
4423 computed = std::move(
result_);
4428 it =
cache_.try_emplace(ope.
rule_, std::move(computed)).first;
4429 rule_fs = &it->second;
4434 rule_fs = &computed;
4450 if (!ope.
rule_) {
return; }
4460 ope.
ope_->accept(*
this);
4466 for (
const auto &op : ope.
opes_) {
4477 if (
seq.opes_.size() != 2) {
return; }
4481 if (!not_pred) {
return; }
4484 auto *
ref =
dynamic_cast<Reference *
>(not_pred->ope_.get());
4485 if (!
ref || !
ref->rule_) {
return; }
4489 auto *holder =
dynamic_cast<Holder *
>(
ref->get_core_operator().get());
4490 if (!holder) {
return; }
4492 if (!choice) {
return; }
4495 std::vector<std::string> exact_keywords;
4496 std::vector<std::string> prefix_keywords;
4498 for (
const auto &alt : choice->opes_) {
4501 if (!
lit->ignore_case_) {
return; }
4506 auto *sub_seq =
dynamic_cast<Sequence *
>(alt.get());
4507 if (sub_seq && !sub_seq->opes_.empty()) {
4508 auto *first_lit =
dynamic_cast<LiteralString *
>(sub_seq->opes_[0].get());
4510 auto all_ignore_case_lits =
4511 std::all_of(sub_seq->opes_.begin(), sub_seq->opes_.end(),
4512 [](
const auto &child) {
4513 auto *l = dynamic_cast<LiteralString *>(child.get());
4514 return l && l->ignore_case_;
4516 if (all_ignore_case_lits) {
4517 prefix_keywords.push_back(
to_lower(first_lit->lit_));
4526 if (exact_keywords.empty()) {
return; }
4530 if (!tb) {
return; }
4537 auto *inner_seq =
dynamic_cast<Sequence *
>(tb->ope_.get());
4538 if (inner_seq && inner_seq->opes_.size() == 2) {
4539 first_cc =
dynamic_cast<CharacterClass *
>(inner_seq->opes_[0].get());
4540 auto *
rep =
dynamic_cast<Repetition *
>(inner_seq->opes_[1].get());
4544 if (!first_cc || !rest_cc) {
return; }
4548 auto kw = std::make_unique<KeywordGuardData>();
4553 size_t min_len = SIZE_MAX, max_len = 0;
4554 for (
const auto &k : exact_keywords) {
4555 min_len = std::min(min_len, k.size());
4556 max_len = std::max(max_len, k.size());
4558 for (
const auto &k : prefix_keywords) {
4559 min_len = std::min(min_len, k.size());
4560 max_len = std::max(max_len, k.size());
4562 kw->min_keyword_len = min_len;
4563 kw->max_keyword_len = max_len;
4565 kw->exact_keywords = std::move(exact_keywords);
4566 kw->prefix_keywords = std::move(prefix_keywords);
4567 seq.kw_guard_ = std::move(kw);
4576 if (def_count == 0) {
return; }
4586 std::vector<bool> reachable;
4590 CollectLeftmostRules(
size_t n)
4591 : reachable(n,
false), visited_rules(n,
false) {}
4596 void collect(
const std::vector<std::shared_ptr<Ope>> &opes,
size_t from) {
4597 for (
auto i = from; i < opes.size(); i++) {
4598 opes[i]->accept(*
this);
4600 opes[i]->accept(empty_vis);
4601 if (!empty_vis.
result) {
break; }
4605 void visit(
Sequence &ope)
override { collect(ope.
opes_, 0); }
4606 void visit(
Holder &ope)
override {
4608 if (
id < reachable.size()) {
4609 reachable[
id] =
true;
4616 if (visited_rules[
id]) {
return; }
4617 visited_rules[
id] =
true;
4619 ope.
ope_->accept(*
this);
4624 reachable[ope.
rule_->
id] =
true;
4632 std::vector<bool> benefits(def_count,
false);
4636 std::vector<bool> &benefits;
4638 std::vector<bool> visited_rules;
4640 FindBacktrackRules(std::vector<bool> &b,
size_t n)
4641 : benefits(b), def_count(n), visited_rules(n,
false) {}
4643 using Elements = std::vector<std::shared_ptr<Ope>>;
4647 static Elements elements_of(
const std::shared_ptr<Ope> &alt) {
4648 if (
auto *
seq =
dynamic_cast<Sequence *
>(alt.get())) {
4659 void mark_aligned(
const std::vector<Elements> &group,
size_t k) {
4660 if (group.size() < 2) {
return; }
4662 std::vector<std::vector<bool>> reachable;
4663 reachable.reserve(group.size());
4664 for (
const auto &
seq : group) {
4665 CollectLeftmostRules clr(def_count);
4666 clr.collect(
seq, k);
4667 reachable.push_back(std::move(clr.reachable));
4669 for (
size_t id = 0;
id < def_count;
id++) {
4671 for (
const auto &alt : reachable) {
4672 if (alt[
id]) { count++; }
4674 if (count >= 2) { benefits[
id] =
true; }
4678 std::map<std::string, std::vector<Elements>> aligned;
4679 for (
const auto &
seq : group) {
4680 if (k <
seq.size()) {
4684 for (
const auto &[sig, sub] : aligned) {
4685 mark_aligned(sub, k + 1);
4690 std::vector<Elements> group;
4691 group.reserve(ope.
opes_.size());
4692 for (
const auto &op : ope.
opes_) {
4693 group.push_back(elements_of(op));
4695 mark_aligned(group, 0);
4698 for (
auto &op : ope.
opes_) {
4702 void visit(
Holder &ope)
override {
4704 if (
id < visited_rules.size() && !visited_rules[
id]) {
4705 visited_rules[
id] =
true;
4706 ope.
ope_->accept(*
this);
4714 FindBacktrackRules finder(benefits, def_count);
4724 if (def->is_left_recursive && !def->is_macro &&
id < def_count) {
4725 benefits[
id] =
true;
4732 for (
size_t id = 0;
id < def_count;
id++) {
4741 auto found_param =
false;
4742 for (
size_t i = 0; i <
params_.size(); i++) {
4743 const auto ¶m =
params_[i];
4744 if (param == ope.
name_) {
4757 for (
const auto &arg : ope.
args_) {
4763 for (
size_t i = 0; i <
args_.size(); i++) {
4764 const auto &name =
params_[i];
4765 if (name == ope.
name_) {
4813 std::vector<uint8_t>
b;
4814 void u8(uint8_t v) {
b.push_back(v); }
4816 for (
int i = 0; i < 4; i++)
4817 b.push_back((v >> (8 * i)) & 0xff);
4820 for (
int i = 0; i < 8; i++)
4821 b.push_back((v >> (8 * i)) & 0xff);
4823 void str(
const std::string &s) {
4824 u32((uint32_t)s.size());
4825 b.insert(
b.end(), s.begin(), s.end());
4835 if (
auto x =
dynamic_cast<Sequence *
>(p)) {
4837 w.
u32((uint32_t)x->opes_.size());
4838 for (
auto &c : x->opes_)
4842 w.
u8(x->for_label_ ? 1 : 0);
4843 w.
u32((uint32_t)x->opes_.size());
4844 for (
auto &c : x->opes_)
4846 }
else if (
auto x =
dynamic_cast<Repetition *
>(p)) {
4857 }
else if (
auto x =
dynamic_cast<Dictionary *
>(p)) {
4859 w.
u8(x->trie_.ignore_case_ ? 1 : 0);
4865 std::vector<std::string> words(x->trie_.items_count());
4866 for (
auto &kv : x->trie_.dic_)
4867 if (kv.second.match && kv.second.id < words.size())
4868 words[kv.second.id] = kv.first;
4869 w.
u32((uint32_t)words.size());
4870 for (
auto &s : words)
4874 w.
u8(x->ignore_case_ ? 1 : 0);
4878 w.
u8(x->negated_ ? 1 : 0);
4879 w.
u8(x->ignore_case_ ? 1 : 0);
4880 w.
u32((uint32_t)x->ranges_.size());
4881 for (
auto &r : x->ranges_) {
4882 w.
u32((uint32_t)r.first);
4883 w.
u32((uint32_t)r.second);
4885 }
else if (
auto x =
dynamic_cast<Character *
>(p)) {
4887 w.
u32((uint32_t)x->ch_);
4893 }
else if (
auto x =
dynamic_cast<Capture *
>(p)) {
4894 if (x->match_action_) {
4895 throw std::runtime_error(
4896 "GrammarBlob: Capture with a match action is not serializable");
4903 }
else if (
auto x =
dynamic_cast<Ignore *
>(p)) {
4909 }
else if (
auto x =
dynamic_cast<Reference *
>(p)) {
4911 w.
u8(x->is_macro_ ? 1 : 0);
4913 w.
u32((uint32_t)x->args_.size());
4914 for (
auto &a : x->args_)
4916 }
else if (
auto x =
dynamic_cast<Whitespace *
>(p)) {
4919 }
else if (
auto x =
dynamic_cast<Recovery *
>(p)) {
4922 }
else if (
dynamic_cast<Cut *
>(p)) {
4928 w.
u32((uint32_t)x->info_.size());
4929 for (
auto &[key, pri] : x->info_) {
4930 w.
str(std::string(key));
4931 w.
u64((uint64_t)pri.first);
4932 w.
u8((uint8_t)pri.second);
4935 throw std::runtime_error(
4936 "GrammarBlob: operator not serializable (a custom User operator or "
4937 "a Capture with a match action)");
4945 throw std::runtime_error(
"GrammarBlob: unexpected end of blob");
4950 for (
int i = 0; i < 4; i++)
4951 v |= (uint32_t)
u8() << (8 * i);
4956 for (
int i = 0; i < 8; i++)
4957 v |= (uint64_t)
u8() << (8 * i);
4962 std::string s((
const char *)
p, (
const char *)
p + n);
4971 case T_Null:
return nullptr;
4973 uint32_t n = r.
u32();
4974 std::vector<std::shared_ptr<Ope>> v;
4975 for (uint32_t i = 0; i < n; i++)
4976 v.push_back(
read_ope(r, g, owner));
4977 return std::make_shared<Sequence>(std::move(v));
4981 uint32_t n = r.
u32();
4982 std::vector<std::shared_ptr<Ope>> v;
4983 for (uint32_t i = 0; i < n; i++)
4984 v.push_back(
read_ope(r, g, owner));
4985 auto c = std::make_shared<PrioritizedChoice>(std::move(v));
4990 uint64_t mn = r.
u64(), mx = r.
u64();
4992 return std::make_shared<Repetition>(o, mn, mx);
4994 case T_And:
return std::make_shared<AndPredicate>(
read_ope(r, g, owner));
4995 case T_Not:
return std::make_shared<NotPredicate>(
read_ope(r, g, owner));
4998 uint32_t n = r.
u32();
4999 std::vector<std::string> words;
5000 for (uint32_t i = 0; i < n; i++)
5001 words.push_back(r.
str());
5002 return std::make_shared<Dictionary>(words, ic);
5006 std::string s = r.
str();
5007 return std::make_shared<LiteralString>(std::move(s), ic);
5010 bool neg = r.
u8(), ic = r.
u8();
5011 uint32_t n = r.
u32();
5012 std::vector<std::pair<char32_t, char32_t>> ranges;
5013 for (uint32_t i = 0; i < n; i++) {
5014 auto lo = r.
u32(), hi = r.
u32();
5015 ranges.emplace_back((
char32_t)lo, (
char32_t)hi);
5017 return std::make_shared<CharacterClass>(ranges, neg, ic);
5019 case T_Char:
return std::make_shared<Character>((
char32_t)r.
u32());
5020 case T_AnyChar:
return std::make_shared<AnyCharacter>();
5022 return std::make_shared<CaptureScope>(
read_ope(r, g, owner));
5025 return std::make_shared<Capture>(o,
nullptr);
5028 return std::make_shared<TokenBoundary>(
read_ope(r, g, owner));
5030 case T_BackRef:
return std::make_shared<BackReference>(r.
str());
5033 std::string nm = r.
str();
5034 uint32_t n = r.
u32();
5035 std::vector<std::shared_ptr<Ope>> args;
5036 for (uint32_t i = 0; i < n; i++)
5037 args.push_back(
read_ope(r, g, owner));
5038 return std::make_shared<Reference>(g, nm,
nullptr, im, args);
5041 return std::make_shared<Whitespace>(
read_ope(r, g, owner));
5043 case T_Cut:
return std::make_shared<Cut>();
5046 throw std::runtime_error(
5047 "GrammarBlob: 'precedence' operator outside a rule body");
5050 auto binop =
read_ope(r, g, owner);
5051 uint32_t n = r.
u32();
5052 auto pc = std::make_shared<PrecedenceClimbing>(
5057 pc->info_keys_.reserve(n);
5058 for (uint32_t i = 0; i < n; i++) {
5059 std::string key = r.
str();
5060 auto level = (size_t)r.
u64();
5061 auto assoc = (char)r.
u8();
5062 pc->info_keys_.push_back(std::move(key));
5063 pc->info_[pc->info_keys_.back()] = std::pair(level, assoc);
5067 default:
throw std::runtime_error(
"GrammarBlob: bad operator tag");
5071 static const uint32_t
MAGIC = 0x50454732;
5074 const std::string &start) {
5078 w.
u32((uint32_t)g.size());
5085 std::vector<const Grammar::value_type *> defs;
5086 defs.reserve(g.size());
5088 defs.push_back(&kv);
5089 std::sort(defs.begin(), defs.end(),
5090 [](
const auto *a,
const auto *b) { return a->first < b->first; });
5091 for (
auto *kv : defs) {
5092 const auto &name = kv->first;
5093 const auto &def = kv->second;
5096 (def.ignoreSemanticValue ? 1 : 0) | (def.is_macro ? 2 : 0) |
5097 (def.no_ast_opt ? 4 : 0) | (def.eoi_check ? 8 : 0) |
5098 (def.enablePackratParsing ? 16 : 0) |
5099 (def.is_left_recursive ? 32 : 0) | (def.can_be_empty ? 64 : 0) |
5100 (def.disable_action ? 128 : 0);
5102 uint8_t flags2 = (def.no_whitespace ? 1 : 0);
5104 w.
u32((uint32_t)def.params.size());
5105 for (
auto &s : def.params)
5107 w.
str(def.ast_name);
5108 w.
str(def.error_message);
5111 return std::move(w.
b);
5114 static std::shared_ptr<Grammar>
deserialize(
const std::vector<uint8_t> &blob,
5115 std::string &start_out) {
5116 Reader r{blob.data(), blob.data() + blob.size()};
5118 throw std::runtime_error(
"GrammarBlob: bad magic / not a grammar blob");
5119 start_out = r.
str();
5120 uint32_t ndef = r.
u32();
5121 auto g = std::make_shared<Grammar>();
5125 for (uint32_t i = 0; i < ndef; i++) {
5126 std::string name = r.
str();
5127 uint8_t flags = r.
u8();
5128 uint8_t flags2 = r.
u8();
5129 uint32_t np = r.
u32();
5130 std::vector<std::string> params;
5131 for (uint32_t k = 0; k < np; k++)
5132 params.push_back(r.
str());
5133 std::string ast_name = r.
str();
5134 std::string err = r.
str();
5136 auto &def = (*g)[name];
5138 def.ignoreSemanticValue = flags & 1;
5139 def.is_macro = flags & 2;
5140 def.no_ast_opt = flags & 4;
5141 def.eoi_check = flags & 8;
5142 def.enablePackratParsing = flags & 16;
5143 def.is_left_recursive = flags & 32;
5144 def.can_be_empty = flags & 64;
5145 def.disable_action = flags & 128;
5146 def.no_whitespace = flags2 & 1;
5147 def.params = std::move(params);
5148 def.ast_name = std::move(ast_name);
5149 def.error_message = std::move(err);
5154 for (
auto &x : *g) {
5156 x.second.accept(vis);
5161 auto core = x.second.get_core_operator();
5162 if (
auto pc = std::dynamic_pointer_cast<PrecedenceClimbing>(core)) {
5163 pc->binop_->accept(vis);
5169 x.second.accept(vis);
5176 (*g)[start_out].whitespaceOpe =
5190using Rules = std::unordered_map<std::string, std::shared_ptr<Ope>>;
5201 Log log, std::string_view start,
5202 bool enable_left_recursion =
true) {
5204 enable_left_recursion);
5210 std::any dt = &data;
5214 return r.ret && r.len == n;
5217#if defined(__cpp_lib_char8_t)
5218 static bool parse_test(
const char *d,
const char8_t *s) {
5219 return parse_test(d,
reinterpret_cast<const char *
>(s));
5240 x.second.accept(vis);
5273 : std::runtime_error(what_arg),
r_(r) {}
5278 std::pair<size_t, size_t>
r_;
5283 g[
"Grammar"] <=
seq(
g[
"Spacing"],
oom(
g[
"Definition"]),
g[
"EndOfFile"]);
5288 g[
"Definition"] <=
seq(
g[
"Ignore"],
g[
"IdentCont"],
opt(
g[
"Parameters"]),
5289 g[
"Spacing"],
g[
"LEFTARROW"],
g[
"Expression"],
5290 opt(
g[
"Instruction"]));
5291 g[
"Expression"] <=
seq(
g[
"Sequence"],
zom(
seq(
g[
"SLASH"],
g[
"Sequence"])));
5292 g[
"Sequence"] <=
zom(
cho(
g[
"CUT"],
g[
"Prefix"]));
5293 g[
"Prefix"] <=
seq(
opt(
cho(
g[
"AND"],
g[
"NOT"])),
g[
"SuffixWithLabel"]);
5294 g[
"SuffixWithLabel"] <=
5295 seq(
g[
"Suffix"],
opt(
seq(
g[
"LABEL"],
g[
"Identifier"])));
5296 g[
"Suffix"] <=
seq(
g[
"Primary"],
opt(
g[
"Loop"]));
5297 g[
"Loop"] <=
cho(
g[
"QUESTION"],
g[
"STAR"],
g[
"PLUS"],
g[
"Repetition"]);
5303 cho(
seq(
g[
"Ignore"],
g[
"IdentCont"],
opt(
g[
"Arguments"]),
g[
"Spacing"],
5305 seq(
g[
"OPEN"],
g[
"Expression"],
g[
"CLOSE"]),
5306 seq(
g[
"BeginTok"],
g[
"Expression"],
g[
"EndTok"]),
g[
"CapScope"],
5307 seq(
g[
"BeginCap"],
g[
"Expression"],
g[
"EndCap"]),
g[
"BackRef"],
5308 g[
"DictionaryI"],
g[
"LiteralI"],
g[
"Dictionary"],
g[
"Literal"],
5309 g[
"NegatedClassI"],
g[
"NegatedClass"],
g[
"ClassI"],
g[
"Class"],
5312 g[
"Identifier"] <=
seq(
g[
"IdentCont"],
g[
"Spacing"]);
5313 g[
"IdentCont"] <=
tok(
seq(
g[
"IdentStart"],
zom(
g[
"IdentRest"])));
5315 const static std::vector<std::pair<char32_t, char32_t>> range = {
5320 g[
"IdentRest"] <=
cho(
g[
"IdentStart"],
cls(
"0-9"));
5322 g[
"Dictionary"] <=
seq(
g[
"LiteralD"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralD"])));
5325 seq(
g[
"LiteralID"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralID"])));
5328 cls(
"'"),
g[
"Spacing"]),
5330 cls(
"\""),
g[
"Spacing"]));
5331 g[
"Literal"] <= lit_ope;
5332 g[
"LiteralD"] <= lit_ope;
5334 auto lit_case_ignore_ope =
5339 g[
"LiteralI"] <= lit_case_ignore_ope;
5340 g[
"LiteralID"] <= lit_case_ignore_ope;
5350 g[
"NegatedClass"] <=
seq(
lit(
"[^"),
5353 g[
"NegatedClassI"] <=
seq(
lit(
"[^"),
5355 lit(
"]i"),
g[
"Spacing"]);
5360 g[
"ClassEscape"],
g[
"PosixClass"],
g[
"Char"]);
5362 g[
"ClassEscape"] <=
seq(
chr(
'\\'),
cls(
"dDwWsS"));
5373 rep(
cls(
"0-9a-fA-F"), 4, 4)),
5374 rep(
cls(
"0-9a-fA-F"), 4, 5))),
5378 seq(
g[
"BeginBracket"],
g[
"RepetitionRange"],
g[
"EndBracket"]);
5379 g[
"RepetitionRange"] <=
cho(
seq(
g[
"Number"],
g[
"COMMA"],
g[
"Number"]),
5380 seq(
g[
"Number"],
g[
"COMMA"]),
g[
"Number"],
5381 seq(
g[
"COMMA"],
g[
"Number"]));
5382 g[
"Number"] <=
seq(
oom(
cls(
"0-9")),
g[
"Spacing"]);
5384 g[
"CapScope"] <=
seq(
g[
"BeginCapScope"],
g[
"Expression"],
g[
"EndCapScope"]);
5387 ~g[
"SLASH"] <=
seq(
chr(
'/'),
g[
"Spacing"]);
5388 ~g[
"PIPE"] <=
seq(
chr(
'|'),
g[
"Spacing"]);
5389 g[
"AND"] <=
seq(
chr(
'&'),
g[
"Spacing"]);
5390 g[
"NOT"] <=
seq(
chr(
'!'),
g[
"Spacing"]);
5391 g[
"QUESTION"] <=
seq(
chr(
'?'),
g[
"Spacing"]);
5392 g[
"STAR"] <=
seq(
chr(
'*'),
g[
"Spacing"]);
5393 g[
"PLUS"] <=
seq(
chr(
'+'),
g[
"Spacing"]);
5394 ~g[
"OPEN"] <=
seq(
chr(
'('),
g[
"Spacing"]);
5395 ~g[
"CLOSE"] <=
seq(
chr(
')'),
g[
"Spacing"]);
5396 g[
"DOT"] <=
seq(
chr(
'.'),
g[
"Spacing"]);
5401 ~g[
"Spacing"] <=
zom(
cho(
g[
"Space"],
g[
"Comment"]));
5403 opt(
g[
"EndOfLine"]));
5404 g[
"Space"] <=
cho(
chr(
' '),
chr(
'\t'),
g[
"EndOfLine"]);
5408 ~g[
"BeginTok"] <=
seq(
chr(
'<'),
g[
"Spacing"]);
5409 ~g[
"EndTok"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
5411 ~g[
"BeginCapScope"] <=
seq(
chr(
'$'),
chr(
'('),
g[
"Spacing"]);
5412 ~g[
"EndCapScope"] <=
seq(
chr(
')'),
g[
"Spacing"]);
5414 g[
"BeginCap"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
chr(
'<'),
g[
"Spacing"]);
5415 ~g[
"EndCap"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
5417 g[
"BackRef"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
g[
"Spacing"]);
5419 g[
"IGNORE"] <=
chr(
'~');
5421 g[
"Ignore"] <=
opt(
g[
"IGNORE"]);
5422 g[
"Parameters"] <=
seq(
g[
"OPEN"],
g[
"Identifier"],
5423 zom(
seq(
g[
"COMMA"],
g[
"Identifier"])),
g[
"CLOSE"]);
5424 g[
"Arguments"] <=
seq(
g[
"OPEN"],
g[
"Expression"],
5425 zom(
seq(
g[
"COMMA"],
g[
"Expression"])),
g[
"CLOSE"]);
5426 ~g[
"COMMA"] <=
seq(
chr(
','),
g[
"Spacing"]);
5430 seq(
g[
"BeginBracket"],
5431 opt(
seq(
g[
"InstructionItem"],
zom(
seq(
g[
"InstructionItemSeparator"],
5432 g[
"InstructionItem"])))),
5434 g[
"InstructionItem"] <=
cho(
g[
"PrecedenceClimbing"],
g[
"ErrorMessage"],
5435 g[
"NoAstOpt"],
g[
"NoWhitespace"],
g[
"AstName"]);
5436 ~g[
"InstructionItemSeparator"] <=
seq(
chr(
';'),
g[
"Spacing"]);
5438 ~g[
"SpacesZom"] <=
zom(
g[
"Space"]);
5439 ~g[
"SpacesOom"] <=
oom(
g[
"Space"]);
5440 ~g[
"BeginBracket"] <=
seq(
chr(
'{'),
g[
"Spacing"]);
5441 ~g[
"EndBracket"] <=
seq(
chr(
'}'),
g[
"Spacing"]);
5444 g[
"PrecedenceClimbing"] <=
5445 seq(
lit(
"precedence"),
g[
"SpacesOom"],
g[
"PrecedenceInfo"],
5446 zom(
seq(
g[
"SpacesOom"],
g[
"PrecedenceInfo"])),
g[
"SpacesZom"]);
5447 g[
"PrecedenceInfo"] <=
5448 seq(
g[
"PrecedenceAssoc"],
5449 oom(
seq(
ign(
g[
"SpacesOom"]),
g[
"PrecedenceOpe"])));
5450 g[
"PrecedenceOpe"] <=
5459 g[
"PrecedenceAssoc"] <=
cls(
"LR");
5462 g[
"ErrorMessage"] <=
seq(
lit(
"error_message"),
g[
"SpacesOom"],
5463 g[
"LiteralD"],
g[
"SpacesZom"]);
5466 g[
"NoAstOpt"] <=
seq(
lit(
"no_ast_opt"),
g[
"SpacesZom"]);
5469 g[
"NoWhitespace"] <=
seq(
lit(
"no_whitespace"),
g[
"SpacesZom"]);
5472 g[
"AstName"] <=
seq(
lit(
"ast_name"),
g[
"SpacesZom"],
lit(
":"),
5473 g[
"SpacesZom"],
g[
"Identifier"],
g[
"SpacesZom"]);
5477 x.second.name = x.first;
5483 auto &data = *std::any_cast<Data *>(dt);
5488 auto is_macro = vs[2].type() ==
typeid(std::vector<std::string>);
5489 auto ignore = std::any_cast<bool>(vs[0]);
5490 auto name = std::any_cast<std::string>(vs[1]);
5492 std::vector<std::string> params;
5493 std::shared_ptr<Ope> ope;
5494 auto has_instructions =
false;
5497 params = std::any_cast<std::vector<std::string>>(vs[2]);
5498 ope = std::any_cast<std::shared_ptr<Ope>>(vs[4]);
5499 if (vs.size() == 6) { has_instructions =
true; }
5501 ope = std::any_cast<std::shared_ptr<Ope>>(vs[3]);
5502 if (vs.size() == 5) { has_instructions =
true; }
5505 if (has_instructions) {
5506 auto index = is_macro ? 5 : 4;
5507 std::unordered_set<std::string> types;
5508 for (
const auto &instruction :
5509 std::any_cast<std::vector<Instruction>>(vs[index])) {
5510 const auto &type = instruction.type;
5511 if (types.find(type) == types.end()) {
5512 data.instructions[name].push_back(instruction);
5513 types.insert(instruction.type);
5515 data.duplicates_of_instruction.emplace_back(type,
5516 instruction.sv.data());
5521 auto &grammar = *data.grammar;
5522 if (!grammar.count(name)) {
5523 auto &rule = grammar[name];
5526 rule.s_ = vs.
sv().data();
5528 rule.ignoreSemanticValue = ignore;
5529 rule.is_macro = is_macro;
5530 rule.params = params;
5534 if (data.start.empty() && name[0] !=
'%') {
5535 data.start = rule.name;
5536 data.start_pos = rule.s_;
5539 data.duplicates_of_definition.emplace_back(name, vs.
sv().data());
5543 g[
"Definition"].enter = [](
const Context & ,
const char * ,
5544 size_t , std::any &dt) {
5545 auto &data = *std::any_cast<Data *>(dt);
5546 data.captures_in_current_definition.clear();
5550 if (vs.size() == 1) {
5551 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5553 std::vector<std::shared_ptr<Ope>> opes;
5554 for (
auto i = 0u; i < vs.size(); i++) {
5555 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(vs[i]));
5557 const std::shared_ptr<Ope> ope =
5558 std::make_shared<PrioritizedChoice>(opes);
5566 }
else if (vs.size() == 1) {
5567 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5569 std::vector<std::shared_ptr<Ope>> opes;
5570 for (
const auto &x : vs) {
5571 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(x));
5573 const std::shared_ptr<Ope> ope = std::make_shared<Sequence>(opes);
5579 std::shared_ptr<Ope> ope;
5580 if (vs.size() == 1) {
5581 ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5583 assert(vs.size() == 2);
5584 auto tok = std::any_cast<char>(vs[0]);
5585 ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
5596 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5597 if (vs.size() == 1) {
5600 assert(vs.size() == 2);
5601 auto &data = *std::any_cast<Data *>(dt);
5602 const auto &ident = std::any_cast<std::string>(vs[1]);
5603 auto label =
ref(*data.grammar, ident, vs.
sv().data(),
false, {});
5605 vs.
sv().data(),
true, {label}));
5613 std::pair<size_t, size_t> range;
5617 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5618 if (vs.size() == 1) {
5621 assert(vs.size() == 2);
5622 auto loop = std::any_cast<Loop>(vs[1]);
5623 switch (loop.type) {
5624 case Loop::Type::opt:
return opt(ope);
5625 case Loop::Type::zom:
return zom(ope);
5626 case Loop::Type::oom:
return oom(ope);
5628 return rep(ope, loop.range.first, loop.range.second);
5636 return Loop{Loop::Type::opt, std::pair<size_t, size_t>()};
5638 return Loop{Loop::Type::zom, std::pair<size_t, size_t>()};
5640 return Loop{Loop::Type::oom, std::pair<size_t, size_t>()};
5642 return Loop{Loop::Type::rep,
5643 std::any_cast<std::pair<size_t, size_t>>(vs[0])};
5648 auto &data = *std::any_cast<Data *>(dt);
5653 auto is_macro = vs.size() > 2;
5654 auto ignore = std::any_cast<bool>(vs[0]);
5655 const auto &ident = std::any_cast<std::string>(vs[1]);
5657 std::vector<std::shared_ptr<Ope>> args;
5659 args = std::any_cast<std::vector<std::shared_ptr<Ope>>>(vs[2]);
5662 auto ope =
ref(*data.grammar, ident, vs.
sv().data(), is_macro, args);
5672 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5675 return tok(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
5678 return csc(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
5681 const auto &name = std::any_cast<std::string_view>(vs[0]);
5682 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
5684 data.captures_stack.back().insert(name);
5685 data.captures_in_current_definition.insert(name);
5687 return cap(ope, [name](
const char *a_s,
size_t a_n,
Context &c) {
5692 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
5698 return std::string(vs.
sv().data(), vs.
sv().length());
5702 auto items = vs.
transform<std::string>();
5703 return dic(items,
false);
5706 auto items = vs.
transform<std::string>();
5707 return dic(items,
true);
5730 std::vector<std::pair<char32_t, char32_t>> ranges;
5731 for (
const auto &v : vs) {
5732 if (v.type() ==
typeid(std::pair<char32_t, char32_t>)) {
5733 ranges.push_back(std::any_cast<std::pair<char32_t, char32_t>>(v));
5736 std::any_cast<const std::vector<std::pair<char32_t, char32_t>> &>(
5738 ranges.insert(ranges.end(), vec.begin(), vec.end());
5745 return cls(collect_ranges(vs));
5748 return cls(collect_ranges(vs),
true);
5751 return ncls(collect_ranges(vs));
5754 return ncls(collect_ranges(vs),
true);
5759 auto s1 = std::any_cast<std::string>(vs[0]);
5760 auto s2 = std::any_cast<std::string>(vs[1]);
5767 return std::pair(cp1, cp2);
5773 auto s = std::any_cast<std::string>(vs[0]);
5775 return std::pair(cp, cp);
5778 return std::pair<char32_t, char32_t>(0, 0);
5781 auto ch = vs.
sv()[1];
5782 const char *name =
nullptr;
5785 case 'D': name =
"digit";
break;
5787 case 'S': name =
"space";
break;
5788 default: name =
"word";
break;
5791 if (ch ==
'D' || ch ==
'S' || ch ==
'W') {
5798 auto negated = sv[2] ==
'^';
5799 auto name = sv.substr(negated ? 3 : 2, sv.size() - (negated ? 5 : 4));
5802 auto msg =
"invalid POSIX character class '" + std::string(name) +
"'";
5814 auto min = std::any_cast<size_t>(vs[0]);
5815 auto max = std::any_cast<size_t>(vs[1]);
5816 return std::pair(min, max);
5819 return std::pair(std::any_cast<size_t>(vs[0]),
5820 std::numeric_limits<size_t>::max());
5822 auto n = std::any_cast<size_t>(vs[0]);
5823 return std::pair(n, n);
5826 return std::pair(std::numeric_limits<size_t>::min(),
5827 std::any_cast<size_t>(vs[0]));
5834 g[
"CapScope"].enter = [](
const Context & ,
const char * ,
5835 size_t , std::any &dt) {
5836 auto &data = *std::any_cast<Data *>(dt);
5837 data.captures_stack.emplace_back();
5839 g[
"CapScope"].leave = [](
const Context & ,
const char * ,
5841 std::any & , std::any &dt) {
5842 auto &data = *std::any_cast<Data *>(dt);
5843 data.captures_stack.pop_back();
5859 auto &data = *std::any_cast<Data *>(dt);
5864 auto it = data.captures_stack.rbegin();
5865 while (it != data.captures_stack.rend()) {
5866 if (it->find(vs.
token()) != it->end()) {
5873 auto ptr = vs.
token().data() - 1;
5874 data.undefined_back_references.emplace_back(vs.
token(), ptr);
5880 if (data.captures_in_current_definition.find(vs.
token()) ==
5881 data.captures_in_current_definition.end()) {
5882 data.enablePackratParsing =
false;
5895 return vs.
transform<std::shared_ptr<Ope>>();
5901 for (
const auto &v : vs) {
5902 auto tokens = std::any_cast<std::vector<std::string_view>>(v);
5903 auto assoc = tokens[0][0];
5904 for (
size_t i = 1; i < tokens.size(); i++) {
5905 binOpeInfo[tokens[i]] = std::pair(level, assoc);
5910 instruction.
type =
"precedence";
5911 instruction.
data = binOpeInfo;
5912 instruction.
sv = vs.sv();
5916 return vs.
transform<std::string_view>();
5923 instruction.
type =
"error_message";
5924 instruction.
data = std::any_cast<std::string>(vs[0]);
5925 instruction.
sv = vs.
sv();
5931 instruction.
type =
"no_ast_opt";
5932 instruction.
sv = vs.
sv();
5938 instruction.
type =
"no_whitespace";
5939 instruction.
sv = vs.
sv();
5945 instruction.
type =
"ast_name";
5946 instruction.
data = std::any_cast<std::string>(vs[0]);
5947 instruction.
sv = vs.
sv();
5958 const char *s,
Log log) {
5961 auto atom =
seq.opes_[0];
5964 auto binop = seq1.
opes_[0];
5965 auto atom1 = seq1.opes_[1];
5971 if (!
rep.is_zom() || atom_name != atom1_name || atom_name == binop_name) {
5974 log(line.first, line.second,
5975 "'precedence' instruction cannot be applied to '" + rule.
name +
5982 rule.
holder_->ope_ =
pre(atom, binop, info, rule);
5987 log(line.first, line.second,
5988 "'precedence' instruction cannot be applied to '" + rule.
name +
5998 Log log, std::string requested_start,
5999 bool enable_left_recursion =
true) {
6001 auto &grammar = *data.
grammar;
6008 rule <=
ref(grammar,
"x",
"",
false, {});
6010 rule.s_ =
"[native]";
6011 rule.ignoreSemanticValue =
true;
6012 rule.is_macro =
true;
6013 rule.params = {
"x"};
6018 std::any dt = &data;
6019 auto r =
g[
"Grammar"].parse(s, n, dt,
nullptr, log);
6023 if (r.error_info.message_pos) {
6024 auto line =
line_info(s, r.error_info.message_pos);
6025 log(line.first, line.second, r.error_info.message,
6026 r.error_info.label);
6028 auto line =
line_info(s, r.error_info.error_pos);
6029 log(line.first, line.second,
"syntax error", r.error_info.label);
6037 log(line.first, line.second, e.what(),
"");
6043 for (
auto [user_name, user_rule] : rules) {
6044 auto name = user_name;
6045 auto ignore =
false;
6046 if (!name.empty() && name[0] ==
'~') {
6050 if (!name.empty()) {
6051 auto &rule = grammar[name];
6054 rule.ignoreSemanticValue = ignore;
6065 log(line.first, line.second,
6066 "the definition '" + name +
"' is already defined.",
"");
6077 log(line.first, line.second,
6078 "the instruction '" + type +
"' is already defined.",
"");
6089 log(line.first, line.second,
6090 "the back reference '" + name +
"' is undefined.",
"");
6097 auto start = data.
start;
6099 if (!requested_start.empty()) {
6100 if (grammar.count(requested_start)) {
6101 start = requested_start;
6105 log(line.first, line.second,
6106 "the specified start rule '" + requested_start +
6114 if (!ret) {
return {}; }
6116 auto &start_rule = grammar[start];
6120 if (start_rule.ignoreSemanticValue) {
6122 auto line =
line_info(s, start_rule.s_);
6123 log(line.first, line.second,
6124 "ignore operator cannot be applied to '" + start_rule.name +
"'.",
6131 if (!ret) {
return {}; }
6134 auto referenced = std::unordered_set<std::string>{
6141 for (
auto &[_, rule] : grammar) {
6145 for (
const auto &[name, ptr] : vis.
error_s) {
6154 for (
auto &[name, rule] : grammar) {
6155 if (!referenced.count(name)) {
6158 auto msg =
"'" + name +
"' is not referenced.";
6159 log(line.first, line.second, msg,
"");
6164 if (!ret) {
return {}; }
6167 for (
auto &x : grammar) {
6168 auto &rule = x.second;
6175 bool changed =
true;
6178 for (
auto &[name, rule] : grammar) {
6181 if (vis.
result != rule.can_be_empty) {
6182 rule.can_be_empty = vis.
result;
6190 if (enable_left_recursion) {
6191 for (
auto &[name, rule] : grammar) {
6194 if (vis.
error_s) { rule.is_left_recursive =
true; }
6199 for (
auto &[name, rule] : grammar) {
6205 log(line.first, line.second,
"'" + name +
"' is left recursive.",
6212 if (!ret) {
return {}; }
6220 for (
auto &x : grammar) {
6221 auto &rule = x.second;
6222 auto ope = rule.get_core_operator();
6227 start_rule.whitespaceOpe =
wsp(rule.get_core_operator());
6235 start_rule.wordOpe = rule.get_core_operator();
6241 for (
const auto &[name, instructions] : data.
instructions) {
6242 auto &rule = grammar[name];
6244 for (
const auto &instruction : instructions) {
6245 if (instruction.type ==
"precedence") {
6247 std::any_cast<PrecedenceClimbing::BinOpeInfo>(instruction.data);
6250 }
else if (instruction.type ==
"error_message") {
6251 rule.error_message = std::any_cast<std::string>(instruction.data);
6252 }
else if (instruction.type ==
"no_ast_opt") {
6253 rule.no_ast_opt =
true;
6254 }
else if (instruction.type ==
"no_whitespace") {
6255 rule.no_whitespace =
true;
6256 }
else if (instruction.type ==
"ast_name") {
6257 rule.ast_name = std::any_cast<std::string>(instruction.data);
6268 for (
auto &x : grammar) {
6269 x.second.accept(vis);
6277 const char *s)
const {
6278 std::vector<std::pair<const char *, std::string>> refs;
6279 std::unordered_map<std::string, bool> has_error_cache;
6285 log(line.first, line.second,
6286 "infinite loop is detected in '" + vis.
error_name +
"'.",
"");
6300template <
typename Annotation>
struct AstBase :
public Annotation {
6302 const std::vector<std::shared_ptr<AstBase>> &
nodes,
6354 std::vector<std::shared_ptr<AstBase<Annotation>>>
nodes;
6359 return std::string(
token);
6367template <
typename T>
6369 std::function<std::string(
const T &ast,
int level)> fn) {
6370 const auto &ast = *ptr;
6371 for (
auto i = 0; i < level; i++) {
6374 auto name = ast.original_name;
6375 if (ast.original_choice_count > 0) {
6376 name +=
"/" + std::to_string(ast.original_choice);
6378 if (ast.name != ast.original_name) { name +=
"[" + ast.name +
"]"; }
6380 s +=
"- " + name +
" (";
6384 s +=
"+ " + name +
"\n";
6386 if (fn) { s += fn(ast, level + 1); }
6387 for (
const auto &node : ast.nodes) {
6392template <
typename T>
6395 std::function<std::string(
const T &ast,
int level)> fn =
nullptr) {
6405 template <
typename T>
6406 std::shared_ptr<T>
optimize(std::shared_ptr<T> original,
6407 std::shared_ptr<T> parent =
nullptr) {
6412 if (
opt && original->nodes.size() == 1) {
6413 auto child =
optimize(original->nodes[0], parent);
6415 child->preserve_position ? child->position : original->position;
6416 auto len = child->preserve_position ? child->length : original->length;
6417 auto ast = std::make_shared<T>(*child, original->name.data(), pos, len,
6418 original->choice_count, original->choice);
6419 for (
auto &node : ast->nodes) {
6425 auto ast = std::make_shared<T>(*original);
6426 ast->parent = parent;
6428 for (
const auto &node : original->nodes) {
6430 ast->nodes.push_back(child);
6445 auto line = vs.line_info();
6449 const char *node_name =
6453 return std::make_shared<T>(
6454 vs.path, line.first, line.second, node_name, vs.token(),
6455 std::distance(vs.ss, vs.sv().data()), vs.sv().length(),
6456 vs.choice_count(), vs.choice(), rule.
no_ast_opt);
6459 auto ast = std::make_shared<T>(vs.path, line.first, line.second, node_name,
6460 vs.transform<std::shared_ptr<T>>(),
6461 std::distance(vs.ss, vs.sv().data()),
6462 vs.sv().length(), vs.choice_count(),
6465 for (
auto &node : ast->nodes) {
6472#define PEG_EXPAND(...) __VA_ARGS__
6473#define PEG_CONCAT(a, b) a##b
6474#define PEG_CONCAT2(a, b) PEG_CONCAT(a, b)
6477 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, \
6478 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, \
6479 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, \
6480 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, \
6481 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76, \
6482 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, \
6483 a92, a93, a94, a95, a96, a97, a98, a99, a100, ...) \
6486#define PEG_COUNT(...) \
6487 PEG_EXPAND(PEG_PICK( \
6488 __VA_ARGS__, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, \
6489 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, \
6490 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, \
6491 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
6492 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, \
6493 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
6495#define PEG_DEF_1(r) \
6496 peg::Definition r; \
6498 peg::add_ast_action(r);
6500#define PEG_DEF_2(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_1(__VA_ARGS__))
6501#define PEG_DEF_3(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_2(__VA_ARGS__))
6502#define PEG_DEF_4(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_3(__VA_ARGS__))
6503#define PEG_DEF_5(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_4(__VA_ARGS__))
6504#define PEG_DEF_6(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_5(__VA_ARGS__))
6505#define PEG_DEF_7(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_6(__VA_ARGS__))
6506#define PEG_DEF_8(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_7(__VA_ARGS__))
6507#define PEG_DEF_9(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_8(__VA_ARGS__))
6508#define PEG_DEF_10(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_9(__VA_ARGS__))
6509#define PEG_DEF_11(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_10(__VA_ARGS__))
6510#define PEG_DEF_12(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_11(__VA_ARGS__))
6511#define PEG_DEF_13(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_12(__VA_ARGS__))
6512#define PEG_DEF_14(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_13(__VA_ARGS__))
6513#define PEG_DEF_15(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_14(__VA_ARGS__))
6514#define PEG_DEF_16(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_15(__VA_ARGS__))
6515#define PEG_DEF_17(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_16(__VA_ARGS__))
6516#define PEG_DEF_18(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_17(__VA_ARGS__))
6517#define PEG_DEF_19(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_18(__VA_ARGS__))
6518#define PEG_DEF_20(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_19(__VA_ARGS__))
6519#define PEG_DEF_21(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_20(__VA_ARGS__))
6520#define PEG_DEF_22(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_21(__VA_ARGS__))
6521#define PEG_DEF_23(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_22(__VA_ARGS__))
6522#define PEG_DEF_24(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_23(__VA_ARGS__))
6523#define PEG_DEF_25(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_24(__VA_ARGS__))
6524#define PEG_DEF_26(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_25(__VA_ARGS__))
6525#define PEG_DEF_27(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_26(__VA_ARGS__))
6526#define PEG_DEF_28(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_27(__VA_ARGS__))
6527#define PEG_DEF_29(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_28(__VA_ARGS__))
6528#define PEG_DEF_30(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_29(__VA_ARGS__))
6529#define PEG_DEF_31(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_30(__VA_ARGS__))
6530#define PEG_DEF_32(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_31(__VA_ARGS__))
6531#define PEG_DEF_33(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_32(__VA_ARGS__))
6532#define PEG_DEF_34(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_33(__VA_ARGS__))
6533#define PEG_DEF_35(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_34(__VA_ARGS__))
6534#define PEG_DEF_36(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_35(__VA_ARGS__))
6535#define PEG_DEF_37(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_36(__VA_ARGS__))
6536#define PEG_DEF_38(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_37(__VA_ARGS__))
6537#define PEG_DEF_39(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_38(__VA_ARGS__))
6538#define PEG_DEF_40(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_39(__VA_ARGS__))
6539#define PEG_DEF_41(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_40(__VA_ARGS__))
6540#define PEG_DEF_42(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_41(__VA_ARGS__))
6541#define PEG_DEF_43(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_42(__VA_ARGS__))
6542#define PEG_DEF_44(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_43(__VA_ARGS__))
6543#define PEG_DEF_45(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_44(__VA_ARGS__))
6544#define PEG_DEF_46(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_45(__VA_ARGS__))
6545#define PEG_DEF_47(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_46(__VA_ARGS__))
6546#define PEG_DEF_48(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_47(__VA_ARGS__))
6547#define PEG_DEF_49(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_48(__VA_ARGS__))
6548#define PEG_DEF_50(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_49(__VA_ARGS__))
6549#define PEG_DEF_51(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_50(__VA_ARGS__))
6550#define PEG_DEF_52(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_51(__VA_ARGS__))
6551#define PEG_DEF_53(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_52(__VA_ARGS__))
6552#define PEG_DEF_54(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_53(__VA_ARGS__))
6553#define PEG_DEF_55(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_54(__VA_ARGS__))
6554#define PEG_DEF_56(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_55(__VA_ARGS__))
6555#define PEG_DEF_57(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_56(__VA_ARGS__))
6556#define PEG_DEF_58(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_57(__VA_ARGS__))
6557#define PEG_DEF_59(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_58(__VA_ARGS__))
6558#define PEG_DEF_60(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_59(__VA_ARGS__))
6559#define PEG_DEF_61(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_60(__VA_ARGS__))
6560#define PEG_DEF_62(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_61(__VA_ARGS__))
6561#define PEG_DEF_63(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_62(__VA_ARGS__))
6562#define PEG_DEF_64(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_63(__VA_ARGS__))
6563#define PEG_DEF_65(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_64(__VA_ARGS__))
6564#define PEG_DEF_66(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_65(__VA_ARGS__))
6565#define PEG_DEF_67(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_66(__VA_ARGS__))
6566#define PEG_DEF_68(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_67(__VA_ARGS__))
6567#define PEG_DEF_69(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_68(__VA_ARGS__))
6568#define PEG_DEF_70(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_69(__VA_ARGS__))
6569#define PEG_DEF_71(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_70(__VA_ARGS__))
6570#define PEG_DEF_72(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_71(__VA_ARGS__))
6571#define PEG_DEF_73(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_72(__VA_ARGS__))
6572#define PEG_DEF_74(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_73(__VA_ARGS__))
6573#define PEG_DEF_75(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_74(__VA_ARGS__))
6574#define PEG_DEF_76(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_75(__VA_ARGS__))
6575#define PEG_DEF_77(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_76(__VA_ARGS__))
6576#define PEG_DEF_78(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_77(__VA_ARGS__))
6577#define PEG_DEF_79(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_78(__VA_ARGS__))
6578#define PEG_DEF_80(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_79(__VA_ARGS__))
6579#define PEG_DEF_81(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_80(__VA_ARGS__))
6580#define PEG_DEF_82(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_81(__VA_ARGS__))
6581#define PEG_DEF_83(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_82(__VA_ARGS__))
6582#define PEG_DEF_84(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_83(__VA_ARGS__))
6583#define PEG_DEF_85(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_84(__VA_ARGS__))
6584#define PEG_DEF_86(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_85(__VA_ARGS__))
6585#define PEG_DEF_87(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_86(__VA_ARGS__))
6586#define PEG_DEF_88(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_87(__VA_ARGS__))
6587#define PEG_DEF_89(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_88(__VA_ARGS__))
6588#define PEG_DEF_90(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_89(__VA_ARGS__))
6589#define PEG_DEF_91(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_90(__VA_ARGS__))
6590#define PEG_DEF_92(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_91(__VA_ARGS__))
6591#define PEG_DEF_93(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_92(__VA_ARGS__))
6592#define PEG_DEF_94(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_93(__VA_ARGS__))
6593#define PEG_DEF_95(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_94(__VA_ARGS__))
6594#define PEG_DEF_96(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_95(__VA_ARGS__))
6595#define PEG_DEF_97(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_96(__VA_ARGS__))
6596#define PEG_DEF_98(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_97(__VA_ARGS__))
6597#define PEG_DEF_99(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_98(__VA_ARGS__))
6598#define PEG_DEF_100(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_99(__VA_ARGS__))
6600#define AST_DEFINITIONS(...) \
6601 PEG_EXPAND(PEG_CONCAT2(PEG_DEF_, PEG_COUNT(__VA_ARGS__))(__VA_ARGS__))
6612 std::string_view start = {}) {
6616 parser(
const char *s,
size_t n, std::string_view start = {})
6619 parser(std::string_view sv,
const Rules &rules, std::string_view start = {})
6620 :
parser(sv.data(), sv.size(), rules, start) {}
6622 parser(std::string_view sv, std::string_view start = {})
6625#if defined(__cpp_lib_char8_t)
6626 parser(std::u8string_view sv,
const Rules &rules, std::string_view start = {})
6627 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(), rules,
6630 parser(std::u8string_view sv, std::string_view start = {})
6631 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(),
Rules(),
6638 std::string_view start = {}) {
6652 std::string_view start = {}) {
6653 return load_grammar(sv.data(), sv.size(), rules, start);
6672 }
catch (
const std::exception &) {
return false; }
6682 bool parse_n(
const char *s,
size_t n,
const char *path =
nullptr)
const {
6684 const auto &rule = (*grammar_)[
start_];
6691 bool parse_n(
const char *s,
size_t n, std::any &dt,
6692 const char *path =
nullptr)
const {
6694 const auto &rule = (*grammar_)[
start_];
6701 template <
typename T>
6703 const char *path =
nullptr)
const {
6705 const auto &rule = (*grammar_)[
start_];
6713 template <
typename T>
6714 bool parse_n(
const char *s,
size_t n, std::any &dt, T &val,
6715 const char *path =
nullptr)
const {
6717 const auto &rule = (*grammar_)[
start_];
6725 bool parse(std::string_view sv,
const char *path =
nullptr)
const {
6726 return parse_n(sv.data(), sv.size(), path);
6729 bool parse(std::string_view sv, std::any &dt,
6730 const char *path =
nullptr)
const {
6731 return parse_n(sv.data(), sv.size(), dt, path);
6734 template <
typename T>
6735 bool parse(std::string_view sv, T &val,
const char *path =
nullptr)
const {
6736 return parse_n(sv.data(), sv.size(), val, path);
6739 template <
typename T>
6740 bool parse(std::string_view sv, std::any &dt, T &val,
6741 const char *path =
nullptr)
const {
6742 return parse_n(sv.data(), sv.size(), dt, val, path);
6745#if defined(__cpp_lib_char8_t)
6746 bool parse(std::u8string_view sv,
const char *path =
nullptr)
const {
6747 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), path);
6750 bool parse(std::u8string_view sv, std::any &dt,
6751 const char *path =
nullptr)
const {
6752 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
6756 template <
typename T>
6757 bool parse(std::u8string_view sv, T &val,
const char *path =
nullptr)
const {
6758 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), val,
6762 template <
typename T>
6763 bool parse(std::u8string_view sv, std::any &dt, T &val,
6764 const char *path =
nullptr)
const {
6765 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
6778 auto &rule = (*grammar_)[
start_];
6779 rule.eoi_check =
false;
6789 auto &rule = (*grammar_)[
start_];
6796 auto &rule = (*grammar_)[
start_];
6797 rule.tracer_enter = tracer_enter;
6798 rule.tracer_leave = tracer_leave;
6806 auto &rule = (*grammar_)[
start_];
6807 rule.tracer_enter = tracer_enter;
6808 rule.tracer_leave = tracer_leave;
6809 rule.tracer_start = tracer_start;
6810 rule.tracer_end = tracer_end;
6816 auto &rule = (*grammar_)[
start_];
6817 rule.verbose_trace = verbose_trace;
6822 for (
auto &[_, rule] : *
grammar_) {
6828 template <
typename T>
6830 bool opt_mode =
true)
const {
6843 std::function<
void(
size_t line,
size_t col,
const std::string &msg)>
6845 log_ = [log](
size_t line,
size_t col,
const std::string &msg,
6846 const std::string & ) { log(line, col, msg); };
6858 std::vector<std::string> rules;
6859 for (
auto &[name, rule] : *
grammar_) {
6862 if (rule.no_ast_opt) {
6863 rules.push_back(rule.ast_name.empty() ? name : rule.ast_name);
6883 [&](
auto &ope,
auto s,
auto,
auto &,
auto &c,
auto &,
auto &trace_data) {
6884 auto prev_pos = std::any_cast<size_t>(trace_data);
6885 auto pos =
static_cast<size_t>(s - c.s);
6886 auto backtrack = (pos < prev_pos ?
"*" :
"");
6888 auto level = c.trace_ids.size() - 1;
6899 os <<
"E " << pos + 1 << backtrack <<
"\t" << indent <<
"┌" << name
6900 <<
" #" << c.trace_ids.back() << std::endl;
6901 trace_data =
static_cast<size_t>(pos);
6903 [&](
auto &ope,
auto s,
auto,
auto &sv,
auto &c,
auto &,
auto len,
6905 auto pos =
static_cast<size_t>(s - c.s);
6906 if (len !=
static_cast<size_t>(-1)) { pos += len; }
6908 auto level = c.trace_ids.size() - 1;
6912 auto ret = len !=
static_cast<size_t>(-1) ?
"└o " :
"└x ";
6914 std::stringstream choice;
6915 if (sv.choice_count() > 0) {
6916 choice <<
" " << sv.choice() <<
"/" << sv.choice_count();
6919 if (!sv.tokens.empty()) {
6920 token +=
", token '";
6921 token += sv.tokens[0];
6924 std::string matched;
6929 os <<
"L " << pos + 1 <<
"\t" << indent << ret << name <<
" #"
6930 << c.trace_ids.back() << choice.str() << token << matched
6933 [&](
auto &trace_data) { trace_data =
static_cast<size_t>(0); },
6948 std::vector<Item> items;
6949 std::map<std::string, size_t> index;
6951 std::chrono::steady_clock::time_point start;
6955 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &, std::any &trace_data) {
6956 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
6957 auto &stats = *std::any_cast<Stats *>(trace_data);
6959 auto &name = holder->name();
6960 if (stats.index.find(name) == stats.index.end()) {
6961 stats.index[name] = stats.index.size();
6962 stats.items.push_back({name, 0, 0});
6967 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &,
auto len,
6968 std::any &trace_data) {
6969 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
6970 auto &stats = *std::any_cast<Stats *>(trace_data);
6972 auto &name = holder->name();
6973 auto index = stats.index[name];
6974 auto &stat = stats.items[index];
6975 if (len !=
static_cast<size_t>(-1)) {
6982 auto end = std::chrono::steady_clock::now();
6983 auto nano = std::chrono::duration_cast<std::chrono::microseconds>(
6986 auto sec = nano / 1000000.0;
6987 os <<
"duration: " << sec <<
"s (" << nano <<
"µs)" << std::endl
6991 size_t total_success = 0;
6992 size_t total_fail = 0;
6998 os <<
" id total % success fail "
7002 auto grand_total = total_success + total_fail;
7003 snprintf(buff, BUFSIZ,
"%4s %10zu %5s %10zu %10zu %s",
"",
7004 grand_total,
"", total_success, total_fail,
7006 os << buff << std::endl;
7008 snprintf(buff, BUFSIZ,
"%4s %10s %5s %10.2f %10.2f %s",
"",
"",
7009 "", total_success * 100.0 / grand_total,
7010 total_fail * 100.0 / grand_total,
"% success/fail");
7011 os << buff << std::endl << std::endl;
7017 auto ratio = total * 100.0 / stats.total;
7018 snprintf(buff, BUFSIZ,
"%4zu %10zu %5.2f %10zu %10zu %s",
id,
7020 os << buff << std::endl;
7026 [&](
auto &trace_data) {
7027 auto stats =
new Stats{};
7028 stats->start = std::chrono::steady_clock::now();
7031 [&](
auto &trace_data) {
7032 auto stats = std::any_cast<Stats *>(trace_data);
void operator=(F fn)
Definition peglib.h:701
Action(Action &&rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:715
std::function< std::any(SemanticValues &vs, std::any &dt, const std::any &predicate_data)> Fty
Definition peglib.h:712
std::any operator()(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:706
Fty fn_
Definition peglib.h:731
Action(F fn)
Definition peglib.h:700
Action & operator=(const Action &rhs)=default
AndPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1662
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1664
std::shared_ptr< Ope > ope_
Definition peglib.h:1678
void accept(Visitor &v) override
Definition peglib.h:4146
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1876
void accept(Visitor &v) override
Definition peglib.h:4152
std::string name_
Definition peglib.h:2067
BackReference(const std::string &name)
Definition peglib.h:2060
BackReference(std::string &&name)
Definition peglib.h:2058
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3978
void accept(Visitor &v) override
Definition peglib.h:4162
void accept(Visitor &v) override
Definition peglib.h:4153
CaptureScope(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1891
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1893
std::shared_ptr< Ope > ope_
Definition peglib.h:1903
MatchAction match_action_
Definition peglib.h:1923
std::function< void(const char *s, size_t n, Context &c)> MatchAction
Definition peglib.h:1908
std::shared_ptr< Ope > ope_
Definition peglib.h:1922
void accept(Visitor &v) override
Definition peglib.h:4154
Capture(const std::shared_ptr< Ope > &ope, MatchAction ma)
Definition peglib.h:1910
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1913
bool negated_
Definition peglib.h:1841
bool ignore_case_
Definition peglib.h:1842
friend struct GrammarBlob
Definition peglib.h:1805
std::vector< std::pair< char32_t, char32_t > > ranges_
Definition peglib.h:1840
CharacterClass(const std::string &s, bool negated, bool ignore_case)
Definition peglib.h:1746
void setup_ascii_bitset()
Definition peglib.h:1822
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1773
bool in_range(const std::pair< char32_t, char32_t > &range, char32_t cp) const
Definition peglib.h:1812
CharacterClass(const std::vector< std::pair< char32_t, char32_t > > &ranges, bool negated, bool ignore_case)
Definition peglib.h:1766
bool is_ascii_only_
Definition peglib.h:1844
bool is_ascii_only() const
Definition peglib.h:1808
friend struct OpeSignature
Definition peglib.h:1806
friend struct ComputeFirstSet
Definition peglib.h:1804
const std::bitset< 256 > & ascii_bitset() const
Definition peglib.h:1809
void accept(Visitor &v) override
Definition peglib.h:4150
std::bitset< 256 > ascii_bitset_
Definition peglib.h:1843
Character(char32_t ch)
Definition peglib.h:1849
char32_t ch_
Definition peglib.h:1870
void accept(Visitor &v) override
Definition peglib.h:4151
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1851
size_t in_token_boundary_count
Definition peglib.h:1035
std::vector< Definition * > rule_stack
Definition peglib.h:1025
void trace_leave(const Ope &ope, const char *a_s, size_t n, const SemanticValues &vs, std::any &dt, size_t len)
Definition peglib.h:3524
std::vector< std::pair< std::string_view, std::string > > capture_entries
Definition peglib.h:1042
std::once_flag source_line_index_init_
Definition peglib.h:1358
std::map< LRKey, LRMemo > lr_memo
Definition peglib.h:1070
std::shared_ptr< Ope > wordOpe
Definition peglib.h:1040
std::map< std::vector< const void * >, size_t > macro_inst_ids
Definition peglib.h:1081
void trace_enter(const Ope &ope, const char *a_s, size_t n, const SemanticValues &vs, std::any &dt)
Definition peglib.h:3518
TracerEnter tracer_enter
Definition peglib.h:1118
std::vector< bool > cut_stack
Definition peglib.h:1044
size_t skip_whitespace(const char *a_s, size_t n, SemanticValues &vs, std::any &dt)
Definition peglib.h:3475
const std::vector< std::shared_ptr< Ope > > & top_args() const
Definition peglib.h:1273
std::vector< bool > cache_success
Definition peglib.h:1051
ErrorReporter error_reporter
Definition peglib.h:1129
Context operator=(const Context &)=delete
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:1037
void clear_packrat_cache(const char *pos, size_t def_id)
Definition peglib.h:1091
const size_t def_count
Definition peglib.h:1046
const bool has_tracer
Definition peglib.h:1120
Context(Context &&)=delete
const bool verbose_trace
Definition peglib.h:1122
Log log
Definition peglib.h:1128
std::vector< std::unique_ptr< SemanticValues > > value_stack
Definition peglib.h:1022
size_t top_macro_inst() const
Definition peglib.h:1277
std::vector< PackratStats > * packrat_stats
Definition peglib.h:1175
const char * s
Definition peglib.h:1016
std::pair< LRRule, const char * > LRKey
Definition peglib.h:1068
size_t next_trace_id
Definition peglib.h:1355
PackratCache cache_values
Definition peglib.h:1056
SemanticValues & push_semantic_values_scope()
Definition peglib.h:1241
void pop_semantic_values_scope()
Definition peglib.h:1263
bool is_traceable(const Ope &ope) const
Definition peglib.h:3531
size_t packrat_cached_count
Definition peglib.h:1049
std::vector< const char * > active_pos
Definition peglib.h:1054
const char * path
Definition peglib.h:1015
std::set< LRKey > lr_active_seeds
Definition peglib.h:1078
std::any trace_data
Definition peglib.h:1121
TracerLeave tracer_leave
Definition peglib.h:1119
void push_args(std::vector< std::shared_ptr< Ope > > &&args, size_t macro_inst=0)
Definition peglib.h:1266
Snapshot snapshot(const SemanticValues &vs) const
Definition peglib.h:1304
std::vector< size_t > trace_ids
Definition peglib.h:1356
const std::vector< int32_t > * packrat_index
Definition peglib.h:1048
Context(const char *path, const char *s, size_t l, size_t def_count, std::shared_ptr< Ope > whitespaceOpe, std::shared_ptr< Ope > wordOpe, bool enablePackratParsing, TracerEnter tracer_enter, TracerLeave tracer_leave, std::any trace_data, bool verbose_trace, Log log, ErrorReporter error_reporter=nullptr, const std::vector< int32_t > *packrat_index=nullptr, size_t packrat_cached_count=0)
Definition peglib.h:1131
void write_packrat_cache(const char *pos, size_t def_id, size_t len, const std::any &val)
Definition peglib.h:1104
size_t value_stack_size
Definition peglib.h:1023
const size_t l
Definition peglib.h:1017
void pop_args()
Definition peglib.h:1271
ErrorInfo error_info
Definition peglib.h:1019
std::vector< bool > cache_registered
Definition peglib.h:1050
bool in_whitespace
Definition peglib.h:1038
std::vector< ArgsFrame > args_stack
Definition peglib.h:1033
std::pair< size_t, size_t > line_info(const char *cur) const
Definition peglib.h:1336
int32_t cache_slot(size_t def_id) const
Definition peglib.h:1086
std::vector< size_t > source_line_index
Definition peglib.h:1359
size_t intern_macro_inst(std::vector< const void * > &&key)
Definition peglib.h:1286
bool recovered
Definition peglib.h:1020
~Context()
Definition peglib.h:1161
void packrat(const char *a_s, size_t def_id, size_t &len, std::any &val, T fn)
Definition peglib.h:1178
const bool enablePackratParsing
Definition peglib.h:1047
std::pair< const Definition *, size_t > LRRule
Definition peglib.h:1067
size_t next_macro_inst_
Definition peglib.h:1082
void rollback(SemanticValues &vs, const Snapshot &snap)
Definition peglib.h:1309
Context(const Context &)=delete
void set_error_pos(const char *a_s, const char *literal=nullptr)
Definition peglib.h:3484
bool ignore_trace_state
Definition peglib.h:1357
unsigned char tolower_table[256]
Definition peglib.h:1126
std::set< LRRule > lr_refs_hit
Definition peglib.h:1074
void accept(Visitor &v) override
Definition peglib.h:4165
size_t parse_core(const char *, size_t, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:2116
std::shared_ptr< Ope > wordOpe
Definition peglib.h:3194
bool is_macro
Definition peglib.h:3196
bool ignoreSemanticValue
Definition peglib.h:3192
bool eoi_check
Definition peglib.h:3215
Predicate predicate
Definition peglib.h:3183
Definition & operator<=(const std::shared_ptr< Ope > &ope)
Definition peglib.h:3028
std::function< void(const Context &c, const char *s, size_t n, size_t matchlen, std::any &value, std::any &dt)> leave
Definition peglib.h:3191
void initialize_packrat_filter() const
Definition peglib.h:4573
Definition()
Definition peglib.h:3013
bool is_left_recursive
Definition peglib.h:3199
bool disable_action
Definition peglib.h:3198
TracerEnter tracer_enter
Definition peglib.h:3202
std::vector< std::string > params
Definition peglib.h:3197
bool no_whitespace
Definition peglib.h:3210
std::once_flag packrat_filter_init_
Definition peglib.h:3312
Definition & operator~()
Definition peglib.h:3163
bool enablePackratParsing
Definition peglib.h:3195
std::pair< size_t, size_t > line_
Definition peglib.h:3181
friend class ParserGenerator
Definition peglib.h:3223
std::once_flag is_token_init_
Definition peglib.h:3307
TracerStartOrEnd tracer_end
Definition peglib.h:3206
std::vector< Context::PackratStats > packrat_stats_
Definition peglib.h:3219
Result parse(const char *s, size_t n, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3033
std::once_flag definition_ids_init_
Definition peglib.h:3310
std::vector< int32_t > packrat_index_
Definition peglib.h:3313
bool collect_packrat_stats
Definition peglib.h:3218
Result parse(const char *s, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3041
bool no_ast_opt
Definition peglib.h:3209
Definition & operator,(T fn)
Definition peglib.h:3158
Result parse_and_get_value(const char *s, std::any &dt, T &val, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3095
Result parse(const char *s, size_t n, std::any &dt, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3047
friend class Reference
Definition peglib.h:3222
Result parse_and_get_value(const char *s, size_t n, T &val, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3062
void operator=(Action a)
Definition peglib.h:3156
std::unordered_map< void *, size_t > definition_ids_
Definition peglib.h:3311
std::once_flag assign_id_to_definition_init_
Definition peglib.h:3309
TracerLeave tracer_leave
Definition peglib.h:3203
size_t id
Definition peglib.h:3185
bool can_be_empty
Definition peglib.h:3200
Result parse(const char *s, std::any &dt, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3054
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:3193
bool is_token() const
Definition peglib.h:3172
Result parse_and_get_value(const char *s, size_t n, std::any &dt, T &val, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3083
std::string ast_name
Definition peglib.h:3212
Result parse_core(const char *s, size_t n, SemanticValues &vs, std::any &dt, const char *path, Log log, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3240
Definition & operator=(Definition &&rhs)
bool is_token_
Definition peglib.h:3308
Definition(const Definition &rhs)
Definition peglib.h:3015
Definition & operator=(const Definition &rhs)
size_t packrat_cached_count_
Definition peglib.h:3314
void accept(Ope::Visitor &v)
Definition peglib.h:3168
bool verbose_trace
Definition peglib.h:3204
std::string name
Definition peglib.h:3179
std::shared_ptr< Holder > holder_
Definition peglib.h:3306
std::string error_message
Definition peglib.h:3208
std::function< void(const Context &c, const char *s, size_t n, std::any &dt)> enter
Definition peglib.h:3188
TracerStartOrEnd tracer_start
Definition peglib.h:3205
Action action
Definition peglib.h:3186
void initialize_definition_ids() const
Definition peglib.h:3228
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:3170
Result parse_and_get_value(const char *s, T &val, const char *path=nullptr, Log log=nullptr, ErrorReporter error_reporter=nullptr) const
Definition peglib.h:3075
Definition(const std::shared_ptr< Ope > &ope)
Definition peglib.h:3019
const char * s_
Definition peglib.h:3180
Dictionary(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:1705
void accept(Visitor &v) override
Definition peglib.h:4148
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3550
Trie trie_
Definition peglib.h:1715
Holder(Definition *outer)
Definition peglib.h:1991
const std::string & name() const
Definition peglib.h:3908
Definition * outer_
Definition peglib.h:2005
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3667
const std::string & trace_name() const
Definition peglib.h:3910
void accept(Visitor &v) override
Definition peglib.h:4159
std::string trace_name_
Definition peglib.h:2007
friend class Definition
Definition peglib.h:2009
std::once_flag trace_name_init_
Definition peglib.h:2006
std::any reduce(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:3897
std::shared_ptr< Ope > ope_
Definition peglib.h:2004
void accept(Visitor &v) override
Definition peglib.h:4156
Ignore(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1942
std::shared_ptr< Ope > ope_
Definition peglib.h:1953
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &dt) const override
Definition peglib.h:1944
void accept(Visitor &v) override
Definition peglib.h:4149
bool ignore_case_
Definition peglib.h:1737
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3595
std::string lower_lit_
Definition peglib.h:1738
std::string lit_
Definition peglib.h:1736
LiteralString(std::string &&s, bool ignore_case)
Definition peglib.h:1721
std::once_flag init_is_word_
Definition peglib.h:1739
bool is_word_
Definition peglib.h:1740
LiteralString(const std::string &s, bool ignore_case)
Definition peglib.h:1726
std::shared_ptr< Ope > ope_
Definition peglib.h:1700
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1685
NotPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1683
void accept(Visitor &v) override
Definition peglib.h:4147
bool is_choice_like
Definition peglib.h:1377
bool is_token_boundary
Definition peglib.h:1376
size_t parse(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:3539
virtual size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const =0
virtual void accept(Visitor &v)=0
size_t initial_capacity_
Definition peglib.h:1007
void erase(size_t key)
Definition peglib.h:954
std::vector< Slot > slots_
Definition peglib.h:1008
std::vector< std::any > vals_
Definition peglib.h:1009
static size_t mix(size_t key)
Definition peglib.h:979
static constexpr size_t kEmpty
Definition peglib.h:971
void insert_or_assign(size_t key, size_t len, const std::any &val)
Definition peglib.h:923
void grow()
Definition peglib.h:986
bool find(size_t key, size_t &len, std::any &val) const
Definition peglib.h:903
PackratCache(size_t expected_entries)
Definition peglib.h:897
size_t used_
Definition peglib.h:1010
static constexpr size_t kTombstone
Definition peglib.h:972
std::pair< size_t, size_t > r_
Definition peglib.h:5278
std::pair< size_t, size_t > line_info() const
Definition peglib.h:5275
SyntaxErrorException(const char *what_arg, std::pair< size_t, size_t > r)
Definition peglib.h:5272
ParserContext perform_core(const char *s, size_t n, const Rules &rules, Log log, std::string requested_start, bool enable_left_recursion=true)
Definition peglib.h:5997
bool apply_precedence_instruction(Definition &rule, const PrecedenceClimbing::BinOpeInfo &info, const char *s, Log log)
Definition peglib.h:5956
void make_grammar()
Definition peglib.h:5281
Grammar g
Definition peglib.h:6293
ParserGenerator()
Definition peglib.h:5229
static bool parse_test(const char *d, const char *s)
Definition peglib.h:5208
static ParserContext parse(const char *s, size_t n, const Rules &rules, Log log, std::string_view start, bool enable_left_recursion=true)
Definition peglib.h:5200
bool detect_infiniteLoop(const Data &data, Definition &rule, const Log &log, const char *s) const
Definition peglib.h:6276
static ParserGenerator & get_instance()
Definition peglib.h:5224
void setup_actions()
Definition peglib.h:5481
std::shared_ptr< Ope > atom_
Definition peglib.h:2086
std::map< std::string_view, std::pair< size_t, char > > BinOpeInfo
Definition peglib.h:2072
PrecedenceClimbing(const std::shared_ptr< Ope > &atom, const std::shared_ptr< Ope > &binop, const BinOpeInfo &info, const Definition &rule)
Definition peglib.h:2074
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:2079
const Definition & rule_
Definition peglib.h:2093
std::shared_ptr< Ope > binop_
Definition peglib.h:2087
Definition & get_reference_for_binop(Context &c) const
Definition peglib.h:3999
BinOpeInfo info_
Definition peglib.h:2088
void accept(Visitor &v) override
Definition peglib.h:4163
std::vector< std::string > info_keys_
Definition peglib.h:2092
size_t parse_expression(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt, size_t min_prec) const
Definition peglib.h:4011
bool operator()(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data) const
Definition peglib.h:744
Predicate & operator=(const Predicate &rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:753
Fty fn_
Definition peglib.h:765
Predicate(Predicate &&rhs)=default
Predicate(F fn)
Definition peglib.h:738
void operator=(F fn)
Definition peglib.h:739
std::function< bool(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data)> Fty
Definition peglib.h:750
PrioritizedChoice(bool for_label, const Args &...args)
Definition peglib.h:1498
size_t size() const
Definition peglib.h:1573
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1512
void accept(Visitor &v) override
Definition peglib.h:4144
bool for_label_
Definition peglib.h:1576
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1575
PrioritizedChoice(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1503
std::vector< FirstSet > first_sets_
Definition peglib.h:1577
PrioritizedChoice(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1507
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:4088
void accept(Visitor &v) override
Definition peglib.h:4164
Recovery(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2104
std::shared_ptr< Ope > ope_
Definition peglib.h:2111
const std::string name_
Definition peglib.h:2029
Definition * rule_
Definition peglib.h:2035
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:3974
const char * s_
Definition peglib.h:2030
void accept(Visitor &v) override
Definition peglib.h:4160
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3933
const bool is_macro_
Definition peglib.h:2032
const std::vector< std::shared_ptr< Ope > > args_
Definition peglib.h:2033
size_t iarg_
Definition peglib.h:2036
const Grammar & grammar_
Definition peglib.h:2028
Reference(const Grammar &grammar, const std::string &name, const char *s, bool is_macro, const std::vector< std::shared_ptr< Ope > > &args)
Definition peglib.h:2016
static std::shared_ptr< Repetition > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1639
static std::shared_ptr< Repetition > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1649
bool is_zom() const
Definition peglib.h:1635
const std::bitset< 256 > * span_bitset_
Definition peglib.h:1656
Repetition(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:1582
std::shared_ptr< Ope > ope_
Definition peglib.h:1653
size_t max_
Definition peglib.h:1655
void accept(Visitor &v) override
Definition peglib.h:4145
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1585
size_t min_
Definition peglib.h:1654
static std::shared_ptr< Repetition > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1644
Sequence(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1403
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1405
std::unique_ptr< KeywordGuardData > kw_guard_
Definition peglib.h:1430
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1426
std::optional< size_t > parse_keyword_guarded(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:1433
void accept(Visitor &v) override
Definition peglib.h:4143
Sequence(const Args &...args)
Definition peglib.h:1400
Sequence(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1402
friend struct SetupFirstSets
Definition peglib.h:1429
void accept(Visitor &v) override
Definition peglib.h:4155
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3602
std::shared_ptr< Ope > ope_
Definition peglib.h:1937
TokenBoundary(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1928
friend struct GrammarBlob
Definition peglib.h:504
size_t max_len_
Definition peglib.h:519
std::map< std::string, Info, std::less<> > dic_
Definition peglib.h:515
size_t match(const char *text, size_t text_len, size_t &id) const
Definition peglib.h:472
friend struct ComputeFirstSet
Definition peglib.h:503
Trie(const std::vector< std::string > &items, bool ignore_case)
Definition peglib.h:450
size_t size() const
Definition peglib.h:500
bool ignore_case_
Definition peglib.h:517
size_t items_count_
Definition peglib.h:518
size_t items_count() const
Definition peglib.h:501
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn_
Definition peglib.h:1970
void accept(Visitor &v) override
Definition peglib.h:4157
User(Parser fn)
Definition peglib.h:1961
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &, std::any &dt) const override
Definition peglib.h:1962
WeakHolder(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1975
void accept(Visitor &v) override
Definition peglib.h:4158
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1977
std::weak_ptr< Ope > weak_
Definition peglib.h:1986
std::shared_ptr< Ope > ope_
Definition peglib.h:2053
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:2043
void accept(Visitor &v) override
Definition peglib.h:4161
Whitespace(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2041
parser(const char *s, size_t n, std::string_view start={})
Definition peglib.h:6616
Log log_
Definition peglib.h:6873
bool enablePackratParsing_
Definition peglib.h:6872
parser(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:6611
bool parse_n(const char *s, size_t n, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:6714
std::string start_
Definition peglib.h:6870
const Grammar & get_grammar() const
Definition peglib.h:6774
std::shared_ptr< Grammar > grammar_
Definition peglib.h:6869
bool parse_n(const char *s, size_t n, std::any &dt, const char *path=nullptr) const
Definition peglib.h:6691
void set_logger(Log log)
Definition peglib.h:6834
bool enableLeftRecursion_
Definition peglib.h:6871
bool load_grammar(std::string_view sv, std::string_view start={})
Definition peglib.h:6656
void enable_packrat_parsing()
Definition peglib.h:6787
parser & enable_ast()
Definition peglib.h:6821
void set_error_reporter(ErrorReporter reporter)
Definition peglib.h:6838
std::vector< uint8_t > serialize_grammar() const
Definition peglib.h:6663
parser(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:6619
void disable_eoi_check()
Definition peglib.h:6776
bool load_grammar(const char *s, size_t n, std::string_view start={})
Definition peglib.h:6647
std::shared_ptr< T > optimize_ast(std::shared_ptr< T > ast, bool opt_mode=true) const
Definition peglib.h:6829
void set_verbose_trace(bool verbose_trace)
Definition peglib.h:6814
ErrorReporter error_reporter_
Definition peglib.h:6874
void enable_left_recursion(bool enable=true)
Definition peglib.h:6783
const Definition & operator[](const char *s) const
Definition peglib.h:6772
bool parse_n(const char *s, size_t n, T &val, const char *path=nullptr) const
Definition peglib.h:6702
bool parse(std::string_view sv, std::any &dt, const char *path=nullptr) const
Definition peglib.h:6729
parser(std::string_view sv, std::string_view start={})
Definition peglib.h:6622
void set_logger(std::function< void(size_t line, size_t col, const std::string &msg)> log)
Definition peglib.h:6842
bool load_grammar(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:6637
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave)
Definition peglib.h:6794
bool load_blob(const std::vector< uint8_t > &blob)
Definition peglib.h:6669
bool parse(std::string_view sv, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:6740
bool post_process(const char *s, size_t n, Definition::Result &r) const
Definition peglib.h:6850
std::vector< std::string > get_no_ast_opt_rules() const
Definition peglib.h:6857
bool load_grammar(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:6651
bool parse(std::string_view sv, T &val, const char *path=nullptr) const
Definition peglib.h:6735
Definition & operator[](const char *s)
Definition peglib.h:6770
bool parse_n(const char *s, size_t n, const char *path=nullptr) const
Definition peglib.h:6682
bool parse(std::string_view sv, const char *path=nullptr) const
Definition peglib.h:6725
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave, TracerStartOrEnd tracer_start, TracerStartOrEnd tracer_end)
Definition peglib.h:6802
Definition filter_string.h:27
std::string escape_characters(const char *s, size_t n)
Definition peglib.h:227
size_t parse_literal(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt, const std::string &lit, std::once_flag &init_is_word, bool &is_word, bool ignore_case, const std::string &lower_lit)
Definition peglib.h:3321
static const char * WORD_DEFINITION_NAME
Definition peglib.h:2998
const char * u8(const T *s)
Definition peglib.h:219
std::shared_ptr< Ope > ref(const Grammar &grammar, const std::string &name, const char *s, bool is_macro, const std::vector< std::shared_ptr< Ope > > &args)
Definition peglib.h:2230
size_t encode_codepoint(char32_t cp, char *buff)
Definition peglib.h:120
std::shared_ptr< Ope > cut()
Definition peglib.h:2255
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> Parser
Definition peglib.h:1956
std::shared_ptr< Ope > tok(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2215
std::shared_ptr< Ope > csc(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2206
bool decode_codepoint(const char *s8, size_t l, size_t &bytes, char32_t &cp)
Definition peglib.h:157
std::function< void(size_t line, size_t col, const std::string &msg, const std::string &rule)> Log
Definition peglib.h:778
size_t codepoint_count(const char *s8, size_t l)
Definition peglib.h:106
std::shared_ptr< Ope > apd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2159
std::pair< int, size_t > parse_octal_number(const char *s, size_t n, size_t i)
Definition peglib.h:284
std::u32string decode(const char *s8, size_t l)
Definition peglib.h:206
std::pair< size_t, size_t > line_info(const char *start, const char *cur)
Definition peglib.h:529
std::shared_ptr< Ope > rec(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2251
std::function< void( const Ope &ope, const char *s, size_t n, const SemanticValues &vs, const Context &c, const std::any &dt, size_t, std::any &trace_data)> TracerLeave
Definition peglib.h:882
std::string resolve_capture_placeholders(const std::string &msg, const Context &c)
Definition peglib.h:3630
std::shared_ptr< Ope > cls(const std::string &s)
Definition peglib.h:2180
std::shared_ptr< Ope > wsp(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2236
bool fail(size_t len)
Definition peglib.h:773
T token_to_number_(std::string_view sv)
Definition peglib.h:421
std::shared_ptr< Ope > pre(const std::shared_ptr< Ope > &atom, const std::shared_ptr< Ope > &binop, const PrecedenceClimbing::BinOpeInfo &info, const Definition &rule)
Definition peglib.h:2244
bool is_digit(char c, int &v)
Definition peglib.h:265
std::shared_ptr< Ope > dic(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:2167
std::shared_ptr< Ope > liti(std::string &&s)
Definition peglib.h:2176
std::shared_ptr< Ope > ign(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2219
std::unordered_map< std::string, Definition > Grammar
Definition peglib.h:2012
std::vector< const void * > macro_inst_key(const Definition *def, const std::vector< std::shared_ptr< Ope > > &args)
Definition peglib.h:3920
size_t codepoint_length(const char *s8, size_t l)
Definition peglib.h:90
static const char * WHITESPACE_DEFINITION_NAME
Definition peglib.h:2997
std::string resolve_escape_sequence(const char *s, size_t n)
Definition peglib.h:295
std::shared_ptr< Ope > lit(std::string &&s)
Definition peglib.h:2172
std::shared_ptr< Ope > cho4label_(Args &&...args)
Definition peglib.h:2137
std::shared_ptr< Ope > dot()
Definition peglib.h:2204
std::unordered_map< std::string, std::shared_ptr< Ope > > Rules
Definition peglib.h:5190
void enable_profiling(parser &parser, std::ostream &os)
Definition peglib.h:6941
std::function< void( const Ope &name, const char *s, size_t n, const SemanticValues &vs, const Context &c, const std::any &dt, std::any &trace_data)> TracerEnter
Definition peglib.h:878
std::shared_ptr< Ope > chr(char32_t dt)
Definition peglib.h:2200
bool is_hex(char c, int &v)
Definition peglib.h:251
std::string ast_to_s(const std::shared_ptr< T > &ptr, std::function< std::string(const T &ast, int level)> fn=nullptr)
Definition peglib.h:6394
std::shared_ptr< Ope > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2150
std::function< void(std::any &trace_data)> TracerStartOrEnd
Definition peglib.h:886
std::shared_ptr< Ope > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2146
std::vector< std::pair< char32_t, char32_t > > complement_character_ranges(const std::vector< std::pair< char32_t, char32_t > > &ranges)
Definition peglib.h:405
std::shared_ptr< Ope > cho(Args &&...args)
Definition peglib.h:2132
std::shared_ptr< Ope > rep(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:2154
constexpr unsigned int str2tag_core(const char *s, size_t l, unsigned int h)
Definition peglib.h:550
std::shared_ptr< Ope > npd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2163
void ast_to_s_core(const std::shared_ptr< T > &ptr, std::string &s, int level, std::function< std::string(const T &ast, int level)> fn)
Definition peglib.h:6368
constexpr unsigned int str2tag(std::string_view sv)
Definition peglib.h:557
std::shared_ptr< Ope > seq(Args &&...args)
Definition peglib.h:2128
bool success(size_t len)
Definition peglib.h:771
std::shared_ptr< Ope > ncls(const std::string &s)
Definition peglib.h:2190
std::pair< int, size_t > parse_hex_number(const char *s, size_t n, size_t i)
Definition peglib.h:273
std::shared_ptr< Ope > cap(const std::shared_ptr< Ope > &ope, Capture::MatchAction ma)
Definition peglib.h:2210
void add_ast_action(Definition &rule)
Definition peglib.h:6443
AstBase< EmptyType > Ast
Definition filter_string.h:30
static const char * RECOVER_DEFINITION_NAME
Definition peglib.h:2999
std::any call(F fn, Args &&...args)
Definition peglib.h:671
std::shared_ptr< Ope > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2142
std::function< void(const ErrorReport &report)> ErrorReporter
Definition peglib.h:798
std::shared_ptr< Ope > bkr(std::string &&name)
Definition peglib.h:2240
const std::vector< std::pair< char32_t, char32_t > > * predefined_character_class(std::string_view name)
Definition peglib.h:381
std::shared_ptr< Ope > usr(std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn)
Definition peglib.h:2224
std::string to_lower(std::string s)
Definition peglib.h:437
void enable_tracing(parser &parser, std::ostream &os)
Definition peglib.h:6881
#define CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT
Definition peglib.h:18
Definition clipboard_testing.h:11
void visit(Holder &ope) override
Definition peglib.h:4167
std::unordered_map< void *, size_t > ids
Definition peglib.h:2357
const size_t column
Definition peglib.h:6337
AstBase(const AstBase &ast, const char *original_name, size_t position=0, size_t length=0, size_t original_choice_count=0, size_t original_choice=0)
Definition peglib.h:6323
AstBase(const char *path, size_t line, size_t column, const char *name, const std::vector< std::shared_ptr< AstBase > > &nodes, size_t position=0, size_t length=0, size_t choice_count=0, size_t choice=0, bool preserve_position=false)
Definition peglib.h:6301
std::weak_ptr< AstBase< EmptyType > > parent
Definition peglib.h:6355
const std::string name
Definition peglib.h:6339
T token_to_number() const
Definition peglib.h:6362
const bool is_token
Definition peglib.h:6350
const size_t line
Definition peglib.h:6336
size_t length
Definition peglib.h:6341
AstBase(const char *path, size_t line, size_t column, const char *name, const std::string_view &token, size_t position=0, size_t length=0, size_t choice_count=0, size_t choice=0, bool preserve_position=false)
Definition peglib.h:6312
const unsigned int original_tag
Definition peglib.h:6348
const size_t choice
Definition peglib.h:6343
size_t position
Definition peglib.h:6340
const size_t original_choice_count
Definition peglib.h:6345
const std::string_view token
Definition peglib.h:6352
std::vector< std::shared_ptr< AstBase< EmptyType > > > nodes
Definition peglib.h:6354
const size_t choice_count
Definition peglib.h:6342
const size_t original_choice
Definition peglib.h:6346
const std::string path
Definition peglib.h:6335
std::string token_to_string() const
Definition peglib.h:6357
const unsigned int tag
Definition peglib.h:6347
const std::string original_name
Definition peglib.h:6344
const bool preserve_position
Definition peglib.h:6351
const bool mode_
Definition peglib.h:6436
const std::vector< std::string > rules_
Definition peglib.h:6437
std::shared_ptr< T > optimize(std::shared_ptr< T > original, std::shared_ptr< T > parent=nullptr)
Definition peglib.h:6406
AstOptimizer(bool mode, const std::vector< std::string > &rules={})
Definition peglib.h:6402
void visit(Repetition &ope) override
Definition peglib.h:2525
void visit(BackReference &) override
Definition peglib.h:2535
void visit(Cut &) override
Definition peglib.h:2536
void visit(LiteralString &ope) override
Definition peglib.h:2529
void visit(NotPredicate &) override
Definition peglib.h:2527
bool result
Definition peglib.h:2509
void visit(Dictionary &) override
Definition peglib.h:2528
void visit(User &) override
Definition peglib.h:2533
void visit(Character &) override
Definition peglib.h:2531
void visit(AndPredicate &) override
Definition peglib.h:2526
void visit(Sequence &ope) override
Definition peglib.h:2511
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2518
void visit(AnyCharacter &) override
Definition peglib.h:2532
void visit(CharacterClass &) override
Definition peglib.h:2530
void visit(User &) override
Definition peglib.h:2939
ComputeFirstSet(FirstSetCache &cache)
Definition peglib.h:2952
void visit(BackReference &) override
Definition peglib.h:2941
void visit(AndPredicate &) override
Definition peglib.h:2881
void visit(NotPredicate &) override
Definition peglib.h:2882
FirstSetCache & cache_
Definition peglib.h:2957
void visit(Cut &) override
Definition peglib.h:2942
void visit(LiteralString &ope) override
Definition peglib.h:2895
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2868
void visit(Repetition &ope) override
Definition peglib.h:2877
void visit(Dictionary &ope) override
Definition peglib.h:2883
std::unordered_map< const Definition *, FirstSet > FirstSetCache
Definition peglib.h:2950
void visit(AnyCharacter &) override
Definition peglib.h:2938
void visit(CharacterClass &ope) override
Definition peglib.h:2908
std::unordered_set< const Definition * > refs_
Definition peglib.h:2958
FirstSet result_
Definition peglib.h:2954
void visit(Character &ope) override
Definition peglib.h:2931
void visit(Sequence &ope) override
Definition peglib.h:2849
size_t cycle_count_
Definition peglib.h:2959
std::vector< std::shared_ptr< Ope > > args
Definition peglib.h:1030
size_t macro_inst
Definition peglib.h:1031
std::any val
Definition peglib.h:1061
size_t len
Definition peglib.h:1060
size_t misses
Definition peglib.h:1173
size_t hits
Definition peglib.h:1172
std::string_view sv_sv
Definition peglib.h:1298
size_t sv_tags_size
Definition peglib.h:1296
size_t sv_tokens_size
Definition peglib.h:1297
size_t capture_size
Definition peglib.h:1301
size_t choice
Definition peglib.h:1300
size_t choice_count
Definition peglib.h:1299
size_t sv_size
Definition peglib.h:1295
bool ret
Definition peglib.h:3007
size_t len
Definition peglib.h:3009
ErrorInfo error_info
Definition peglib.h:3010
bool recovered
Definition peglib.h:3008
void visit(Repetition &ope) override
Definition peglib.h:2704
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2698
DetectInfiniteLoop(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2688
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2725
void visit(Sequence &ope) override
Definition peglib.h:2692
bool has_error
Definition peglib.h:2719
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2724
const char * error_s
Definition peglib.h:2720
DetectInfiniteLoop(const char *s, const std::string &name, std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2681
std::string error_name
Definition peglib.h:2721
std::shared_ptr< Ope > ope
Definition peglib.h:2476
size_t depth
Definition peglib.h:2477
bool done_
Definition peglib.h:2502
void visit(AnyCharacter &) override
Definition peglib.h:2465
void visit(Sequence &ope) override
Definition peglib.h:2429
static const size_t max_macro_inst_depth
Definition peglib.h:2495
void visit(AndPredicate &ope) override
Definition peglib.h:2453
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2440
std::set< std::pair< const Definition *, size_t > > refs_
Definition peglib.h:2499
void visit(BackReference &) override
Definition peglib.h:2468
const char * error_s
Definition peglib.h:2471
size_t next_macro_inst_
Definition peglib.h:2501
void visit(Repetition &ope) override
Definition peglib.h:2449
void visit_in_defining_scope(const ResolvedArg &arg)
Definition peglib.h:4274
size_t intern_macro_inst(const Reference &ope)
Definition peglib.h:4254
void visit(Cut &) override
Definition peglib.h:2469
ResolvedArg resolve_macro_arg(size_t iarg) const
Definition peglib.h:4286
void visit(Character &) override
Definition peglib.h:2464
std::string name_
Definition peglib.h:2498
std::map< std::vector< const void * >, size_t > macro_inst_ids_
Definition peglib.h:2500
void visit(LiteralString &ope) override
Definition peglib.h:2462
void visit(CharacterClass &) override
Definition peglib.h:2463
DetectLeftRecursion(const std::string &name)
Definition peglib.h:2427
void visit(Dictionary &) override
Definition peglib.h:2461
void visit(NotPredicate &ope) override
Definition peglib.h:2457
std::vector< const std::vector< std::shared_ptr< Ope > > * > macro_args_stack_
Definition peglib.h:2503
void visit(User &) override
Definition peglib.h:2466
std::vector< std::pair< const char *, const Definition * > > expected_tokens
Definition peglib.h:807
std::string replace_all(std::string str, const std::string &from, const std::string &to) const
Definition peglib.h:862
void clear()
Definition peglib.h:814
const char * message_pos
Definition peglib.h:808
int cast_char(char c) const
Definition peglib.h:835
std::string heuristic_error_token(const char *s, size_t n, const char *pos) const
Definition peglib.h:837
const char * last_output_pos
Definition peglib.h:811
void output_log(const Log &log, const char *s, size_t n)
Definition peglib.h:828
bool keep_previous_token
Definition peglib.h:812
void add(const char *error_literal, const Definition *error_rule)
Definition peglib.h:821
std::string message
Definition peglib.h:809
std::string label
Definition peglib.h:810
const char * error_pos
Definition peglib.h:806
std::string label
Definition peglib.h:795
size_t position
Definition peglib.h:790
std::vector< std::string > expected_literals
Definition peglib.h:792
size_t col
Definition peglib.h:789
std::string message
Definition peglib.h:794
std::vector< std::string > expected_rules
Definition peglib.h:793
size_t line
Definition peglib.h:788
std::string unexpected_token
Definition peglib.h:791
void visit(LiteralString &ope) override
Definition peglib.h:2408
static const char * token(Ope &ope)
Definition peglib.h:2414
void visit(TokenBoundary &ope) override
Definition peglib.h:2409
const char * token_
Definition peglib.h:2421
void visit(Ignore &ope) override
Definition peglib.h:2410
void visit(Recovery &ope) override
Definition peglib.h:2412
const std::vector< std::string > & params_
Definition peglib.h:2840
void visit(Repetition &ope) override
Definition peglib.h:2782
void visit(WeakHolder &ope) override
Definition peglib.h:2819
void visit(Character &ope) override
Definition peglib.h:2801
void visit(CharacterClass &ope) override
Definition peglib.h:2798
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2774
void visit(Ignore &ope) override
Definition peglib.h:2815
void visit(Cut &ope) override
Definition peglib.h:2834
void visit(AnyCharacter &ope) override
Definition peglib.h:2802
void visit(LiteralString &ope) override
Definition peglib.h:2795
void visit(Recovery &ope) override
Definition peglib.h:2830
void visit(Holder &ope) override
Definition peglib.h:2820
const std::vector< std::shared_ptr< Ope > > & args_
Definition peglib.h:2839
void visit(Dictionary &ope) override
Definition peglib.h:2794
void visit(Whitespace &ope) override
Definition peglib.h:2822
void visit(TokenBoundary &ope) override
Definition peglib.h:2811
std::shared_ptr< Ope > found_ope
Definition peglib.h:2836
void visit(NotPredicate &ope) override
Definition peglib.h:2790
FindReference(const std::vector< std::shared_ptr< Ope > > &args, const std::vector< std::string > ¶ms)
Definition peglib.h:2762
void visit(Sequence &ope) override
Definition peglib.h:2766
void visit(AndPredicate &ope) override
Definition peglib.h:2786
void visit(Capture &ope) override
Definition peglib.h:2807
void visit(CaptureScope &ope) override
Definition peglib.h:2803
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2826
const char * first_literal
Definition peglib.h:1483
void merge(const FirstSet &other)
Definition peglib.h:1487
bool any_char
Definition peglib.h:1482
std::bitset< 256 > chars
Definition peglib.h:1480
bool can_be_empty
Definition peglib.h:1481
const Definition * first_rule
Definition peglib.h:1484
uint32_t u32()
Definition peglib.h:4948
const uint8_t * p
Definition peglib.h:4942
const uint8_t * end
Definition peglib.h:4942
std::string str()
Definition peglib.h:4960
uint64_t u64()
Definition peglib.h:4954
uint8_t u8()
Definition peglib.h:4943
std::vector< uint8_t > b
Definition peglib.h:4813
void u64(uint64_t v)
Definition peglib.h:4819
void u8(uint8_t v)
Definition peglib.h:4814
void str(const std::string &s)
Definition peglib.h:4823
void u32(uint32_t v)
Definition peglib.h:4815
Tag
Definition peglib.h:4788
@ T_Reference
Definition peglib.h:4804
@ T_Whitespace
Definition peglib.h:4805
@ T_PrecedenceClimbing
Definition peglib.h:4808
@ T_AnyChar
Definition peglib.h:4798
@ T_Dictionary
Definition peglib.h:4794
@ T_Not
Definition peglib.h:4793
@ T_BackRef
Definition peglib.h:4803
@ T_And
Definition peglib.h:4792
@ T_Sequence
Definition peglib.h:4789
@ T_TokenBoundary
Definition peglib.h:4801
@ T_Cut
Definition peglib.h:4807
@ T_Capture
Definition peglib.h:4800
@ T_Choice
Definition peglib.h:4790
@ T_CharClass
Definition peglib.h:4796
@ T_Recovery
Definition peglib.h:4806
@ T_Repetition
Definition peglib.h:4791
@ T_Char
Definition peglib.h:4797
@ T_Null
Definition peglib.h:4809
@ T_Literal
Definition peglib.h:4795
@ T_CaptureScope
Definition peglib.h:4799
@ T_Ignore
Definition peglib.h:4802
static std::shared_ptr< Ope > read_ope(Reader &r, Grammar &g, Definition *owner)
Definition peglib.h:4968
static void write_ope(Writer &w, const std::shared_ptr< Ope > &o)
Definition peglib.h:4829
static std::shared_ptr< Grammar > deserialize(const std::vector< uint8_t > &blob, std::string &start_out)
Definition peglib.h:5114
static const uint32_t MAGIC
Definition peglib.h:5071
static std::vector< uint8_t > serialize(const Grammar &g, const std::string &start)
Definition peglib.h:5073
std::string error_name
Definition peglib.h:2667
void visit(Sequence &ope) override
Definition peglib.h:4301
bool is_empty
Definition peglib.h:2665
void visit(Repetition &ope) override
Definition peglib.h:2651
const char * error_s
Definition peglib.h:2666
void visit(NotPredicate &) override
Definition peglib.h:2659
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2674
void visit(LiteralString &ope) override
Definition peglib.h:2660
void visit(AndPredicate &) override
Definition peglib.h:2658
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2675
void set_error()
Definition peglib.h:2670
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2645
HasEmptyElement(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2640
void visit(Dictionary &) override
Definition peglib.h:2370
void visit(LiteralString &) override
Definition peglib.h:2371
bool result_
Definition peglib.h:2380
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2363
static bool check(Ope &ope)
Definition peglib.h:2373
std::bitset< 256 > identifier_rest
Definition peglib.h:1384
std::bitset< 256 > identifier_first
Definition peglib.h:1383
size_t max_keyword_len
Definition peglib.h:1388
size_t min_keyword_len
Definition peglib.h:1387
std::vector< std::string > exact_keywords
Definition peglib.h:1385
std::vector< std::string > prefix_keywords
Definition peglib.h:1386
static bool matches_any(const std::vector< std::string > &keywords, std::string_view input)
Definition peglib.h:1390
const std::vector< std::string > & params_
Definition peglib.h:2756
Grammar & grammar_
Definition peglib.h:2755
void visit(Reference &ope) override
Definition peglib.h:4739
LinkReferences(Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2749
void opaque(const void *p)
Definition peglib.h:2632
void visit(Reference &ope) override
Definition peglib.h:2576
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2549
void visit(Capture &ope) override
Definition peglib.h:2560
void unary(const char *tag, Ope &inner)
Definition peglib.h:2622
void visit(TokenBoundary &ope) override
Definition peglib.h:2561
void visit(WeakHolder &ope) override
Definition peglib.h:2569
void visit(Sequence &ope) override
Definition peglib.h:2548
void visit(User &ope) override
Definition peglib.h:2601
void visit(AndPredicate &ope) override
Definition peglib.h:2557
std::string s
Definition peglib.h:2546
void visit(BackReference &ope) override
Definition peglib.h:2602
void visit(CaptureScope &ope) override
Definition peglib.h:2559
void visit(NotPredicate &ope) override
Definition peglib.h:2558
static std::string get(Ope &ope)
Definition peglib.h:2606
void visit(AnyCharacter &) override
Definition peglib.h:2599
void visit(Recovery &ope) override
Definition peglib.h:2564
void visit(Character &ope) override
Definition peglib.h:2596
void visit(Repetition &ope) override
Definition peglib.h:2550
void visit(CharacterClass &ope) override
Definition peglib.h:2587
void visit(LiteralString &ope) override
Definition peglib.h:2584
void wrap(Ope &inner)
Definition peglib.h:2627
void visit(Whitespace &ope) override
Definition peglib.h:2563
void visit(Cut &ope) override
Definition peglib.h:2604
void visit(Dictionary &ope) override
Definition peglib.h:2600
void visit(Holder &ope) override
Definition peglib.h:2568
void group(const char *tag, const std::vector< std::shared_ptr< Ope > > &v)
Definition peglib.h:2613
void visit(Ignore &ope) override
Definition peglib.h:2562
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2603
virtual void visit(WeakHolder &)
Definition peglib.h:2277
virtual void visit(TokenBoundary &)
Definition peglib.h:2274
virtual void visit(Repetition &)
Definition peglib.h:2264
virtual void visit(Dictionary &)
Definition peglib.h:2267
virtual void visit(Character &)
Definition peglib.h:2270
virtual ~Visitor()
Definition peglib.h:2261
virtual void visit(AndPredicate &)
Definition peglib.h:2265
virtual void visit(LiteralString &)
Definition peglib.h:2268
virtual void visit(Reference &)
Definition peglib.h:2279
virtual void visit(CharacterClass &)
Definition peglib.h:2269
virtual void visit(PrioritizedChoice &)
Definition peglib.h:2263
virtual void visit(Ignore &)
Definition peglib.h:2275
virtual void visit(PrecedenceClimbing &)
Definition peglib.h:2282
virtual void visit(CaptureScope &)
Definition peglib.h:2272
virtual void visit(Sequence &)
Definition peglib.h:2262
virtual void visit(Holder &)
Definition peglib.h:2278
virtual void visit(Capture &)
Definition peglib.h:2273
virtual void visit(NotPredicate &)
Definition peglib.h:2266
virtual void visit(BackReference &)
Definition peglib.h:2281
virtual void visit(Cut &)
Definition peglib.h:2284
virtual void visit(AnyCharacter &)
Definition peglib.h:2271
virtual void visit(Whitespace &)
Definition peglib.h:2280
virtual void visit(Recovery &)
Definition peglib.h:2283
virtual void visit(User &)
Definition peglib.h:2276
size_t len
Definition peglib.h:976
size_t key
Definition peglib.h:975
Data()
Definition peglib.h:5267
std::vector< std::pair< std::string, const char * > > duplicates_of_definition
Definition peglib.h:5256
bool enablePackratParsing
Definition peglib.h:5265
std::map< std::string, std::vector< Instruction > > instructions
Definition peglib.h:5259
std::string start
Definition peglib.h:5253
std::vector< std::pair< std::string, const char * > > duplicates_of_instruction
Definition peglib.h:5258
const char * start_pos
Definition peglib.h:5254
std::set< std::string_view > captures_in_current_definition
Definition peglib.h:5264
std::vector< std::pair< std::string, const char * > > undefined_back_references
Definition peglib.h:5261
std::shared_ptr< Grammar > grammar
Definition peglib.h:5252
std::vector< std::set< std::string_view > > captures_stack
Definition peglib.h:5262
std::any data
Definition peglib.h:5247
std::string type
Definition peglib.h:5246
std::string_view sv
Definition peglib.h:5248
std::shared_ptr< Grammar > grammar
Definition peglib.h:5195
bool enablePackratParsing
Definition peglib.h:5197
std::string start
Definition peglib.h:5196
std::unordered_set< std::string > referenced
Definition peglib.h:2739
std::unordered_map< std::string, const char * > error_s
Definition peglib.h:2737
const std::vector< std::string > & params_
Definition peglib.h:2743
std::unordered_map< std::string, std::string > error_message
Definition peglib.h:2738
ReferenceChecker(const Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2731
const Grammar & grammar_
Definition peglib.h:2742
void visit(Reference &ope) override
Definition peglib.h:4378
std::pair< size_t, size_t > line_info() const
Definition peglib.h:3380
std::string token_to_string(size_t id=0) const
Definition peglib.h:609
std::vector< std::string_view > tokens
Definition peglib.h:600
size_t choice_
Definition peglib.h:664
Context * c_
Definition peglib.h:661
std::string name_
Definition peglib.h:665
friend class Holder
Definition peglib.h:658
friend class Sequence
Definition peglib.h:655
std::string_view token(size_t id=0) const
Definition peglib.h:602
std::string_view sv() const
Definition peglib.h:583
std::string_view sv_
Definition peglib.h:662
size_t choice() const
Definition peglib.h:597
T token_to_number() const
Definition peglib.h:613
const char * ss
Definition peglib.h:580
size_t choice_count_
Definition peglib.h:663
friend class Dictionary
Definition peglib.h:654
size_t choice_count() const
Definition peglib.h:594
std::vector< T > transform(size_t beg=0, size_t end=static_cast< size_t >(-1)) const
Definition peglib.h:619
const char * path
Definition peglib.h:579
std::vector< unsigned int > tags
Definition peglib.h:588
const std::string & name() const
Definition peglib.h:586
friend class Repetition
Definition peglib.h:657
friend class PrecedenceClimbing
Definition peglib.h:659
SemanticValues(Context *c)
Definition peglib.h:576
friend class Context
Definition peglib.h:653
friend class PrioritizedChoice
Definition peglib.h:656
void setup_keyword_guarded_identifier(Sequence &ope)
Definition peglib.h:4471
void visit(Repetition &ope) override
Definition peglib.h:2980
ComputeFirstSet::FirstSetCache first_set_cache_
Definition peglib.h:2990
void visit(Sequence &ope) override
Definition peglib.h:4463
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2968
std::unordered_set< const Definition * > visited_rules_
Definition peglib.h:2991
bool has_rule_
Definition peglib.h:2402
bool has_token_boundary_
Definition peglib.h:2401
void visit(TokenBoundary &) override
Definition peglib.h:2386
void visit(WeakHolder &) override
Definition peglib.h:2389
void visit(NotPredicate &) override
Definition peglib.h:2388
void visit(AndPredicate &) override
Definition peglib.h:2387
static bool is_token(Ope &ope)
Definition peglib.h:2392
void visit(Recovery &) override
Definition peglib.h:2337
void visit(Cut &) override
Definition peglib.h:2338
void visit(Holder &ope) override
Definition peglib.h:2332
void visit(User &) override
Definition peglib.h:2330
void visit(NotPredicate &) override
Definition peglib.h:2320
void visit(TokenBoundary &) override
Definition peglib.h:2328
void visit(LiteralString &) override
Definition peglib.h:2322
void visit(AnyCharacter &) override
Definition peglib.h:2325
void visit(Whitespace &) override
Definition peglib.h:2334
void visit(WeakHolder &) override
Definition peglib.h:2331
void visit(Repetition &) override
Definition peglib.h:2318
void visit(Character &) override
Definition peglib.h:2324
void visit(CharacterClass &) override
Definition peglib.h:2323
void visit(Reference &) override
Definition peglib.h:2333
static std::string get(Ope &ope)
Definition peglib.h:2340
const char * name_
Definition peglib.h:2347
void visit(Capture &) override
Definition peglib.h:2327
void visit(CaptureScope &) override
Definition peglib.h:2326
void visit(PrecedenceClimbing &) override
Definition peglib.h:2336
void visit(Sequence &) override
Definition peglib.h:2316
void visit(PrioritizedChoice &) override
Definition peglib.h:2317
void visit(Ignore &) override
Definition peglib.h:2329
void visit(AndPredicate &) override
Definition peglib.h:2319
void visit(BackReference &) override
Definition peglib.h:2335
void visit(Dictionary &) override
Definition peglib.h:2321
void visit(TokenBoundary &ope) override
Definition peglib.h:2304
void visit(Recovery &ope) override
Definition peglib.h:2309
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2294
void visit(Capture &ope) override
Definition peglib.h:2303
void visit(Whitespace &ope) override
Definition peglib.h:2308
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2310
void visit(Repetition &ope) override
Definition peglib.h:2299
void visit(CaptureScope &ope) override
Definition peglib.h:2302
void visit(AndPredicate &ope) override
Definition peglib.h:2300
void visit(Sequence &ope) override
Definition peglib.h:2289
void visit(WeakHolder &ope) override
Definition peglib.h:2306
void visit(NotPredicate &ope) override
Definition peglib.h:2301
void visit(Ignore &ope) override
Definition peglib.h:2305
void visit(Holder &ope) override
Definition peglib.h:2307
bool match
Definition peglib.h:509
size_t id
Definition peglib.h:510
bool done
Definition peglib.h:508
bool execute_on_destruction
Definition peglib.h:83
scope_exit(scope_exit &&rhs)
Definition peglib.h:65
EF exit_function
Definition peglib.h:82
~scope_exit()
Definition peglib.h:71
scope_exit(EF &&f)
Definition peglib.h:62
scope_exit(const scope_exit &)=delete
void operator=(const scope_exit &)=delete
scope_exit & operator=(scope_exit &&)=delete
void release()
Definition peglib.h:75