14#ifndef CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT
15#define CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT 32
23#if __has_include(<charconv>)
28#include <initializer_list>
38#include <unordered_map>
39#include <unordered_set>
42#if !defined(__cplusplus) || __cplusplus < 201703L
43#error "Requires complete C++17 support"
86 auto b =
static_cast<uint8_t
>(s8[0]);
87 if ((b & 0x80) == 0) {
89 }
else if ((b & 0xE0) == 0xC0 && l >= 2) {
91 }
else if ((b & 0xF0) == 0xE0 && l >= 3) {
93 }
else if ((b & 0xF8) == 0xF0 && l >= 4) {
102 for (
size_t i = 0; i < l;) {
116 buff[0] =
static_cast<char>(cp & 0x7F);
118 }
else if (cp < 0x0800) {
119 buff[0] =
static_cast<char>(0xC0 | ((cp >> 6) & 0x1F));
120 buff[1] =
static_cast<char>(0x80 | (cp & 0x3F));
122 }
else if (cp < 0xD800) {
123 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
124 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
125 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
127 }
else if (cp < 0xE000) {
130 }
else if (cp < 0x10000) {
131 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
132 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
133 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
135 }
else if (cp < 0x110000) {
136 buff[0] =
static_cast<char>(0xF0 | ((cp >> 18) & 0x7));
137 buff[1] =
static_cast<char>(0x80 | ((cp >> 12) & 0x3F));
138 buff[2] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
139 buff[3] =
static_cast<char>(0x80 | (cp & 0x3F));
148 return std::string(buff, l);
154 auto b =
static_cast<uint8_t
>(s8[0]);
155 if ((b & 0x80) == 0) {
159 }
else if ((b & 0xE0) == 0xC0) {
162 cp = ((
static_cast<char32_t>(s8[0] & 0x1F)) << 6) |
163 (
static_cast<char32_t>(s8[1] & 0x3F));
166 }
else if ((b & 0xF0) == 0xE0) {
169 cp = ((
static_cast<char32_t>(s8[0] & 0x0F)) << 12) |
170 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 6) |
171 (
static_cast<char32_t>(s8[2] & 0x3F));
174 }
else if ((b & 0xF8) == 0xF0) {
177 cp = ((
static_cast<char32_t>(s8[0] & 0x07)) << 18) |
178 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 12) |
179 ((
static_cast<char32_t>(s8[2] & 0x3F)) << 6) |
180 (
static_cast<char32_t>(s8[3] & 0x3F));
200inline std::u32string
decode(
const char *s8,
size_t l) {
205 while (i < l && (s8[i] & 0xc0) == 0x80) {
213template <
typename T>
const char *
u8(
const T *s) {
214 return reinterpret_cast<const char *
>(s);
223 for (
size_t i = 0; i < n; i++) {
226 case '\f': str +=
"\\f";
break;
227 case '\n': str +=
"\\n";
break;
228 case '\r': str +=
"\\r";
break;
229 case '\t': str +=
"\\t";
break;
230 case '\v': str +=
"\\v";
break;
231 default: str += c;
break;
246 if (
'0' <= c && c <=
'9') {
249 }
else if (
'a' <= c && c <=
'f') {
252 }
else if (
'A' <= c && c <=
'F') {
260 if (
'0' <= c && c <=
'9') {
271 while (i < n &&
is_hex(s[i], val)) {
272 ret =
static_cast<int>(ret * 16 + val);
275 return std::pair(ret, i);
282 while (i < n &&
is_digit(s[i], val)) {
283 ret =
static_cast<int>(ret * 8 + val);
286 return std::pair(ret, i);
369#if __has_include(<charconv>)
370 if constexpr (!std::is_floating_point<T>::value) {
371 std::from_chars(sv.data(), sv.data() + sv.size(), n);
373 if constexpr (
false) {
376 auto s = std::string(sv);
377 std::istringstream ss(s);
385 c =
static_cast<char>(std::tolower(
static_cast<unsigned char>(c)));
396 Trie(
const std::vector<std::string> &items,
bool ignore_case)
399 for (
const auto &item : items) {
400 const auto &s = ignore_case ?
to_lower(item) : item;
402 for (
size_t len = 1; len <= item.size(); len++) {
403 auto last = len == item.size();
404 std::string_view sv(s.data(), len);
405 auto it =
dic_.find(sv);
406 if (it ==
dic_.end()) {
407 dic_.emplace(sv,
Info{last, last,
id});
409 it->second.match =
true;
411 it->second.done =
false;
418 size_t match(
const char *text,
size_t text_len,
size_t &
id)
const {
419 auto limit = std::min(text_len,
max_len_);
420 std::string lower_text;
422 lower_text =
to_lower(std::string(text, limit));
423 text = lower_text.data();
426 size_t match_len = 0;
429 while (!done && len <= limit) {
430 std::string_view sv(text, len);
431 auto it =
dic_.find(sv);
432 if (it ==
dic_.end()) {
435 if (it->second.match) {
439 if (it->second.done) { done =
true; }
460 std::map<std::string, Info, std::less<>>
dic_;
474inline std::pair<size_t, size_t>
line_info(
const char *start,
const char *cur) {
489 return std::pair(no, col);
499 (h * 33) ^
static_cast<unsigned char>(*s));
502inline constexpr unsigned int str2tag(std::string_view sv) {
508inline constexpr unsigned int operator""_(
const char *s,
size_t l) {
525 const char *
ss =
nullptr;
528 std::string_view
sv()
const {
return sv_; }
533 std::vector<unsigned int>
tags;
536 std::pair<size_t, size_t>
line_info()
const;
547 std::string_view
token(
size_t id = 0)
const {
549 assert(
id <
tokens.size());
555 return std::string(
token(
id));
563 template <
typename T>
565 size_t end =
static_cast<size_t>(-1))
const {
567 end = (std::min)(end, size());
568 for (
size_t i = beg; i < end; i++) {
569 r.emplace_back(std::any_cast<T>((*
this)[i]));
574 using std::vector<std::any>::iterator;
575 using std::vector<std::any>::const_iterator;
576 using std::vector<std::any>::size;
577 using std::vector<std::any>::empty;
578 using std::vector<std::any>::assign;
579 using std::vector<std::any>::begin;
580 using std::vector<std::any>::end;
581 using std::vector<std::any>::rbegin;
582 using std::vector<std::any>::rend;
583 using std::vector<std::any>::operator[];
584 using std::vector<std::any>::at;
585 using std::vector<std::any>::resize;
586 using std::vector<std::any>::front;
587 using std::vector<std::any>::back;
588 using std::vector<std::any>::push_back;
589 using std::vector<std::any>::pop_back;
590 using std::vector<std::any>::insert;
591 using std::vector<std::any>::erase;
592 using std::vector<std::any>::clear;
593 using std::vector<std::any>::swap;
594 using std::vector<std::any>::emplace;
595 using std::vector<std::any>::emplace_back;
616template <
typename F,
typename... Args> std::any
call(F fn, Args &&...args) {
617 using R =
decltype(fn(std::forward<Args>(args)...));
618 if constexpr (std::is_void<R>::value) {
619 fn(std::forward<Args>(args)...);
621 }
else if constexpr (std::is_same<typename std::remove_cv<R>::type,
623 return fn(std::forward<Args>(args)...);
625 return std::any(fn(std::forward<Args>(args)...));
631template <
typename R,
typename... Args>
633 : std::integral_constant<unsigned,
sizeof...(Args)> {};
634template <
typename R,
typename C,
typename... Args>
636 : std::integral_constant<unsigned, sizeof...(Args)> {};
637template <
typename R,
typename C,
typename... Args>
639 : std::integral_constant<unsigned, sizeof...(Args)> {};
649 operator bool()
const {
return bool(
fn_); }
652 const std::any &predicate_data)
const {
653 return fn_(vs, dt, predicate_data);
658 const std::any &predicate_data)>;
662 return [fn](
auto &vs,
auto & ,
const auto & ) {
666 return [fn](
auto &vs,
auto &dt,
const auto & ) {
667 return call(fn, vs, dt);
670 return [fn](
auto &vs,
auto &dt,
const auto &predicate_data) {
671 return call(fn, vs, dt, predicate_data);
687 operator bool()
const {
return bool(
fn_); }
690 std::string &msg, std::any &predicate_data)
const {
691 return fn_(vs, dt, msg, predicate_data);
696 std::string &msg, std::any &predicate_data)>;
700 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
701 auto & ) {
return fn(vs, dt, msg); };
703 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
704 auto &predicate_data) {
705 return fn(vs, dt, msg, predicate_data);
716inline bool success(
size_t len) {
return len !=
static_cast<size_t>(-1); }
718inline bool fail(
size_t len) {
return len ==
static_cast<size_t>(-1); }
723using Log = std::function<void(
size_t line,
size_t col,
const std::string &msg,
724 const std::string &rule)>;
749 if (t == error_literal && r == error_rule) {
return; }
757 int cast_char(
char c)
const {
return static_cast<unsigned char>(c); }
760 const char *pos)
const {
761 auto len = n - std::distance(s, pos);
765 if (!std::ispunct(c) && !std::isspace(c)) {
766 while (i < len && !std::ispunct(
cast_char(pos[i])) &&
774 while (count > 0 && j < i) {
781 return std::string();
785 const std::string &to)
const {
787 while ((pos = str.find(from, pos)) != std::string::npos) {
788 str.replace(pos, from.length(), to);
802 const Context &c,
const std::any &dt, std::any &trace_data)>;
806 const Context &c,
const std::any &dt,
size_t, std::any &trace_data)>;
841 std::map<std::pair<size_t, size_t>, std::tuple<size_t, std::any>>
846 size_t len =
static_cast<size_t>(-1);
861 auto col =
static_cast<size_t>(pos -
s);
871 const std::any &val) {
874 auto idx =
def_count *
static_cast<size_t>(col) + def_id;
878 auto key = std::pair(col, def_id);
925 template <
typename T>
926 void packrat(
const char *a_s,
size_t def_id,
size_t &len, std::any &val,
934 auto idx =
def_count *
static_cast<size_t>(col) + def_id;
938 (*packrat_stats)[def_id].hits++;
941 auto key = std::pair(col, def_id);
945 len =
static_cast<size_t>(-1);
954 (*packrat_stats)[def_id].misses++;
976 value_stack.emplace_back(std::make_shared<SemanticValues>(
this));
981 if (!vs.tags.empty()) { vs.tags.clear(); }
983 vs.sv_ = std::string_view();
984 vs.choice_count_ = 0;
986 if (!vs.tokens.empty()) { vs.tokens.clear(); }
998 void push_args(std::vector<std::shared_ptr<Ope>> &&args) {
1004 const std::vector<std::shared_ptr<Ope>> &
top_args()
const {
1020 return {vs.size(), vs.
tags.size(), vs.
tokens.size(), vs.
sv_,
1041 void set_error_pos(
const char *a_s,
const char *literal =
nullptr);
1051 std::pair<size_t, size_t>
line_info(
const char *cur)
const {
1053 for (
size_t pos = 0; pos <
l; pos++) {
1059 auto pos =
static_cast<size_t>(std::distance(
s, cur));
1061 auto it = std::lower_bound(
1063 [](
size_t element,
size_t value) { return element < value; });
1067 return std::pair(
id + 1, off + 1);
1086 std::any &dt)
const;
1088 Context &c, std::any &dt)
const = 0;
1106 std::string_view input) {
1107 return std::any_of(keywords.begin(), keywords.end(),
1108 [&](
const auto &kw) { return kw == input; });
1114 template <
typename... Args>
1116 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...} {}
1121 std::any &dt)
const override {
1131 for (
const auto &ope :
opes_) {
1132 auto len = ope->parse(s + i, n - i, vs, c, dt);
1133 if (
fail(len)) {
return len; }
1139 void accept(Visitor &v)
override;
1141 std::vector<std::shared_ptr<Ope>>
opes_;
1150 std::any &dt)
const {
1152 if (n < 1 || !kw.identifier_first.test(
static_cast<unsigned char>(*s))) {
1154 return static_cast<size_t>(-1);
1158 while (id_len < n &&
1159 kw.identifier_rest.test(
static_cast<unsigned char>(s[id_len]))) {
1163 if (id_len >= kw.min_keyword_len && id_len <= kw.max_keyword_len) {
1165 std::unique_ptr<char[]> lower_heap;
1166 char *lower = lower_buf;
1167 if (id_len >
sizeof(lower_buf)) {
1168 lower_heap.reset(
new char[id_len]);
1169 lower = lower_heap.get();
1171 std::transform(s, s + id_len, lower, [](
unsigned char ch) {
1172 return static_cast<char>(std::tolower(ch));
1174 std::string_view lower_sv(lower, id_len);
1178 return static_cast<size_t>(-1);
1181 return std::nullopt;
1185 vs.
tokens.emplace_back(std::string_view(s, id_len));
1187 if (
fail(wl)) {
return wl; }
1212 template <
typename... Args>
1214 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...},
1223 :
opes_(std::move(opes)) {
1228 std::any &dt)
const override {
1229 size_t len =
static_cast<size_t>(-1);
1237 for (
const auto &ope :
opes_) {
1241 if (!fs.any_char && !fs.can_be_empty &&
1242 !fs.chars.test(
static_cast<unsigned char>(*s))) {
1243 if (c.
log && (fs.first_literal || fs.first_rule)) {
1249 if (fs.first_literal) {
1266 len = ope->parse(s, n, vs, c, dt);
1285 void accept(Visitor &v)
override;
1289 std::vector<std::shared_ptr<Ope>>
opes_;
1296 Repetition(
const std::shared_ptr<Ope> &ope,
size_t min,
size_t max)
1300 std::any &dt)
const override {
1307 if (
max_ == std::numeric_limits<size_t>::max()) {
1309 while (i < n && bitset.test(
static_cast<unsigned char>(s[i]))) {
1313 auto limit = std::min(n,
max_);
1314 while (i < limit && bitset.test(
static_cast<unsigned char>(s[i]))) {
1320 return static_cast<size_t>(-1);
1327 while (count <
min_) {
1328 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1329 if (
fail(len)) {
return len; }
1334 while (count <
max_) {
1336 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1347 void accept(Visitor &v)
override;
1350 return min_ == 0 &&
max_ == std::numeric_limits<size_t>::max();
1353 static std::shared_ptr<Repetition>
zom(
const std::shared_ptr<Ope> &ope) {
1354 return std::make_shared<Repetition>(ope, 0,
1355 std::numeric_limits<size_t>::max());
1358 static std::shared_ptr<Repetition>
oom(
const std::shared_ptr<Ope> &ope) {
1359 return std::make_shared<Repetition>(ope, 1,
1360 std::numeric_limits<size_t>::max());
1363 static std::shared_ptr<Repetition>
opt(
const std::shared_ptr<Ope> &ope) {
1364 return std::make_shared<Repetition>(ope, 0, 1);
1379 std::any &dt)
const override {
1381 auto len =
ope_->parse(s, n, vs, c, dt);
1390 void accept(Visitor &v)
override;
1400 std::any &dt)
const override {
1402 auto len =
ope_->parse(s, n, vs, c, dt);
1406 return static_cast<size_t>(-1);
1412 void accept(Visitor &v)
override;
1420 :
trie_(v, ignore_case) {
1425 std::any &dt)
const override;
1427 void accept(Visitor &v)
override;
1433 public std::enable_shared_from_this<LiteralString> {
1446 std::any &dt)
const override;
1448 void accept(Visitor &v)
override;
1458 public std::enable_shared_from_this<CharacterClass> {
1462 auto chars =
decode(s.data(), s.length());
1464 while (i < chars.size()) {
1465 if (i + 2 < chars.size() && chars[i + 1] ==
'-') {
1466 auto cp1 = chars[i];
1467 auto cp2 = chars[i + 2];
1468 ranges_.emplace_back(std::pair(cp1, cp2));
1472 ranges_.emplace_back(std::pair(cp, cp));
1481 bool negated,
bool ignore_case)
1488 Context &c, std::any & )
const override {
1491 return static_cast<size_t>(-1);
1497 for (
const auto &range :
ranges_) {
1501 return static_cast<size_t>(-1);
1512 return static_cast<size_t>(-1);
1516 void accept(Visitor &v)
override;
1524 bool in_range(
const std::pair<char32_t, char32_t> &range,
char32_t cp)
const {
1526 auto cpl = std::tolower(cp);
1527 return std::tolower(range.first) <= cpl &&
1528 cpl <= std::tolower(range.second);
1530 return range.first <= cp && cp <= range.second;
1536 for (
const auto &[lo, hi] :
ranges_) {
1537 if (lo > 0x7F || hi > 0x7F) {
return; }
1540 for (
const auto &[lo, hi] :
ranges_) {
1541 for (
auto cp = lo; cp <= hi; cp++) {
1542 auto ch =
static_cast<unsigned char>(cp);
1545 ascii_bitset_.set(
static_cast<unsigned char>(std::toupper(ch)));
1546 ascii_bitset_.set(
static_cast<unsigned char>(std::tolower(ch)));
1552 std::vector<std::pair<char32_t, char32_t>>
ranges_;
1559class Character :
public Ope,
public std::enable_shared_from_this<Character> {
1564 Context &c, std::any & )
const override {
1567 return static_cast<size_t>(-1);
1575 return static_cast<size_t>(-1);
1580 void accept(Visitor &v)
override;
1586 public std::enable_shared_from_this<AnyCharacter> {
1589 Context &c, std::any & )
const override {
1593 return static_cast<size_t>(-1);
1598 void accept(Visitor &v)
override;
1606 std::any &dt)
const override {
1608 auto len =
ope_->parse(s, n, vs, c, dt);
1613 void accept(Visitor &v)
override;
1626 std::any &dt)
const override {
1627 auto len =
ope_->parse(s, n, vs, c, dt);
1632 void accept(Visitor &v)
override;
1645 std::any &dt)
const override;
1647 void accept(Visitor &v)
override;
1657 Context &c, std::any &dt)
const override {
1660 return ope_->parse(s, n, chvs, c, dt);
1663 void accept(Visitor &v)
override;
1675 Context & , std::any &dt)
const override {
1677 return fn_(s, n, vs, dt);
1679 void accept(Visitor &v)
override;
1680 std::function<size_t(
const char *s,
size_t n,
SemanticValues &vs,
1690 std::any &dt)
const override {
1691 auto ope =
weak_.lock();
1693 return ope->parse(s, n, vs, c, dt);
1696 void accept(Visitor &v)
override;
1706 std::any &dt)
const override;
1708 void accept(Visitor &v)
override;
1711 const std::any &predicate_data)
const;
1713 const std::string &
name()
const;
1724using Grammar = std::unordered_map<std::string, Definition>;
1726class Reference :
public Ope,
public std::enable_shared_from_this<Reference> {
1729 bool is_macro,
const std::vector<std::shared_ptr<Ope>> &args)
1734 std::any &dt)
const override;
1736 void accept(Visitor &v)
override;
1745 const std::vector<std::shared_ptr<Ope>>
args_;
1756 std::any &dt)
const override {
1760 return ope_->parse(s, n, vs, c, dt);
1763 void accept(Visitor &v)
override;
1775 std::any &dt)
const override;
1777 void accept(Visitor &v)
override;
1784 using BinOpeInfo = std::map<std::string_view, std::pair<size_t, char>>;
1787 const std::shared_ptr<Ope> &binop,
const BinOpeInfo &info,
1792 std::any &dt)
const override {
1796 void accept(Visitor &v)
override;
1805 Context &c, std::any &dt,
size_t min_prec)
const;
1815 std::any &dt)
const override;
1817 void accept(Visitor &v)
override;
1822class Cut :
public Ope,
public std::enable_shared_from_this<Cut> {
1825 Context &c, std::any & )
const override {
1830 void accept(Visitor &v)
override;
1836template <
typename... Args> std::shared_ptr<Ope>
seq(Args &&...args) {
1837 return std::make_shared<Sequence>(
static_cast<std::shared_ptr<Ope>
>(args)...);
1840template <
typename... Args> std::shared_ptr<Ope>
cho(Args &&...args) {
1841 return std::make_shared<PrioritizedChoice>(
1842 false,
static_cast<std::shared_ptr<Ope>
>(args)...);
1845template <
typename... Args> std::shared_ptr<Ope>
cho4label_(Args &&...args) {
1846 return std::make_shared<PrioritizedChoice>(
1847 true,
static_cast<std::shared_ptr<Ope>
>(args)...);
1850inline std::shared_ptr<Ope>
zom(
const std::shared_ptr<Ope> &ope) {
1854inline std::shared_ptr<Ope>
oom(
const std::shared_ptr<Ope> &ope) {
1858inline std::shared_ptr<Ope>
opt(
const std::shared_ptr<Ope> &ope) {
1862inline std::shared_ptr<Ope>
rep(
const std::shared_ptr<Ope> &ope,
size_t min,
1864 return std::make_shared<Repetition>(ope, min, max);
1867inline std::shared_ptr<Ope>
apd(
const std::shared_ptr<Ope> &ope) {
1868 return std::make_shared<AndPredicate>(ope);
1871inline std::shared_ptr<Ope>
npd(
const std::shared_ptr<Ope> &ope) {
1872 return std::make_shared<NotPredicate>(ope);
1875inline std::shared_ptr<Ope>
dic(
const std::vector<std::string> &v,
1877 return std::make_shared<Dictionary>(v, ignore_case);
1880inline std::shared_ptr<Ope>
lit(std::string &&s) {
1881 return std::make_shared<LiteralString>(s,
false);
1884inline std::shared_ptr<Ope>
liti(std::string &&s) {
1885 return std::make_shared<LiteralString>(s,
true);
1888inline std::shared_ptr<Ope>
cls(
const std::string &s) {
1889 return std::make_shared<CharacterClass>(s,
false,
false);
1892inline std::shared_ptr<Ope>
1893cls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
1894 bool ignore_case =
false) {
1895 return std::make_shared<CharacterClass>(ranges,
false, ignore_case);
1898inline std::shared_ptr<Ope>
ncls(
const std::string &s) {
1899 return std::make_shared<CharacterClass>(s,
true,
false);
1902inline std::shared_ptr<Ope>
1903ncls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
1904 bool ignore_case =
false) {
1905 return std::make_shared<CharacterClass>(ranges,
true, ignore_case);
1908inline std::shared_ptr<Ope>
chr(
char32_t dt) {
1909 return std::make_shared<Character>(dt);
1912inline std::shared_ptr<Ope>
dot() {
return std::make_shared<AnyCharacter>(); }
1914inline std::shared_ptr<Ope>
csc(
const std::shared_ptr<Ope> &ope) {
1915 return std::make_shared<CaptureScope>(ope);
1918inline std::shared_ptr<Ope>
cap(
const std::shared_ptr<Ope> &ope,
1920 return std::make_shared<Capture>(ope, ma);
1923inline std::shared_ptr<Ope>
tok(
const std::shared_ptr<Ope> &ope) {
1924 return std::make_shared<TokenBoundary>(ope);
1927inline std::shared_ptr<Ope>
ign(
const std::shared_ptr<Ope> &ope) {
1928 return std::make_shared<Ignore>(ope);
1931inline std::shared_ptr<Ope>
1935 return std::make_shared<User>(fn);
1938inline std::shared_ptr<Ope>
ref(
const Grammar &grammar,
const std::string &name,
1939 const char *s,
bool is_macro,
1940 const std::vector<std::shared_ptr<Ope>> &args) {
1941 return std::make_shared<Reference>(grammar, name, s, is_macro, args);
1944inline std::shared_ptr<Ope>
wsp(
const std::shared_ptr<Ope> &ope) {
1945 return std::make_shared<Whitespace>(std::make_shared<Ignore>(ope));
1948inline std::shared_ptr<Ope>
bkr(std::string &&name) {
1949 return std::make_shared<BackReference>(name);
1952inline std::shared_ptr<Ope>
pre(
const std::shared_ptr<Ope> &atom,
1953 const std::shared_ptr<Ope> &binop,
1956 return std::make_shared<PrecedenceClimbing>(atom, binop, info, rule);
1959inline std::shared_ptr<Ope>
rec(
const std::shared_ptr<Ope> &ope) {
1960 return std::make_shared<Recovery>(ope);
1963inline std::shared_ptr<Ope>
cut() {
return std::make_shared<Cut>(); }
1998 for (
auto &op : ope.
opes_) {
2003 for (
auto &op : ope.
opes_) {
2065 std::unordered_map<void *, size_t>
ids;
2072 for (
const auto &op : ope.
opes_) {
2138 for (
const auto &op : ope.
opes_) {
2149 for (
const auto &op : ope.
opes_) {
2158 ope.
ope_->accept(*
this);
2162 ope.
ope_->accept(*
this);
2166 ope.
ope_->accept(*
this);
2197 ComputeCanBeEmpty vis;
2204 ComputeCanBeEmpty vis;
2227 std::unordered_map<std::string, bool> &has_error_cache)
2232 for (
const auto &op : ope.
opes_) {
2238 if (ope.
min_ == 0) {
2241 ope.
ope_->accept(*
this);
2260 std::vector<std::pair<const char *, std::string>> &
refs_;
2268 std::vector<std::pair<const char *, std::string>> &refs,
2269 std::unordered_map<std::string, bool> &has_error_cache)
2271 refs_.emplace_back(s, name);
2275 std::unordered_map<std::string, bool> &has_error_cache)
2279 for (
const auto &op : ope.
opes_) {
2285 for (
const auto &op : ope.
opes_) {
2291 if (ope.
max_ == std::numeric_limits<size_t>::max()) {
2293 ope.
ope_->accept(vis);
2300 ope.
ope_->accept(*
this);
2310 std::vector<std::pair<const char *, std::string>> &
refs_;
2318 const std::vector<std::string> ¶ms)
2323 std::unordered_map<std::string, const char *>
error_s;
2349 const std::vector<std::string> ¶ms)
2353 std::vector<std::shared_ptr<Ope>> opes;
2354 for (
const auto &o : ope.
opes_) {
2356 opes.emplace_back(std::move(
found_ope));
2358 found_ope = std::make_shared<Sequence>(opes);
2361 std::vector<std::shared_ptr<Ope>> opes;
2362 for (
const auto &o : ope.
opes_) {
2364 opes.emplace_back(std::move(
found_ope));
2366 found_ope = std::make_shared<PrioritizedChoice>(opes);
2369 ope.
ope_->accept(*
this);
2373 ope.
ope_->accept(*
this);
2377 ope.
ope_->accept(*
this);
2390 ope.
ope_->accept(*
this);
2394 ope.
ope_->accept(*
this);
2398 ope.
ope_->accept(*
this);
2402 ope.
ope_->accept(*
this);
2409 ope.
ope_->accept(*
this);
2413 ope.
atom_->accept(*
this);
2417 ope.
ope_->accept(*
this);
2425 const std::vector<std::shared_ptr<Ope>> &
args_;
2436 for (
const auto &op : ope.
opes_) {
2442 result_.chars |= element_fs.chars;
2443 if (element_fs.any_char) {
result_.any_char =
true; }
2445 result_.first_literal = element_fs.first_literal;
2447 if (!
result_.first_rule) {
result_.first_rule = element_fs.first_rule; }
2448 if (!element_fs.can_be_empty) {
return; }
2455 for (
const auto &op : ope.
opes_) {
2463 ope.
ope_->accept(*
this);
2464 if (ope.
min_ == 0) {
result_.can_be_empty =
true; }
2469 for (
const auto &[key, info] : ope.
trie_.
dic_) {
2471 auto ch =
static_cast<unsigned char>(key[0]);
2474 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2475 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2481 if (ope.
lit_.empty()) {
2484 auto ch =
static_cast<unsigned char>(ope.
lit_[0]);
2487 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2488 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2494 for (
const auto &range : ope.
ranges_) {
2495 auto cp1 = range.first;
2496 auto cp2 = range.second;
2497 if (cp1 > 0x7F || cp2 > 0x7F) {
2502 for (
auto cp = cp1; cp <= cp2; cp++) {
2503 auto ch =
static_cast<unsigned char>(cp);
2506 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2507 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2517 if (ope.
ch_ > 0x7F) {
2520 result_.chars.set(
static_cast<unsigned char>(ope.
ch_));
2544 for (
const auto &op : ope.
opes_) {
2549 for (
const auto &op : ope.
opes_) {
2554 ope.
ope_->accept(*
this);
2557 if (cc && cc->is_ascii_only()) { ope.
span_bitset_ = &cc->ascii_bitset(); }
2595 operator std::shared_ptr<Ope>() {
2596 return std::make_shared<WeakHolder>(
holder_);
2605 Log log =
nullptr)
const {
2612 Log log =
nullptr)
const {
2614 return parse(s, n, path, log);
2618 const char *path =
nullptr,
Log log =
nullptr)
const {
2624 Log log =
nullptr)
const {
2626 return parse(s, n, dt, path, log);
2629 template <
typename T>
2631 const char *path =
nullptr,
2632 Log log =
nullptr)
const {
2635 auto r =
parse_core(s, n, vs, dt, path, log);
2636 if (r.ret && !vs.empty() && vs.front().has_value()) {
2637 val = std::any_cast<T>(vs[0]);
2642 template <
typename T>
2644 Log log =
nullptr)
const {
2649 template <
typename T>
2651 const char *path =
nullptr,
2652 Log log =
nullptr)
const {
2654 auto r =
parse_core(s, n, vs, dt, path, log);
2655 if (r.ret && !vs.empty() && vs.front().has_value()) {
2656 val = std::any_cast<T>(vs[0]);
2661 template <
typename T>
2663 const char *path =
nullptr,
2664 Log log =
nullptr)
const {
2669#if defined(__cpp_lib_char8_t)
2670 Result parse(
const char8_t *s,
size_t n,
const char *path =
nullptr,
2671 Log log =
nullptr)
const {
2672 return parse(
reinterpret_cast<const char *
>(s), n, path, log);
2675 Result parse(
const char8_t *s,
const char *path =
nullptr,
2676 Log log =
nullptr)
const {
2677 return parse(
reinterpret_cast<const char *
>(s), path, log);
2680 Result parse(
const char8_t *s,
size_t n, std::any &dt,
2681 const char *path =
nullptr,
Log log =
nullptr)
const {
2682 return parse(
reinterpret_cast<const char *
>(s), n, dt, path, log);
2685 Result parse(
const char8_t *s, std::any &dt,
const char *path =
nullptr,
2686 Log log =
nullptr)
const {
2687 return parse(
reinterpret_cast<const char *
>(s), dt, path, log);
2690 template <
typename T>
2692 const char *path =
nullptr,
2693 Log log =
nullptr)
const {
2698 template <
typename T>
2700 const char *path =
nullptr,
2701 Log log =
nullptr)
const {
2706 template <
typename T>
2708 const char *path =
nullptr,
2709 Log log =
nullptr)
const {
2714 template <
typename T>
2716 const char *path =
nullptr,
2717 Log log =
nullptr)
const {
2747 const char *
s_ =
nullptr;
2748 std::pair<size_t, size_t>
line_ = {1, 1};
2754 std::function<void(
const Context &c,
const char *s,
size_t n, std::any &dt)>
2756 std::function<void(
const Context &c,
const char *s,
size_t n,
size_t matchlen,
2757 std::any &value, std::any &dt)>
2804 const char *path,
Log log)
const {
2807 std::shared_ptr<Ope> ope =
holder_;
2809 std::any trace_data;
2834 auto save_ignore_trace_state = c.ignore_trace_state;
2835 c.ignore_trace_state = !c.verbose_trace;
2837 scope_exit([&]() { c.ignore_trace_state = save_ignore_trace_state; });
2840 if (
fail(len)) {
return Result{
false, c.recovered, i, c.error_info}; }
2845 auto len = ope->parse(s + i, n - i, vs, c, dt);
2851 if (c.error_info.error_pos - c.s < s + i - c.s) {
2852 c.error_info.message_pos = s + i;
2853 c.error_info.message =
"expected end of input";
2859 return Result{ret, c.recovered, i, c.error_info};
2877 Context &c, std::any &dt,
const std::string &
lit,
2878 std::once_flag &init_is_word,
bool &is_word,
2879 bool ignore_case,
const std::string &lower_lit) {
2881 for (; i <
lit.size(); i++) {
2883 (ignore_case ? (
static_cast<char>(std::tolower(
2884 static_cast<unsigned char>(s[i]))) != lower_lit[i])
2885 : (s[i] !=
lit[i]))) {
2887 return static_cast<size_t>(-1);
2898 std::call_once(init_is_word, [&]() {
2900 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
2901 nullptr,
nullptr,
false,
nullptr);
2905 c.
wordOpe->parse(
lit.data(),
lit.size(), dummy_vs, dummy_c, dummy_dt);
2911 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
2912 nullptr,
nullptr,
false,
nullptr);
2916 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
2927 if (
fail(wl)) {
return wl; }
2935 return c_->line_info(
sv_.data());
2945 !unexpected_token.empty()) {
2948 auto unexpected_char = unexpected_token.substr(
2956 log(line.first, line.second, msg,
label);
2965 msg =
"syntax error.";
2967 msg =
"syntax error";
2971 !unexpected_token.empty()) {
2972 msg +=
", unexpected '";
2973 msg += unexpected_token;
2977 auto first_item =
true;
2983 if (!(error_rule && error_rule->name[0] ==
'_')) {
2984 msg += (first_item ?
", expecting " :
", ");
2985 if (error_literal) {
2987 msg += error_literal;
2990 msg +=
"<" + error_rule->name +
">";
2991 if (
label.empty()) {
label = error_rule->name; }
3000 log(line.first, line.second, msg,
label);
3022 const char *error_literal =
nullptr;
3026 error_literal = literal;
3029 auto ope = rule->get_core_operator();
3031 token && token[0] !=
'\0') {
3032 error_literal = token;
3038 if (r->is_token()) {
break; }
3041 if (error_literal || error_rule) {
3070 Context &c, std::any &dt)
const {
3082 std::any &dt)
const {
3084 auto i =
trie_.match(s, n,
id);
3088 return static_cast<size_t>(-1);
3103 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
3104 nullptr,
nullptr,
false,
nullptr);
3108 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
3119 if (
fail(wl)) {
return wl; }
3127 std::any &dt)
const {
3134 std::any &dt)
const {
3144 len =
ope_->parse(s, n, vs, c, dt);
3148 vs.
tokens.emplace_back(std::string_view(s, len));
3151 if (
fail(wl)) {
return wl; }
3158 Context &c, std::any &dt)
const {
3160 throw std::logic_error(
"Uninitialized definition ope was used...");
3166 auto len =
ope_->parse(s, n, vs, c, dt);
3177 auto do_parse = [&]() {
3185 if (
outer_->leave) {
outer_->leave(c, s, n, parse_len, parse_val, dt); }
3189 parse_len =
ope_->parse(s, n, chvs, c, dt);
3193 chvs.sv_ = std::string_view(s, parse_len);
3194 chvs.name_ =
outer_->name;
3196 auto ope_ptr =
ope_.get();
3197 if (ope_ptr->is_token_boundary) {
3200 if (!ope_ptr->is_choice_like) {
3201 chvs.choice_count_ = 0;
3206 std::any predicate_data;
3208 if (!
outer_->predicate(chvs, dt, msg, predicate_data)) {
3214 parse_len =
static_cast<size_t>(-1);
3228 if (c.
log && !
outer_->error_message.empty() &&
3236 return std::make_pair(parse_len, std::move(parse_val));
3239 if (
outer_->is_left_recursive) {
3240 auto lr_key = std::make_pair(
outer_, s);
3243 auto it = c.
lr_memo.find(lr_key);
3245 if (
success(it->second.len)) {
3246 len = it->second.len;
3247 val = it->second.val;
3249 len =
static_cast<size_t>(-1);
3256 c.
lr_memo[lr_key] = {
static_cast<size_t>(-1), {}};
3268 auto [initial_len, initial_val] = do_parse();
3275 if (!cycle_rules.empty()) { cycle_rules.insert(
outer_); }
3279 c.
lr_refs_hit.insert(cycle_rules.begin(), cycle_rules.end());
3283 len =
static_cast<size_t>(-1);
3287 val = std::move(initial_val);
3288 c.
lr_memo[lr_key] = {len, val};
3298 for (
auto memo_it = c.
lr_memo.begin(); memo_it != c.
lr_memo.end();) {
3299 if (memo_it->first.second == s && memo_it->first.first !=
outer_ &&
3300 cycle_rules.count(memo_it->first.first) &&
3302 memo_it = c.
lr_memo.erase(memo_it);
3308 auto [new_len, new_val] = do_parse();
3310 if (!
success(new_len) || new_len <= len) {
3315 val = std::move(new_val);
3316 c.
lr_memo[lr_key] = {len, val};
3329 auto [parse_len, parse_val] = do_parse();
3331 if (success(len)) { a_val = std::move(parse_val); }
3336 auto guard_key = std::make_pair(
outer_, s);
3337 if (c.
lr_memo.count(guard_key)) {
3338 len =
static_cast<size_t>(-1);
3340 c.
lr_memo[guard_key] = {
static_cast<size_t>(-1), {}};
3341 auto [parse_len, parse_val] = do_parse();
3343 val = std::move(parse_val);
3350 if (!outer_->ignoreSemanticValue) {
3351 vs.emplace_back(std::move(val));
3352 vs.tags.emplace_back(
str2tag(outer_->name));
3360 const std::any &predicate_data)
const {
3362 return outer_->action(vs, dt, predicate_data);
3363 }
else if (vs.empty()) {
3366 return std::move(vs.front());
3379 Context &c, std::any &dt)
const {
3389 if (
rule_->is_macro) {
3394 std::vector<std::shared_ptr<Ope>> args;
3395 for (
const auto &arg :
args_) {
3397 args.emplace_back(std::move(vis.
found_ope));
3402 return rule_->holder_->parse(s, n, vs, c, dt);
3405 c.
push_args(std::vector<std::shared_ptr<Ope>>());
3407 return rule_->holder_->parse(s, n, vs, c, dt);
3412 return args[
iarg_]->parse(s, n, vs, c, dt);
3417 return rule_->holder_;
3422 std::any &dt)
const {
3425 if (it->first ==
name_) {
3426 const auto &
lit = it->second;
3427 std::once_flag init_is_word;
3428 auto is_word =
false;
3429 static const std::string empty;
3437 return static_cast<size_t>(-1);
3442 if (
rule_.is_macro) {
3446 auto arg = args[iarg];
3456 size_t min_prec)
const {
3457 auto len =
atom_->parse(s, n, vs, c, dt);
3458 if (
fail(len)) {
return len; }
3462 auto action = std::move(rule.action);
3465 const std::any &predicate_data2) {
3468 return action(vs2, dt2, predicate_data2);
3469 }
else if (!vs2.empty()) {
3474 auto action_se =
scope_exit([&]() { rule.action = std::move(action); });
3478 std::vector<std::any> save_values(vs.begin(), vs.end());
3479 auto save_tokens = vs.
tokens;
3482 auto chlen =
binop_->parse(s + i, n - i, chvs, c, dt);
3485 if (
fail(chlen)) {
break; }
3488 if (it ==
info_.end()) {
break; }
3490 auto level = std::get<0>(it->second);
3491 auto assoc = std::get<1>(it->second);
3493 if (level < min_prec) {
break; }
3495 vs.emplace_back(std::move(chvs[0]));
3498 auto next_min_prec = level;
3499 if (assoc ==
'L') { next_min_prec = level + 1; }
3506 vs.assign(save_values.begin(), save_values.end());
3512 vs.emplace_back(std::move(chvs[0]));
3517 vs.
sv_ = std::string_view(s, i);
3518 static const std::any empty_predicate_data;
3519 val =
rule_.action(vs, dt, empty_predicate_data);
3520 }
else if (!vs.empty()) {
3524 vs.emplace_back(std::move(val));
3532 std::any & )
const {
3533 const auto &rule =
dynamic_cast<Reference &
>(*ope_);
3537 auto label =
dynamic_cast<Reference *
>(rule.args_[0].get());
3538 if (label && !label->rule_->error_message.empty()) {
3546 auto len =
static_cast<size_t>(-1);
3548 auto save_log = c.
log;
3555 len = rule.parse(s, n, dummy_vs, c, dummy_dt);
3604 auto p =
static_cast<void *
>(ope.
outer_);
3605 if (
ids.count(p)) {
return; }
3606 auto id =
ids.size();
3609 ope.
ope_->accept(*
this);
3614 for (
const auto &arg : ope.
args_) {
3622 ope.
atom_->accept(*
this);
3623 ope.
binop_->accept(*
this);
3628 for (
const auto &arg : ope.
args_) {
3639 for (
const auto &arg : ope.
args_) {
3657 resolved->accept(*
this);
3658 if (
done_ ==
false) {
return; }
3666 if (
done_ ==
false) {
return; }
3675 resolved->accept(cbe);
3685inline std::shared_ptr<Ope>
3689 if (iarg >= args.size()) {
return nullptr; }
3690 auto ref =
dynamic_cast<Reference *
>(args[iarg].get());
3691 if (
ref && !
ref->rule_) {
3702 auto save_is_empty =
false;
3703 const char *save_error_s =
nullptr;
3704 std::string save_error_name;
3706 auto it = ope.
opes_.begin();
3707 while (it != ope.
opes_.end()) {
3708 (*it)->accept(*
this);
3711 while (it != ope.
opes_.end()) {
3739 auto it = std::find_if(
refs_.begin(),
refs_.end(),
3740 [&](
const std::pair<const char *, std::string> &
ref) {
3741 return ope.name_ == ref.second;
3743 if (it !=
refs_.end()) {
return; }
3753 auto it = std::find_if(
refs_.begin(),
refs_.end(),
3754 [&](
const std::pair<const char *, std::string> &
ref) {
3755 return ope.name_ == ref.second;
3757 if (it !=
refs_.end()) {
return; }
3772 for (
const auto &arg : ope.
args_) {
3780 if (it !=
params_.end()) {
return; }
3788 if (rule.is_macro) {
3797 for (
const auto &arg : ope.
args_) {
3828 for (
const auto &op : ope.
opes_) {
3839 if (
seq.opes_.size() != 2) {
return; }
3843 if (!not_pred) {
return; }
3846 auto *
ref =
dynamic_cast<Reference *
>(not_pred->ope_.get());
3847 if (!
ref || !
ref->rule_) {
return; }
3851 auto *holder =
dynamic_cast<Holder *
>(
ref->get_core_operator().get());
3852 if (!holder) {
return; }
3854 if (!choice) {
return; }
3857 std::vector<std::string> exact_keywords;
3858 std::vector<std::string> prefix_keywords;
3860 for (
const auto &alt : choice->opes_) {
3863 if (!
lit->ignore_case_) {
return; }
3868 auto *sub_seq =
dynamic_cast<Sequence *
>(alt.get());
3869 if (sub_seq && !sub_seq->opes_.empty()) {
3870 auto *first_lit =
dynamic_cast<LiteralString *
>(sub_seq->opes_[0].get());
3872 auto all_ignore_case_lits =
3873 std::all_of(sub_seq->opes_.begin(), sub_seq->opes_.end(),
3874 [](
const auto &child) {
3875 auto *l = dynamic_cast<LiteralString *>(child.get());
3876 return l && l->ignore_case_;
3878 if (all_ignore_case_lits) {
3879 prefix_keywords.push_back(
to_lower(first_lit->lit_));
3888 if (exact_keywords.empty()) {
return; }
3892 if (!tb) {
return; }
3899 auto *inner_seq =
dynamic_cast<Sequence *
>(tb->ope_.get());
3900 if (inner_seq && inner_seq->opes_.size() == 2) {
3901 first_cc =
dynamic_cast<CharacterClass *
>(inner_seq->opes_[0].get());
3902 auto *
rep =
dynamic_cast<Repetition *
>(inner_seq->opes_[1].get());
3906 if (!first_cc || !rest_cc) {
return; }
3910 auto kw = std::make_unique<KeywordGuardData>();
3915 size_t min_len = SIZE_MAX, max_len = 0;
3916 for (
const auto &k : exact_keywords) {
3917 min_len = std::min(min_len, k.size());
3918 max_len = std::max(max_len, k.size());
3920 for (
const auto &k : prefix_keywords) {
3921 min_len = std::min(min_len, k.size());
3922 max_len = std::max(max_len, k.size());
3924 kw->min_keyword_len = min_len;
3925 kw->max_keyword_len = max_len;
3927 kw->exact_keywords = std::move(exact_keywords);
3928 kw->prefix_keywords = std::move(prefix_keywords);
3929 seq.kw_guard_ = std::move(kw);
3938 if (def_count == 0) {
return; }
3944 std::vector<bool> reachable;
3946 CollectReachableRules(
size_t n) : reachable(n,
false) {}
3948 void visit(
Holder &ope)
override {
3950 if (
id < reachable.size()) { reachable[
id] =
true; }
3951 ope.
ope_->accept(*
this);
3956 reachable[ope.
rule_->
id] =
true;
3963 std::vector<bool> benefits(def_count,
false);
3967 std::vector<bool> &benefits;
3969 std::vector<bool> visited_rules;
3971 FindBacktrackRules(std::vector<bool> &b,
size_t n)
3972 : benefits(b), def_count(n), visited_rules(n,
false) {}
3976 std::vector<std::vector<bool>> alt_reachable;
3977 for (
auto &op : ope.
opes_) {
3978 CollectReachableRules crr(def_count);
3980 alt_reachable.push_back(std::move(crr.reachable));
3984 for (
size_t id = 0;
id < def_count;
id++) {
3986 for (
auto &alt : alt_reachable) {
3987 if (alt[
id]) { count++; }
3989 if (count >= 2) { benefits[
id] =
true; }
3993 for (
auto &op : ope.
opes_) {
3997 void visit(
Holder &ope)
override {
3999 if (
id < visited_rules.size() && !visited_rules[
id]) {
4000 visited_rules[
id] =
true;
4001 ope.
ope_->accept(*
this);
4009 FindBacktrackRules finder(benefits, def_count);
4020 auto found_param =
false;
4021 for (
size_t i = 0; i <
params_.size(); i++) {
4022 const auto ¶m =
params_[i];
4023 if (param == ope.
name_) {
4036 for (
const auto &arg : ope.
args_) {
4042 for (
size_t i = 0; i <
args_.size(); i++) {
4043 const auto &name =
params_[i];
4044 if (name == ope.
name_) {
4056using Rules = std::unordered_map<std::string, std::shared_ptr<Ope>>;
4067 Log log, std::string_view start,
4068 bool enable_left_recursion =
true) {
4070 enable_left_recursion);
4076 std::any dt = &data;
4080 return r.ret && r.len == n;
4083#if defined(__cpp_lib_char8_t)
4084 static bool parse_test(
const char *d,
const char8_t *s) {
4085 return parse_test(d,
reinterpret_cast<const char *
>(s));
4128 : std::runtime_error(what_arg),
r_(r) {}
4133 std::pair<size_t, size_t>
r_;
4138 g[
"Grammar"] <=
seq(
g[
"Spacing"],
oom(
g[
"Definition"]),
g[
"EndOfFile"]);
4140 cho(
seq(
g[
"Ignore"],
g[
"IdentCont"],
g[
"Parameters"],
g[
"LEFTARROW"],
4141 g[
"Expression"],
opt(
g[
"Instruction"])),
4142 seq(
g[
"Ignore"],
g[
"Identifier"],
g[
"LEFTARROW"],
g[
"Expression"],
4143 opt(
g[
"Instruction"])));
4144 g[
"Expression"] <=
seq(
g[
"Sequence"],
zom(
seq(
g[
"SLASH"],
g[
"Sequence"])));
4145 g[
"Sequence"] <=
zom(
cho(
g[
"CUT"],
g[
"Prefix"]));
4146 g[
"Prefix"] <=
seq(
opt(
cho(
g[
"AND"],
g[
"NOT"])),
g[
"SuffixWithLabel"]);
4147 g[
"SuffixWithLabel"] <=
4148 seq(
g[
"Suffix"],
opt(
seq(
g[
"LABEL"],
g[
"Identifier"])));
4149 g[
"Suffix"] <=
seq(
g[
"Primary"],
opt(
g[
"Loop"]));
4150 g[
"Loop"] <=
cho(
g[
"QUESTION"],
g[
"STAR"],
g[
"PLUS"],
g[
"Repetition"]);
4151 g[
"Primary"] <=
cho(
seq(
g[
"Ignore"],
g[
"IdentCont"],
g[
"Arguments"],
4152 npd(
g[
"LEFTARROW"])),
4153 seq(
g[
"Ignore"],
g[
"Identifier"],
4155 seq(
g[
"OPEN"],
g[
"Expression"],
g[
"CLOSE"]),
4156 seq(
g[
"BeginTok"],
g[
"Expression"],
g[
"EndTok"]),
4158 seq(
g[
"BeginCap"],
g[
"Expression"],
g[
"EndCap"]),
4159 g[
"BackRef"],
g[
"DictionaryI"],
g[
"LiteralI"],
4160 g[
"Dictionary"],
g[
"Literal"],
g[
"NegatedClassI"],
4161 g[
"NegatedClass"],
g[
"ClassI"],
g[
"Class"],
g[
"DOT"]);
4163 g[
"Identifier"] <=
seq(
g[
"IdentCont"],
g[
"Spacing"]);
4164 g[
"IdentCont"] <=
tok(
seq(
g[
"IdentStart"],
zom(
g[
"IdentRest"])));
4166 const static std::vector<std::pair<char32_t, char32_t>> range = {
4171 g[
"IdentRest"] <=
cho(
g[
"IdentStart"],
cls(
"0-9"));
4173 g[
"Dictionary"] <=
seq(
g[
"LiteralD"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralD"])));
4176 seq(
g[
"LiteralID"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralID"])));
4179 cls(
"'"),
g[
"Spacing"]),
4181 cls(
"\""),
g[
"Spacing"]));
4182 g[
"Literal"] <= lit_ope;
4183 g[
"LiteralD"] <= lit_ope;
4185 auto lit_case_ignore_ope =
4190 g[
"LiteralI"] <= lit_case_ignore_ope;
4191 g[
"LiteralID"] <= lit_case_ignore_ope;
4201 g[
"NegatedClass"] <=
seq(
lit(
"[^"),
4204 g[
"NegatedClassI"] <=
seq(
lit(
"[^"),
4206 lit(
"]i"),
g[
"Spacing"]);
4220 rep(
cls(
"0-9a-fA-F"), 4, 4)),
4221 rep(
cls(
"0-9a-fA-F"), 4, 5))),
4225 seq(
g[
"BeginBracket"],
g[
"RepetitionRange"],
g[
"EndBracket"]);
4226 g[
"RepetitionRange"] <=
cho(
seq(
g[
"Number"],
g[
"COMMA"],
g[
"Number"]),
4227 seq(
g[
"Number"],
g[
"COMMA"]),
g[
"Number"],
4228 seq(
g[
"COMMA"],
g[
"Number"]));
4229 g[
"Number"] <=
seq(
oom(
cls(
"0-9")),
g[
"Spacing"]);
4231 g[
"CapScope"] <=
seq(
g[
"BeginCapScope"],
g[
"Expression"],
g[
"EndCapScope"]);
4234 ~g[
"SLASH"] <=
seq(
chr(
'/'),
g[
"Spacing"]);
4235 ~g[
"PIPE"] <=
seq(
chr(
'|'),
g[
"Spacing"]);
4236 g[
"AND"] <=
seq(
chr(
'&'),
g[
"Spacing"]);
4237 g[
"NOT"] <=
seq(
chr(
'!'),
g[
"Spacing"]);
4238 g[
"QUESTION"] <=
seq(
chr(
'?'),
g[
"Spacing"]);
4239 g[
"STAR"] <=
seq(
chr(
'*'),
g[
"Spacing"]);
4240 g[
"PLUS"] <=
seq(
chr(
'+'),
g[
"Spacing"]);
4241 ~g[
"OPEN"] <=
seq(
chr(
'('),
g[
"Spacing"]);
4242 ~g[
"CLOSE"] <=
seq(
chr(
')'),
g[
"Spacing"]);
4243 g[
"DOT"] <=
seq(
chr(
'.'),
g[
"Spacing"]);
4248 ~g[
"Spacing"] <=
zom(
cho(
g[
"Space"],
g[
"Comment"]));
4250 opt(
g[
"EndOfLine"]));
4251 g[
"Space"] <=
cho(
chr(
' '),
chr(
'\t'),
g[
"EndOfLine"]);
4255 ~g[
"BeginTok"] <=
seq(
chr(
'<'),
g[
"Spacing"]);
4256 ~g[
"EndTok"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
4258 ~g[
"BeginCapScope"] <=
seq(
chr(
'$'),
chr(
'('),
g[
"Spacing"]);
4259 ~g[
"EndCapScope"] <=
seq(
chr(
')'),
g[
"Spacing"]);
4261 g[
"BeginCap"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
chr(
'<'),
g[
"Spacing"]);
4262 ~g[
"EndCap"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
4264 g[
"BackRef"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
g[
"Spacing"]);
4266 g[
"IGNORE"] <=
chr(
'~');
4268 g[
"Ignore"] <=
opt(
g[
"IGNORE"]);
4269 g[
"Parameters"] <=
seq(
g[
"OPEN"],
g[
"Identifier"],
4270 zom(
seq(
g[
"COMMA"],
g[
"Identifier"])),
g[
"CLOSE"]);
4271 g[
"Arguments"] <=
seq(
g[
"OPEN"],
g[
"Expression"],
4272 zom(
seq(
g[
"COMMA"],
g[
"Expression"])),
g[
"CLOSE"]);
4273 ~g[
"COMMA"] <=
seq(
chr(
','),
g[
"Spacing"]);
4277 seq(
g[
"BeginBracket"],
4278 opt(
seq(
g[
"InstructionItem"],
zom(
seq(
g[
"InstructionItemSeparator"],
4279 g[
"InstructionItem"])))),
4281 g[
"InstructionItem"] <=
4282 cho(
g[
"PrecedenceClimbing"],
g[
"ErrorMessage"],
g[
"NoAstOpt"]);
4283 ~g[
"InstructionItemSeparator"] <=
seq(
chr(
';'),
g[
"Spacing"]);
4285 ~g[
"SpacesZom"] <=
zom(
g[
"Space"]);
4286 ~g[
"SpacesOom"] <=
oom(
g[
"Space"]);
4287 ~g[
"BeginBracket"] <=
seq(
chr(
'{'),
g[
"Spacing"]);
4288 ~g[
"EndBracket"] <=
seq(
chr(
'}'),
g[
"Spacing"]);
4291 g[
"PrecedenceClimbing"] <=
4292 seq(
lit(
"precedence"),
g[
"SpacesOom"],
g[
"PrecedenceInfo"],
4293 zom(
seq(
g[
"SpacesOom"],
g[
"PrecedenceInfo"])),
g[
"SpacesZom"]);
4294 g[
"PrecedenceInfo"] <=
4295 seq(
g[
"PrecedenceAssoc"],
4296 oom(
seq(
ign(
g[
"SpacesOom"]),
g[
"PrecedenceOpe"])));
4297 g[
"PrecedenceOpe"] <=
4306 g[
"PrecedenceAssoc"] <=
cls(
"LR");
4309 g[
"ErrorMessage"] <=
seq(
lit(
"error_message"),
g[
"SpacesOom"],
4310 g[
"LiteralD"],
g[
"SpacesZom"]);
4313 g[
"NoAstOpt"] <=
seq(
lit(
"no_ast_opt"),
g[
"SpacesZom"]);
4317 x.second.name = x.first;
4323 auto &data = *std::any_cast<Data *>(dt);
4325 auto is_macro = vs.
choice() == 0;
4326 auto ignore = std::any_cast<bool>(vs[0]);
4327 auto name = std::any_cast<std::string>(vs[1]);
4329 std::vector<std::string> params;
4330 std::shared_ptr<Ope> ope;
4331 auto has_instructions =
false;
4334 params = std::any_cast<std::vector<std::string>>(vs[2]);
4335 ope = std::any_cast<std::shared_ptr<Ope>>(vs[4]);
4336 if (vs.size() == 6) { has_instructions =
true; }
4338 ope = std::any_cast<std::shared_ptr<Ope>>(vs[3]);
4339 if (vs.size() == 5) { has_instructions =
true; }
4342 if (has_instructions) {
4343 auto index = is_macro ? 5 : 4;
4344 std::unordered_set<std::string> types;
4345 for (
const auto &instruction :
4346 std::any_cast<std::vector<Instruction>>(vs[index])) {
4347 const auto &type = instruction.type;
4348 if (types.find(type) == types.end()) {
4349 data.instructions[name].push_back(instruction);
4350 types.insert(instruction.type);
4351 if (type ==
"declare_symbol" || type ==
"check_symbol") {
4355 data.duplicates_of_instruction.emplace_back(type,
4356 instruction.sv.data());
4361 auto &grammar = *data.grammar;
4362 if (!grammar.count(name)) {
4363 auto &rule = grammar[name];
4366 rule.s_ = vs.
sv().data();
4368 rule.ignoreSemanticValue = ignore;
4369 rule.is_macro = is_macro;
4370 rule.params = params;
4372 if (data.start.empty()) {
4373 data.start = rule.name;
4374 data.start_pos = rule.s_;
4377 data.duplicates_of_definition.emplace_back(name, vs.
sv().data());
4381 g[
"Definition"].enter = [](
const Context & ,
const char * ,
4382 size_t , std::any &dt) {
4383 auto &data = *std::any_cast<Data *>(dt);
4384 data.captures_in_current_definition.clear();
4388 if (vs.size() == 1) {
4389 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4391 std::vector<std::shared_ptr<Ope>> opes;
4392 for (
auto i = 0u; i < vs.size(); i++) {
4393 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(vs[i]));
4395 const std::shared_ptr<Ope> ope =
4396 std::make_shared<PrioritizedChoice>(opes);
4404 }
else if (vs.size() == 1) {
4405 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4407 std::vector<std::shared_ptr<Ope>> opes;
4408 for (
const auto &x : vs) {
4409 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(x));
4411 const std::shared_ptr<Ope> ope = std::make_shared<Sequence>(opes);
4417 std::shared_ptr<Ope> ope;
4418 if (vs.size() == 1) {
4419 ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4421 assert(vs.size() == 2);
4422 auto tok = std::any_cast<char>(vs[0]);
4423 ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
4434 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4435 if (vs.size() == 1) {
4438 assert(vs.size() == 2);
4439 auto &data = *std::any_cast<Data *>(dt);
4440 const auto &ident = std::any_cast<std::string>(vs[1]);
4441 auto label =
ref(*data.grammar, ident, vs.
sv().data(),
false, {});
4443 vs.
sv().data(),
true, {label}));
4451 std::pair<size_t, size_t> range;
4455 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4456 if (vs.size() == 1) {
4459 assert(vs.size() == 2);
4460 auto loop = std::any_cast<Loop>(vs[1]);
4461 switch (loop.type) {
4462 case Loop::Type::opt:
return opt(ope);
4463 case Loop::Type::zom:
return zom(ope);
4464 case Loop::Type::oom:
return oom(ope);
4466 return rep(ope, loop.range.first, loop.range.second);
4474 return Loop{Loop::Type::opt, std::pair<size_t, size_t>()};
4476 return Loop{Loop::Type::zom, std::pair<size_t, size_t>()};
4478 return Loop{Loop::Type::oom, std::pair<size_t, size_t>()};
4480 return Loop{Loop::Type::rep,
4481 std::any_cast<std::pair<size_t, size_t>>(vs[0])};
4486 auto &data = *std::any_cast<Data *>(dt);
4491 auto is_macro = vs.
choice() == 0;
4492 auto ignore = std::any_cast<bool>(vs[0]);
4493 const auto &ident = std::any_cast<std::string>(vs[1]);
4495 std::vector<std::shared_ptr<Ope>> args;
4497 args = std::any_cast<std::vector<std::shared_ptr<Ope>>>(vs[2]);
4500 auto ope =
ref(*data.grammar, ident, vs.
sv().data(), is_macro, args);
4510 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4513 return tok(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
4516 return csc(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
4519 const auto &name = std::any_cast<std::string_view>(vs[0]);
4520 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
4522 data.captures_stack.back().insert(name);
4523 data.captures_in_current_definition.insert(name);
4525 return cap(ope, [name](
const char *a_s,
size_t a_n,
Context &c) {
4530 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4536 return std::string(vs.
sv().data(), vs.
sv().length());
4540 auto items = vs.
transform<std::string>();
4541 return dic(items,
false);
4544 auto items = vs.
transform<std::string>();
4545 return dic(items,
true);
4566 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4570 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4571 return cls(ranges,
true);
4574 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4575 return ncls(ranges);
4578 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4579 return ncls(ranges,
true);
4584 auto s1 = std::any_cast<std::string>(vs[0]);
4585 auto s2 = std::any_cast<std::string>(vs[1]);
4592 return std::pair(cp1, cp2);
4595 auto s = std::any_cast<std::string>(vs[0]);
4597 return std::pair(cp, cp);
4600 return std::pair<char32_t, char32_t>(0, 0);
4609 auto min = std::any_cast<size_t>(vs[0]);
4610 auto max = std::any_cast<size_t>(vs[1]);
4611 return std::pair(min, max);
4614 return std::pair(std::any_cast<size_t>(vs[0]),
4615 std::numeric_limits<size_t>::max());
4617 auto n = std::any_cast<size_t>(vs[0]);
4618 return std::pair(n, n);
4621 return std::pair(std::numeric_limits<size_t>::min(),
4622 std::any_cast<size_t>(vs[0]));
4629 g[
"CapScope"].enter = [](
const Context & ,
const char * ,
4630 size_t , std::any &dt) {
4631 auto &data = *std::any_cast<Data *>(dt);
4632 data.captures_stack.emplace_back();
4634 g[
"CapScope"].leave = [](
const Context & ,
const char * ,
4636 std::any & , std::any &dt) {
4637 auto &data = *std::any_cast<Data *>(dt);
4638 data.captures_stack.pop_back();
4654 auto &data = *std::any_cast<Data *>(dt);
4659 auto it = data.captures_stack.rbegin();
4660 while (it != data.captures_stack.rend()) {
4661 if (it->find(vs.
token()) != it->end()) {
4668 auto ptr = vs.
token().data() - 1;
4669 data.undefined_back_references.emplace_back(vs.
token(), ptr);
4675 if (data.captures_in_current_definition.find(vs.
token()) ==
4676 data.captures_in_current_definition.end()) {
4677 data.enablePackratParsing =
false;
4690 return vs.
transform<std::shared_ptr<Ope>>();
4696 for (
const auto &v : vs) {
4697 auto tokens = std::any_cast<std::vector<std::string_view>>(v);
4698 auto assoc = tokens[0][0];
4699 for (
size_t i = 1; i < tokens.size(); i++) {
4700 binOpeInfo[tokens[i]] = std::pair(level, assoc);
4705 instruction.
type =
"precedence";
4706 instruction.
data = binOpeInfo;
4707 instruction.
sv = vs.sv();
4711 return vs.
transform<std::string_view>();
4718 instruction.
type =
"error_message";
4719 instruction.
data = std::any_cast<std::string>(vs[0]);
4720 instruction.
sv = vs.
sv();
4726 instruction.
type =
"no_ast_opt";
4727 instruction.
sv = vs.
sv();
4738 const char *s,
Log log) {
4741 auto atom =
seq.opes_[0];
4744 auto binop = seq1.
opes_[0];
4745 auto atom1 = seq1.opes_[1];
4751 if (!
rep.is_zom() || atom_name != atom1_name || atom_name == binop_name) {
4754 log(line.first, line.second,
4755 "'precedence' instruction cannot be applied to '" + rule.
name +
4762 rule.
holder_->ope_ =
pre(atom, binop, info, rule);
4767 log(line.first, line.second,
4768 "'precedence' instruction cannot be applied to '" + rule.
name +
4778 Log log, std::string requested_start,
4779 bool enable_left_recursion =
true) {
4781 auto &grammar = *data.
grammar;
4788 rule <=
ref(grammar,
"x",
"",
false, {});
4790 rule.s_ =
"[native]";
4791 rule.ignoreSemanticValue =
true;
4792 rule.is_macro =
true;
4793 rule.params = {
"x"};
4798 std::any dt = &data;
4799 auto r =
g[
"Grammar"].parse(s, n, dt,
nullptr, log);
4803 if (r.error_info.message_pos) {
4804 auto line =
line_info(s, r.error_info.message_pos);
4805 log(line.first, line.second, r.error_info.message,
4806 r.error_info.label);
4808 auto line =
line_info(s, r.error_info.error_pos);
4809 log(line.first, line.second,
"syntax error", r.error_info.label);
4817 log(line.first, line.second, e.what(),
"");
4823 for (
auto [user_name, user_rule] : rules) {
4824 auto name = user_name;
4825 auto ignore =
false;
4826 if (!name.empty() && name[0] ==
'~') {
4830 if (!name.empty()) {
4831 auto &rule = grammar[name];
4834 rule.ignoreSemanticValue = ignore;
4845 log(line.first, line.second,
4846 "the definition '" + name +
"' is already defined.",
"");
4857 log(line.first, line.second,
4858 "the instruction '" + type +
"' is already defined.",
"");
4869 log(line.first, line.second,
4870 "the back reference '" + name +
"' is undefined.",
"");
4877 auto start = data.
start;
4879 if (!requested_start.empty()) {
4880 if (grammar.count(requested_start)) {
4881 start = requested_start;
4885 log(line.first, line.second,
4886 "the specified start rule '" + requested_start +
4894 if (!ret) {
return {}; }
4896 auto &start_rule = grammar[start];
4900 if (start_rule.ignoreSemanticValue) {
4902 auto line =
line_info(s, start_rule.s_);
4903 log(line.first, line.second,
4904 "ignore operator cannot be applied to '" + start_rule.name +
"'.",
4911 if (!ret) {
return {}; }
4914 auto referenced = std::unordered_set<std::string>{
4921 for (
auto &[_, rule] : grammar) {
4925 for (
const auto &[name, ptr] : vis.
error_s) {
4934 for (
auto &[name, rule] : grammar) {
4935 if (!referenced.count(name)) {
4938 auto msg =
"'" + name +
"' is not referenced.";
4939 log(line.first, line.second, msg,
"");
4944 if (!ret) {
return {}; }
4947 for (
auto &x : grammar) {
4948 auto &rule = x.second;
4955 bool changed =
true;
4958 for (
auto &[name, rule] : grammar) {
4961 if (vis.
result != rule.can_be_empty) {
4962 rule.can_be_empty = vis.
result;
4970 if (enable_left_recursion) {
4971 for (
auto &[name, rule] : grammar) {
4974 if (vis.
error_s) { rule.is_left_recursive =
true; }
4979 for (
auto &[name, rule] : grammar) {
4985 log(line.first, line.second,
"'" + name +
"' is left recursive.",
4992 if (!ret) {
return {}; }
5000 for (
auto &x : grammar) {
5001 auto &rule = x.second;
5002 auto ope = rule.get_core_operator();
5007 start_rule.whitespaceOpe =
wsp(rule.get_core_operator());
5015 start_rule.wordOpe = rule.get_core_operator();
5021 for (
const auto &[name, instructions] : data.
instructions) {
5022 auto &rule = grammar[name];
5024 for (
const auto &instruction : instructions) {
5025 if (instruction.type ==
"precedence") {
5027 std::any_cast<PrecedenceClimbing::BinOpeInfo>(instruction.data);
5030 }
else if (instruction.type ==
"error_message") {
5031 rule.error_message = std::any_cast<std::string>(instruction.data);
5032 }
else if (instruction.type ==
"no_ast_opt") {
5033 rule.no_ast_opt =
true;
5039 for (
auto &x : grammar) {
5041 x.second.accept(vis);
5048 const char *s)
const {
5049 std::vector<std::pair<const char *, std::string>> refs;
5050 std::unordered_map<std::string, bool> has_error_cache;
5056 log(line.first, line.second,
5057 "infinite loop is detected in '" + vis.
error_name +
"'.",
"");
5071template <
typename Annotation>
struct AstBase :
public Annotation {
5073 const std::vector<std::shared_ptr<AstBase>> &
nodes,
5120 std::vector<std::shared_ptr<AstBase<Annotation>>>
nodes;
5125 return std::string(
token);
5133template <
typename T>
5135 std::function<std::string(
const T &ast,
int level)> fn) {
5136 const auto &ast = *ptr;
5137 for (
auto i = 0; i < level; i++) {
5140 auto name = ast.original_name;
5141 if (ast.original_choice_count > 0) {
5142 name +=
"/" + std::to_string(ast.original_choice);
5144 if (ast.name != ast.original_name) { name +=
"[" + ast.name +
"]"; }
5146 s +=
"- " + name +
" (";
5150 s +=
"+ " + name +
"\n";
5152 if (fn) { s += fn(ast, level + 1); }
5153 for (
const auto &node : ast.nodes) {
5158template <
typename T>
5161 std::function<std::string(
const T &ast,
int level)> fn =
nullptr) {
5171 template <
typename T>
5172 std::shared_ptr<T>
optimize(std::shared_ptr<T> original,
5173 std::shared_ptr<T> parent =
nullptr) {
5178 if (
opt && original->nodes.size() == 1) {
5179 auto child =
optimize(original->nodes[0], parent);
5180 auto ast = std::make_shared<T>(*child, original->name.data(),
5181 original->position, original->length,
5182 original->choice_count, original->choice);
5183 for (
auto &node : ast->nodes) {
5189 auto ast = std::make_shared<T>(*original);
5190 ast->parent = parent;
5192 for (
const auto &node : original->nodes) {
5194 ast->nodes.push_back(child);
5209 auto line = vs.line_info();
5212 return std::make_shared<T>(
5213 vs.path, line.first, line.second, rule.
name.data(), vs.token(),
5214 std::distance(vs.ss, vs.sv().data()), vs.sv().length(),
5215 vs.choice_count(), vs.choice());
5219 std::make_shared<T>(vs.path, line.first, line.second, rule.
name.data(),
5220 vs.transform<std::shared_ptr<T>>(),
5221 std::distance(vs.ss, vs.sv().data()),
5222 vs.sv().length(), vs.choice_count(), vs.choice());
5224 for (
auto &node : ast->nodes) {
5231#define PEG_EXPAND(...) __VA_ARGS__
5232#define PEG_CONCAT(a, b) a##b
5233#define PEG_CONCAT2(a, b) PEG_CONCAT(a, b)
5236 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, \
5237 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, \
5238 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, \
5239 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, \
5240 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76, \
5241 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, \
5242 a92, a93, a94, a95, a96, a97, a98, a99, a100, ...) \
5245#define PEG_COUNT(...) \
5246 PEG_EXPAND(PEG_PICK( \
5247 __VA_ARGS__, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, \
5248 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, \
5249 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, \
5250 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
5251 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, \
5252 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
5254#define PEG_DEF_1(r) \
5255 peg::Definition r; \
5257 peg::add_ast_action(r);
5259#define PEG_DEF_2(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_1(__VA_ARGS__))
5260#define PEG_DEF_3(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_2(__VA_ARGS__))
5261#define PEG_DEF_4(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_3(__VA_ARGS__))
5262#define PEG_DEF_5(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_4(__VA_ARGS__))
5263#define PEG_DEF_6(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_5(__VA_ARGS__))
5264#define PEG_DEF_7(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_6(__VA_ARGS__))
5265#define PEG_DEF_8(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_7(__VA_ARGS__))
5266#define PEG_DEF_9(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_8(__VA_ARGS__))
5267#define PEG_DEF_10(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_9(__VA_ARGS__))
5268#define PEG_DEF_11(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_10(__VA_ARGS__))
5269#define PEG_DEF_12(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_11(__VA_ARGS__))
5270#define PEG_DEF_13(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_12(__VA_ARGS__))
5271#define PEG_DEF_14(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_13(__VA_ARGS__))
5272#define PEG_DEF_15(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_14(__VA_ARGS__))
5273#define PEG_DEF_16(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_15(__VA_ARGS__))
5274#define PEG_DEF_17(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_16(__VA_ARGS__))
5275#define PEG_DEF_18(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_17(__VA_ARGS__))
5276#define PEG_DEF_19(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_18(__VA_ARGS__))
5277#define PEG_DEF_20(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_19(__VA_ARGS__))
5278#define PEG_DEF_21(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_20(__VA_ARGS__))
5279#define PEG_DEF_22(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_21(__VA_ARGS__))
5280#define PEG_DEF_23(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_22(__VA_ARGS__))
5281#define PEG_DEF_24(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_23(__VA_ARGS__))
5282#define PEG_DEF_25(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_24(__VA_ARGS__))
5283#define PEG_DEF_26(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_25(__VA_ARGS__))
5284#define PEG_DEF_27(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_26(__VA_ARGS__))
5285#define PEG_DEF_28(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_27(__VA_ARGS__))
5286#define PEG_DEF_29(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_28(__VA_ARGS__))
5287#define PEG_DEF_30(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_29(__VA_ARGS__))
5288#define PEG_DEF_31(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_30(__VA_ARGS__))
5289#define PEG_DEF_32(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_31(__VA_ARGS__))
5290#define PEG_DEF_33(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_32(__VA_ARGS__))
5291#define PEG_DEF_34(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_33(__VA_ARGS__))
5292#define PEG_DEF_35(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_34(__VA_ARGS__))
5293#define PEG_DEF_36(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_35(__VA_ARGS__))
5294#define PEG_DEF_37(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_36(__VA_ARGS__))
5295#define PEG_DEF_38(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_37(__VA_ARGS__))
5296#define PEG_DEF_39(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_38(__VA_ARGS__))
5297#define PEG_DEF_40(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_39(__VA_ARGS__))
5298#define PEG_DEF_41(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_40(__VA_ARGS__))
5299#define PEG_DEF_42(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_41(__VA_ARGS__))
5300#define PEG_DEF_43(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_42(__VA_ARGS__))
5301#define PEG_DEF_44(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_43(__VA_ARGS__))
5302#define PEG_DEF_45(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_44(__VA_ARGS__))
5303#define PEG_DEF_46(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_45(__VA_ARGS__))
5304#define PEG_DEF_47(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_46(__VA_ARGS__))
5305#define PEG_DEF_48(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_47(__VA_ARGS__))
5306#define PEG_DEF_49(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_48(__VA_ARGS__))
5307#define PEG_DEF_50(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_49(__VA_ARGS__))
5308#define PEG_DEF_51(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_50(__VA_ARGS__))
5309#define PEG_DEF_52(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_51(__VA_ARGS__))
5310#define PEG_DEF_53(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_52(__VA_ARGS__))
5311#define PEG_DEF_54(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_53(__VA_ARGS__))
5312#define PEG_DEF_55(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_54(__VA_ARGS__))
5313#define PEG_DEF_56(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_55(__VA_ARGS__))
5314#define PEG_DEF_57(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_56(__VA_ARGS__))
5315#define PEG_DEF_58(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_57(__VA_ARGS__))
5316#define PEG_DEF_59(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_58(__VA_ARGS__))
5317#define PEG_DEF_60(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_59(__VA_ARGS__))
5318#define PEG_DEF_61(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_60(__VA_ARGS__))
5319#define PEG_DEF_62(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_61(__VA_ARGS__))
5320#define PEG_DEF_63(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_62(__VA_ARGS__))
5321#define PEG_DEF_64(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_63(__VA_ARGS__))
5322#define PEG_DEF_65(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_64(__VA_ARGS__))
5323#define PEG_DEF_66(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_65(__VA_ARGS__))
5324#define PEG_DEF_67(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_66(__VA_ARGS__))
5325#define PEG_DEF_68(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_67(__VA_ARGS__))
5326#define PEG_DEF_69(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_68(__VA_ARGS__))
5327#define PEG_DEF_70(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_69(__VA_ARGS__))
5328#define PEG_DEF_71(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_70(__VA_ARGS__))
5329#define PEG_DEF_72(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_71(__VA_ARGS__))
5330#define PEG_DEF_73(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_72(__VA_ARGS__))
5331#define PEG_DEF_74(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_73(__VA_ARGS__))
5332#define PEG_DEF_75(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_74(__VA_ARGS__))
5333#define PEG_DEF_76(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_75(__VA_ARGS__))
5334#define PEG_DEF_77(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_76(__VA_ARGS__))
5335#define PEG_DEF_78(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_77(__VA_ARGS__))
5336#define PEG_DEF_79(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_78(__VA_ARGS__))
5337#define PEG_DEF_80(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_79(__VA_ARGS__))
5338#define PEG_DEF_81(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_80(__VA_ARGS__))
5339#define PEG_DEF_82(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_81(__VA_ARGS__))
5340#define PEG_DEF_83(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_82(__VA_ARGS__))
5341#define PEG_DEF_84(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_83(__VA_ARGS__))
5342#define PEG_DEF_85(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_84(__VA_ARGS__))
5343#define PEG_DEF_86(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_85(__VA_ARGS__))
5344#define PEG_DEF_87(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_86(__VA_ARGS__))
5345#define PEG_DEF_88(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_87(__VA_ARGS__))
5346#define PEG_DEF_89(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_88(__VA_ARGS__))
5347#define PEG_DEF_90(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_89(__VA_ARGS__))
5348#define PEG_DEF_91(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_90(__VA_ARGS__))
5349#define PEG_DEF_92(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_91(__VA_ARGS__))
5350#define PEG_DEF_93(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_92(__VA_ARGS__))
5351#define PEG_DEF_94(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_93(__VA_ARGS__))
5352#define PEG_DEF_95(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_94(__VA_ARGS__))
5353#define PEG_DEF_96(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_95(__VA_ARGS__))
5354#define PEG_DEF_97(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_96(__VA_ARGS__))
5355#define PEG_DEF_98(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_97(__VA_ARGS__))
5356#define PEG_DEF_99(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_98(__VA_ARGS__))
5357#define PEG_DEF_100(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_99(__VA_ARGS__))
5359#define AST_DEFINITIONS(...) \
5360 PEG_EXPAND(PEG_CONCAT2(PEG_DEF_, PEG_COUNT(__VA_ARGS__))(__VA_ARGS__))
5371 std::string_view start = {}) {
5375 parser(
const char *s,
size_t n, std::string_view start = {})
5378 parser(std::string_view sv,
const Rules &rules, std::string_view start = {})
5379 :
parser(sv.data(), sv.size(), rules, start) {}
5381 parser(std::string_view sv, std::string_view start = {})
5384#if defined(__cpp_lib_char8_t)
5385 parser(std::u8string_view sv,
const Rules &rules, std::string_view start = {})
5386 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(), rules,
5389 parser(std::u8string_view sv, std::string_view start = {})
5390 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(),
Rules(),
5397 std::string_view start = {}) {
5411 std::string_view start = {}) {
5412 return load_grammar(sv.data(), sv.size(), rules, start);
5419 bool parse_n(
const char *s,
size_t n,
const char *path =
nullptr)
const {
5421 const auto &rule = (*grammar_)[
start_];
5422 auto result = rule.parse(s, n, path,
log_);
5428 bool parse_n(
const char *s,
size_t n, std::any &dt,
5429 const char *path =
nullptr)
const {
5431 const auto &rule = (*grammar_)[
start_];
5432 auto result = rule.parse(s, n, dt, path,
log_);
5438 template <
typename T>
5440 const char *path =
nullptr)
const {
5442 const auto &rule = (*grammar_)[
start_];
5443 auto result = rule.parse_and_get_value(s, n, val, path,
log_);
5449 template <
typename T>
5450 bool parse_n(
const char *s,
size_t n, std::any &dt, T &val,
5451 const char *path =
nullptr)
const {
5453 const auto &rule = (*grammar_)[
start_];
5454 auto result = rule.parse_and_get_value(s, n, dt, val, path,
log_);
5460 bool parse(std::string_view sv,
const char *path =
nullptr)
const {
5461 return parse_n(sv.data(), sv.size(), path);
5464 bool parse(std::string_view sv, std::any &dt,
5465 const char *path =
nullptr)
const {
5466 return parse_n(sv.data(), sv.size(), dt, path);
5469 template <
typename T>
5470 bool parse(std::string_view sv, T &val,
const char *path =
nullptr)
const {
5471 return parse_n(sv.data(), sv.size(), val, path);
5474 template <
typename T>
5475 bool parse(std::string_view sv, std::any &dt, T &val,
5476 const char *path =
nullptr)
const {
5477 return parse_n(sv.data(), sv.size(), dt, val, path);
5480#if defined(__cpp_lib_char8_t)
5481 bool parse(std::u8string_view sv,
const char *path =
nullptr)
const {
5482 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), path);
5485 bool parse(std::u8string_view sv, std::any &dt,
5486 const char *path =
nullptr)
const {
5487 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
5491 template <
typename T>
5492 bool parse(std::u8string_view sv, T &val,
const char *path =
nullptr)
const {
5493 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), val,
5497 template <
typename T>
5498 bool parse(std::u8string_view sv, std::any &dt, T &val,
5499 const char *path =
nullptr)
const {
5500 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
5513 auto &rule = (*grammar_)[
start_];
5514 rule.eoi_check =
false;
5524 auto &rule = (*grammar_)[
start_];
5531 auto &rule = (*grammar_)[
start_];
5532 rule.tracer_enter = tracer_enter;
5533 rule.tracer_leave = tracer_leave;
5541 auto &rule = (*grammar_)[
start_];
5542 rule.tracer_enter = tracer_enter;
5543 rule.tracer_leave = tracer_leave;
5544 rule.tracer_start = tracer_start;
5545 rule.tracer_end = tracer_end;
5551 auto &rule = (*grammar_)[
start_];
5552 rule.verbose_trace = verbose_trace;
5557 for (
auto &[_, rule] : *
grammar_) {
5563 template <
typename T>
5565 bool opt_mode =
true)
const {
5572 std::function<
void(
size_t line,
size_t col,
const std::string &msg)>
5574 log_ = [log](
size_t line,
size_t col,
const std::string &msg,
5575 const std::string & ) { log(line, col, msg); };
5585 std::vector<std::string> rules;
5586 for (
auto &[name, rule] : *
grammar_) {
5587 if (rule.no_ast_opt) { rules.push_back(name); }
5605 [&](
auto &ope,
auto s,
auto,
auto &,
auto &c,
auto &,
auto &trace_data) {
5606 auto prev_pos = std::any_cast<size_t>(trace_data);
5607 auto pos =
static_cast<size_t>(s - c.s);
5608 auto backtrack = (pos < prev_pos ?
"*" :
"");
5610 auto level = c.trace_ids.size() - 1;
5621 os <<
"E " << pos + 1 << backtrack <<
"\t" << indent <<
"┌" << name
5622 <<
" #" << c.trace_ids.back() << std::endl;
5623 trace_data =
static_cast<size_t>(pos);
5625 [&](
auto &ope,
auto s,
auto,
auto &sv,
auto &c,
auto &,
auto len,
5627 auto pos =
static_cast<size_t>(s - c.s);
5628 if (len !=
static_cast<size_t>(-1)) { pos += len; }
5630 auto level = c.trace_ids.size() - 1;
5634 auto ret = len !=
static_cast<size_t>(-1) ?
"└o " :
"└x ";
5636 std::stringstream choice;
5637 if (sv.choice_count() > 0) {
5638 choice <<
" " << sv.choice() <<
"/" << sv.choice_count();
5641 if (!sv.tokens.empty()) {
5642 token +=
", token '";
5643 token += sv.tokens[0];
5646 std::string matched;
5651 os <<
"L " << pos + 1 <<
"\t" << indent << ret << name <<
" #"
5652 << c.trace_ids.back() << choice.str() << token << matched
5655 [&](
auto &trace_data) { trace_data =
static_cast<size_t>(0); },
5670 std::vector<Item> items;
5671 std::map<std::string, size_t> index;
5673 std::chrono::steady_clock::time_point start;
5677 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &, std::any &trace_data) {
5678 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
5679 auto &stats = *std::any_cast<Stats *>(trace_data);
5681 auto &name = holder->name();
5682 if (stats.index.find(name) == stats.index.end()) {
5683 stats.index[name] = stats.index.size();
5684 stats.items.push_back({name, 0, 0});
5689 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &,
auto len,
5690 std::any &trace_data) {
5691 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
5692 auto &stats = *std::any_cast<Stats *>(trace_data);
5694 auto &name = holder->name();
5695 auto index = stats.index[name];
5696 auto &stat = stats.items[index];
5697 if (len !=
static_cast<size_t>(-1)) {
5704 auto end = std::chrono::steady_clock::now();
5705 auto nano = std::chrono::duration_cast<std::chrono::microseconds>(
5708 auto sec = nano / 1000000.0;
5709 os <<
"duration: " << sec <<
"s (" << nano <<
"µs)" << std::endl
5713 size_t total_success = 0;
5714 size_t total_fail = 0;
5720 os <<
" id total % success fail "
5724 auto grand_total = total_success + total_fail;
5725 snprintf(buff, BUFSIZ,
"%4s %10zu %5s %10zu %10zu %s",
"",
5726 grand_total,
"", total_success, total_fail,
5728 os << buff << std::endl;
5730 snprintf(buff, BUFSIZ,
"%4s %10s %5s %10.2f %10.2f %s",
"",
"",
5731 "", total_success * 100.0 / grand_total,
5732 total_fail * 100.0 / grand_total,
"% success/fail");
5733 os << buff << std::endl << std::endl;
5739 auto ratio = total * 100.0 / stats.total;
5740 snprintf(buff, BUFSIZ,
"%4zu %10zu %5.2f %10zu %10zu %s",
id,
5742 os << buff << std::endl;
5748 [&](
auto &trace_data) {
5749 auto stats =
new Stats{};
5750 stats->start = std::chrono::steady_clock::now();
5753 [&](
auto &trace_data) {
5754 auto stats = std::any_cast<Stats *>(trace_data);
void operator=(F fn)
Definition peglib.h:646
Action(Action &&rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:660
std::function< std::any(SemanticValues &vs, std::any &dt, const std::any &predicate_data)> Fty
Definition peglib.h:657
std::any operator()(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:651
Fty fn_
Definition peglib.h:676
Action(F fn)
Definition peglib.h:645
Action & operator=(const Action &rhs)=default
AndPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1376
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1378
std::shared_ptr< Ope > ope_
Definition peglib.h:1392
void accept(Visitor &v) override
Definition peglib.h:3582
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1588
void accept(Visitor &v) override
Definition peglib.h:3588
std::string name_
Definition peglib.h:1779
BackReference(const std::string &name)
Definition peglib.h:1772
BackReference(std::string &&name)
Definition peglib.h:1770
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3420
void accept(Visitor &v) override
Definition peglib.h:3598
void accept(Visitor &v) override
Definition peglib.h:3589
CaptureScope(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1603
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1605
std::shared_ptr< Ope > ope_
Definition peglib.h:1615
MatchAction match_action_
Definition peglib.h:1635
std::function< void(const char *s, size_t n, Context &c)> MatchAction
Definition peglib.h:1620
std::shared_ptr< Ope > ope_
Definition peglib.h:1634
void accept(Visitor &v) override
Definition peglib.h:3590
Capture(const std::shared_ptr< Ope > &ope, MatchAction ma)
Definition peglib.h:1622
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1625
bool negated_
Definition peglib.h:1553
bool ignore_case_
Definition peglib.h:1554
std::vector< std::pair< char32_t, char32_t > > ranges_
Definition peglib.h:1552
CharacterClass(const std::string &s, bool negated, bool ignore_case)
Definition peglib.h:1460
void setup_ascii_bitset()
Definition peglib.h:1534
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1487
bool in_range(const std::pair< char32_t, char32_t > &range, char32_t cp) const
Definition peglib.h:1524
CharacterClass(const std::vector< std::pair< char32_t, char32_t > > &ranges, bool negated, bool ignore_case)
Definition peglib.h:1480
bool is_ascii_only_
Definition peglib.h:1556
bool is_ascii_only() const
Definition peglib.h:1520
friend struct ComputeFirstSet
Definition peglib.h:1518
const std::bitset< 256 > & ascii_bitset() const
Definition peglib.h:1521
void accept(Visitor &v) override
Definition peglib.h:3586
std::bitset< 256 > ascii_bitset_
Definition peglib.h:1555
Character(char32_t ch)
Definition peglib.h:1561
char32_t ch_
Definition peglib.h:1582
void accept(Visitor &v) override
Definition peglib.h:3587
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1563
size_t in_token_boundary_count
Definition peglib.h:825
std::vector< Definition * > rule_stack
Definition peglib.h:822
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:3054
std::vector< std::pair< std::string_view, std::string > > capture_entries
Definition peglib.h:832
std::once_flag source_line_index_init_
Definition peglib.h:1073
std::shared_ptr< Ope > wordOpe
Definition peglib.h:830
std::set< std::pair< const Definition *, const char * > > lr_active_seeds
Definition peglib.h:857
void trace_enter(const Ope &ope, const char *a_s, size_t n, const SemanticValues &vs, std::any &dt)
Definition peglib.h:3048
TracerEnter tracer_enter
Definition peglib.h:882
std::vector< bool > cut_stack
Definition peglib.h:834
size_t skip_whitespace(const char *a_s, size_t n, SemanticValues &vs, std::any &dt)
Definition peglib.h:3005
const std::vector< std::shared_ptr< Ope > > & top_args() const
Definition peglib.h:1004
std::vector< bool > cache_success
Definition peglib.h:839
std::set< const Definition * > lr_refs_hit
Definition peglib.h:853
Context operator=(const Context &)=delete
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:827
void clear_packrat_cache(const char *pos, size_t def_id)
Definition peglib.h:859
std::map< std::pair< size_t, size_t >, std::tuple< size_t, std::any > > cache_values
Definition peglib.h:842
const size_t def_count
Definition peglib.h:836
std::map< std::pair< const Definition *, const char * >, LRMemo > lr_memo
Definition peglib.h:849
Context(Context &&)=delete
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)
Definition peglib.h:889
const bool verbose_trace
Definition peglib.h:885
Log log
Definition peglib.h:887
std::vector< PackratStats > * packrat_stats
Definition peglib.h:918
const char * s
Definition peglib.h:813
size_t next_trace_id
Definition peglib.h:1070
SemanticValues & push_semantic_values_scope()
Definition peglib.h:973
void pop_semantic_values_scope()
Definition peglib.h:995
bool is_traceable(const Ope &ope) const
Definition peglib.h:3061
const char * path
Definition peglib.h:812
std::any trace_data
Definition peglib.h:884
TracerLeave tracer_leave
Definition peglib.h:883
Snapshot snapshot(const SemanticValues &vs) const
Definition peglib.h:1019
std::vector< size_t > trace_ids
Definition peglib.h:1071
void write_packrat_cache(const char *pos, size_t def_id, size_t len, const std::any &val)
Definition peglib.h:870
size_t value_stack_size
Definition peglib.h:820
const size_t l
Definition peglib.h:814
void push_args(std::vector< std::shared_ptr< Ope > > &&args)
Definition peglib.h:998
void pop_args()
Definition peglib.h:1002
ErrorInfo error_info
Definition peglib.h:816
std::vector< bool > cache_registered
Definition peglib.h:838
bool in_whitespace
Definition peglib.h:828
std::pair< size_t, size_t > line_info(const char *cur) const
Definition peglib.h:1051
std::vector< size_t > source_line_index
Definition peglib.h:1074
bool recovered
Definition peglib.h:817
std::vector< std::shared_ptr< SemanticValues > > value_stack
Definition peglib.h:819
~Context()
Definition peglib.h:904
void packrat(const char *a_s, size_t def_id, size_t &len, std::any &val, T fn)
Definition peglib.h:926
const bool enablePackratParsing
Definition peglib.h:837
void rollback(SemanticValues &vs, const Snapshot &snap)
Definition peglib.h:1024
Context(const Context &)=delete
void set_error_pos(const char *a_s, const char *literal=nullptr)
Definition peglib.h:3014
bool ignore_trace_state
Definition peglib.h:1072
const std::vector< bool > * packrat_rule_filter
Definition peglib.h:923
std::vector< std::vector< std::shared_ptr< Ope > > > args_stack
Definition peglib.h:823
void accept(Visitor &v) override
Definition peglib.h:3601
size_t parse_core(const char *, size_t, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1824
std::shared_ptr< Ope > wordOpe
Definition peglib.h:2761
bool is_macro
Definition peglib.h:2763
bool ignoreSemanticValue
Definition peglib.h:2759
bool eoi_check
Definition peglib.h:2778
Predicate predicate
Definition peglib.h:2750
Definition & operator<=(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2599
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:2758
void initialize_packrat_filter() const
Definition peglib.h:3935
Definition()
Definition peglib.h:2584
Result parse(const char *s, std::any &dt, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2623
bool is_left_recursive
Definition peglib.h:2766
bool disable_action
Definition peglib.h:2765
TracerEnter tracer_enter
Definition peglib.h:2769
std::vector< std::string > params
Definition peglib.h:2764
std::once_flag packrat_filter_init_
Definition peglib.h:2868
Definition & operator~()
Definition peglib.h:2730
Result parse(const char *s, size_t n, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2604
bool enablePackratParsing
Definition peglib.h:2762
std::pair< size_t, size_t > line_
Definition peglib.h:2748
friend class ParserGenerator
Definition peglib.h:2786
std::vector< bool > packrat_filter_
Definition peglib.h:2869
std::once_flag is_token_init_
Definition peglib.h:2863
TracerStartOrEnd tracer_end
Definition peglib.h:2773
std::vector< Context::PackratStats > packrat_stats_
Definition peglib.h:2782
std::once_flag definition_ids_init_
Definition peglib.h:2866
bool collect_packrat_stats
Definition peglib.h:2781
bool no_ast_opt
Definition peglib.h:2776
Definition & operator,(T fn)
Definition peglib.h:2725
friend class Reference
Definition peglib.h:2785
void operator=(Action a)
Definition peglib.h:2723
Result parse_and_get_value(const char *s, size_t n, std::any &dt, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2650
Result parse(const char *s, size_t n, std::any &dt, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2617
std::unordered_map< void *, size_t > definition_ids_
Definition peglib.h:2867
Result parse_and_get_value(const char *s, size_t n, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2630
std::once_flag assign_id_to_definition_init_
Definition peglib.h:2865
TracerLeave tracer_leave
Definition peglib.h:2770
size_t id
Definition peglib.h:2752
bool can_be_empty
Definition peglib.h:2767
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:2760
bool is_token() const
Definition peglib.h:2739
Result parse_and_get_value(const char *s, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2643
Definition & operator=(Definition &&rhs)
bool is_token_
Definition peglib.h:2864
Definition(const Definition &rhs)
Definition peglib.h:2586
Result parse_core(const char *s, size_t n, SemanticValues &vs, std::any &dt, const char *path, Log log) const
Definition peglib.h:2803
Definition & operator=(const Definition &rhs)
void accept(Ope::Visitor &v)
Definition peglib.h:2735
bool verbose_trace
Definition peglib.h:2771
std::string name
Definition peglib.h:2746
std::shared_ptr< Holder > holder_
Definition peglib.h:2862
std::string error_message
Definition peglib.h:2775
std::function< void(const Context &c, const char *s, size_t n, std::any &dt)> enter
Definition peglib.h:2755
Result parse_and_get_value(const char *s, std::any &dt, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2662
TracerStartOrEnd tracer_start
Definition peglib.h:2772
Action action
Definition peglib.h:2753
Result parse(const char *s, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2611
void initialize_definition_ids() const
Definition peglib.h:2791
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:2737
Definition(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2590
const char * s_
Definition peglib.h:2747
Dictionary(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:1419
void accept(Visitor &v) override
Definition peglib.h:3584
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3080
Trie trie_
Definition peglib.h:1429
Holder(Definition *outer)
Definition peglib.h:1703
const std::string & name() const
Definition peglib.h:3370
Definition * outer_
Definition peglib.h:1717
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3157
const std::string & trace_name() const
Definition peglib.h:3372
void accept(Visitor &v) override
Definition peglib.h:3595
std::string trace_name_
Definition peglib.h:1719
friend class Definition
Definition peglib.h:1721
std::once_flag trace_name_init_
Definition peglib.h:1718
std::any reduce(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:3359
std::shared_ptr< Ope > ope_
Definition peglib.h:1716
void accept(Visitor &v) override
Definition peglib.h:3592
Ignore(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1654
std::shared_ptr< Ope > ope_
Definition peglib.h:1665
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &dt) const override
Definition peglib.h:1656
void accept(Visitor &v) override
Definition peglib.h:3585
bool ignore_case_
Definition peglib.h:1451
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3125
std::string lower_lit_
Definition peglib.h:1452
std::string lit_
Definition peglib.h:1450
LiteralString(std::string &&s, bool ignore_case)
Definition peglib.h:1435
std::once_flag init_is_word_
Definition peglib.h:1453
bool is_word_
Definition peglib.h:1454
LiteralString(const std::string &s, bool ignore_case)
Definition peglib.h:1440
std::shared_ptr< Ope > ope_
Definition peglib.h:1414
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1399
NotPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1397
void accept(Visitor &v) override
Definition peglib.h:3583
bool is_choice_like
Definition peglib.h:1092
bool is_token_boundary
Definition peglib.h:1091
size_t parse(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:3069
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
std::pair< size_t, size_t > r_
Definition peglib.h:4133
std::pair< size_t, size_t > line_info() const
Definition peglib.h:4130
SyntaxErrorException(const char *what_arg, std::pair< size_t, size_t > r)
Definition peglib.h:4127
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:4777
bool apply_precedence_instruction(Definition &rule, const PrecedenceClimbing::BinOpeInfo &info, const char *s, Log log)
Definition peglib.h:4736
void make_grammar()
Definition peglib.h:4136
Grammar g
Definition peglib.h:5064
ParserGenerator()
Definition peglib.h:4095
static bool parse_test(const char *d, const char *s)
Definition peglib.h:4074
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:4066
bool detect_infiniteLoop(const Data &data, Definition &rule, const Log &log, const char *s) const
Definition peglib.h:5047
static ParserGenerator & get_instance()
Definition peglib.h:4090
void setup_actions()
Definition peglib.h:4321
std::shared_ptr< Ope > atom_
Definition peglib.h:1798
std::map< std::string_view, std::pair< size_t, char > > BinOpeInfo
Definition peglib.h:1784
PrecedenceClimbing(const std::shared_ptr< Ope > &atom, const std::shared_ptr< Ope > &binop, const BinOpeInfo &info, const Definition &rule)
Definition peglib.h:1786
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1791
const Definition & rule_
Definition peglib.h:1801
std::shared_ptr< Ope > binop_
Definition peglib.h:1799
Definition & get_reference_for_binop(Context &c) const
Definition peglib.h:3441
BinOpeInfo info_
Definition peglib.h:1800
void accept(Visitor &v) override
Definition peglib.h:3599
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:3453
bool operator()(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data) const
Definition peglib.h:689
Predicate & operator=(const Predicate &rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:698
std::function< bool(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data)> Fty
Definition peglib.h:695
Fty fn_
Definition peglib.h:710
Predicate(Predicate &&rhs)=default
Predicate(F fn)
Definition peglib.h:683
void operator=(F fn)
Definition peglib.h:684
PrioritizedChoice(bool for_label, const Args &...args)
Definition peglib.h:1213
size_t size() const
Definition peglib.h:1287
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1227
void accept(Visitor &v) override
Definition peglib.h:3580
bool for_label_
Definition peglib.h:1290
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1289
PrioritizedChoice(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1218
std::vector< FirstSet > first_sets_
Definition peglib.h:1291
PrioritizedChoice(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1222
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3530
void accept(Visitor &v) override
Definition peglib.h:3600
Recovery(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1812
std::shared_ptr< Ope > ope_
Definition peglib.h:1819
const std::string name_
Definition peglib.h:1741
Definition * rule_
Definition peglib.h:1747
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:3416
const char * s_
Definition peglib.h:1742
void accept(Visitor &v) override
Definition peglib.h:3596
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3378
const bool is_macro_
Definition peglib.h:1744
const std::vector< std::shared_ptr< Ope > > args_
Definition peglib.h:1745
size_t iarg_
Definition peglib.h:1748
const Grammar & grammar_
Definition peglib.h:1740
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:1728
static std::shared_ptr< Repetition > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1353
static std::shared_ptr< Repetition > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1363
bool is_zom() const
Definition peglib.h:1349
const std::bitset< 256 > * span_bitset_
Definition peglib.h:1370
Repetition(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:1296
std::shared_ptr< Ope > ope_
Definition peglib.h:1367
size_t max_
Definition peglib.h:1369
void accept(Visitor &v) override
Definition peglib.h:3581
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1299
size_t min_
Definition peglib.h:1368
static std::shared_ptr< Repetition > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1358
Sequence(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1118
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1120
std::unique_ptr< KeywordGuardData > kw_guard_
Definition peglib.h:1145
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1141
std::optional< size_t > parse_keyword_guarded(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:1148
void accept(Visitor &v) override
Definition peglib.h:3579
Sequence(const Args &...args)
Definition peglib.h:1115
Sequence(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1117
friend struct SetupFirstSets
Definition peglib.h:1144
void accept(Visitor &v) override
Definition peglib.h:3591
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3132
std::shared_ptr< Ope > ope_
Definition peglib.h:1649
TokenBoundary(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1640
size_t max_len_
Definition peglib.h:464
std::map< std::string, Info, std::less<> > dic_
Definition peglib.h:460
size_t match(const char *text, size_t text_len, size_t &id) const
Definition peglib.h:418
friend struct ComputeFirstSet
Definition peglib.h:449
Trie(const std::vector< std::string > &items, bool ignore_case)
Definition peglib.h:396
size_t size() const
Definition peglib.h:446
bool ignore_case_
Definition peglib.h:462
size_t items_count_
Definition peglib.h:463
size_t items_count() const
Definition peglib.h:447
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn_
Definition peglib.h:1682
void accept(Visitor &v) override
Definition peglib.h:3593
User(Parser fn)
Definition peglib.h:1673
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &, std::any &dt) const override
Definition peglib.h:1674
WeakHolder(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1687
void accept(Visitor &v) override
Definition peglib.h:3594
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1689
std::weak_ptr< Ope > weak_
Definition peglib.h:1698
std::shared_ptr< Ope > ope_
Definition peglib.h:1765
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1755
void accept(Visitor &v) override
Definition peglib.h:3597
Whitespace(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1753
parser(const char *s, size_t n, std::string_view start={})
Definition peglib.h:5375
Log log_
Definition peglib.h:5596
bool enablePackratParsing_
Definition peglib.h:5595
parser(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:5370
bool parse_n(const char *s, size_t n, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:5450
std::string start_
Definition peglib.h:5593
const Grammar & get_grammar() const
Definition peglib.h:5509
std::shared_ptr< Grammar > grammar_
Definition peglib.h:5592
bool parse_n(const char *s, size_t n, std::any &dt, const char *path=nullptr) const
Definition peglib.h:5428
void set_logger(Log log)
Definition peglib.h:5569
bool enableLeftRecursion_
Definition peglib.h:5594
bool load_grammar(std::string_view sv, std::string_view start={})
Definition peglib.h:5415
void enable_packrat_parsing()
Definition peglib.h:5522
parser & enable_ast()
Definition peglib.h:5556
parser(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:5378
void disable_eoi_check()
Definition peglib.h:5511
bool load_grammar(const char *s, size_t n, std::string_view start={})
Definition peglib.h:5406
std::shared_ptr< T > optimize_ast(std::shared_ptr< T > ast, bool opt_mode=true) const
Definition peglib.h:5564
void set_verbose_trace(bool verbose_trace)
Definition peglib.h:5549
void enable_left_recursion(bool enable=true)
Definition peglib.h:5518
const Definition & operator[](const char *s) const
Definition peglib.h:5507
bool parse_n(const char *s, size_t n, T &val, const char *path=nullptr) const
Definition peglib.h:5439
bool parse(std::string_view sv, std::any &dt, const char *path=nullptr) const
Definition peglib.h:5464
parser(std::string_view sv, std::string_view start={})
Definition peglib.h:5381
void set_logger(std::function< void(size_t line, size_t col, const std::string &msg)> log)
Definition peglib.h:5571
bool load_grammar(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:5396
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave)
Definition peglib.h:5529
bool parse(std::string_view sv, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:5475
bool post_process(const char *s, size_t n, Definition::Result &r) const
Definition peglib.h:5579
std::vector< std::string > get_no_ast_opt_rules() const
Definition peglib.h:5584
bool load_grammar(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:5410
bool parse(std::string_view sv, T &val, const char *path=nullptr) const
Definition peglib.h:5470
Definition & operator[](const char *s)
Definition peglib.h:5505
bool parse_n(const char *s, size_t n, const char *path=nullptr) const
Definition peglib.h:5419
bool parse(std::string_view sv, const char *path=nullptr) const
Definition peglib.h:5460
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave, TracerStartOrEnd tracer_start, TracerStartOrEnd tracer_end)
Definition peglib.h:5537
Definition filter_string.h:27
std::string escape_characters(const char *s, size_t n)
Definition peglib.h:221
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:2876
static const char * WORD_DEFINITION_NAME
Definition peglib.h:2569
const char * u8(const T *s)
Definition peglib.h:213
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:1938
size_t encode_codepoint(char32_t cp, char *buff)
Definition peglib.h:114
std::shared_ptr< Ope > cut()
Definition peglib.h:1963
std::shared_ptr< Ope > tok(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1923
std::shared_ptr< Ope > csc(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1914
bool decode_codepoint(const char *s8, size_t l, size_t &bytes, char32_t &cp)
Definition peglib.h:151
size_t codepoint_count(const char *s8, size_t l)
Definition peglib.h:100
std::shared_ptr< Ope > apd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1867
std::pair< int, size_t > parse_octal_number(const char *s, size_t n, size_t i)
Definition peglib.h:278
std::u32string decode(const char *s8, size_t l)
Definition peglib.h:200
std::pair< size_t, size_t > line_info(const char *start, const char *cur)
Definition peglib.h:474
std::shared_ptr< Ope > rec(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1959
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> Parser
Definition peglib.h:1668
std::shared_ptr< Ope > cls(const std::string &s)
Definition peglib.h:1888
std::shared_ptr< Ope > wsp(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1944
bool fail(size_t len)
Definition peglib.h:718
T token_to_number_(std::string_view sv)
Definition peglib.h:367
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:1952
bool is_digit(char c, int &v)
Definition peglib.h:259
std::shared_ptr< Ope > dic(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:1875
std::shared_ptr< Ope > liti(std::string &&s)
Definition peglib.h:1884
std::shared_ptr< Ope > ign(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1927
std::unordered_map< std::string, Definition > Grammar
Definition peglib.h:1724
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:804
size_t codepoint_length(const char *s8, size_t l)
Definition peglib.h:84
static const char * WHITESPACE_DEFINITION_NAME
Definition peglib.h:2568
std::string resolve_escape_sequence(const char *s, size_t n)
Definition peglib.h:289
std::shared_ptr< Ope > lit(std::string &&s)
Definition peglib.h:1880
std::shared_ptr< Ope > cho4label_(Args &&...args)
Definition peglib.h:1845
std::shared_ptr< Ope > dot()
Definition peglib.h:1912
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:800
std::unordered_map< std::string, std::shared_ptr< Ope > > Rules
Definition peglib.h:4056
void enable_profiling(parser &parser, std::ostream &os)
Definition peglib.h:5663
std::shared_ptr< Ope > chr(char32_t dt)
Definition peglib.h:1908
bool is_hex(char c, int &v)
Definition peglib.h:245
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:5160
std::function< void(size_t line, size_t col, const std::string &msg, const std::string &rule)> Log
Definition peglib.h:723
std::shared_ptr< Ope > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1858
std::function< void(std::any &trace_data)> TracerStartOrEnd
Definition peglib.h:808
std::shared_ptr< Ope > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1854
std::shared_ptr< Ope > cho(Args &&...args)
Definition peglib.h:1840
std::shared_ptr< Ope > rep(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:1862
constexpr unsigned int str2tag_core(const char *s, size_t l, unsigned int h)
Definition peglib.h:495
std::shared_ptr< Ope > npd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1871
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:5134
constexpr unsigned int str2tag(std::string_view sv)
Definition peglib.h:502
std::shared_ptr< Ope > seq(Args &&...args)
Definition peglib.h:1836
bool success(size_t len)
Definition peglib.h:716
std::shared_ptr< Ope > ncls(const std::string &s)
Definition peglib.h:1898
std::pair< int, size_t > parse_hex_number(const char *s, size_t n, size_t i)
Definition peglib.h:267
std::shared_ptr< Ope > cap(const std::shared_ptr< Ope > &ope, Capture::MatchAction ma)
Definition peglib.h:1918
void add_ast_action(Definition &rule)
Definition peglib.h:5207
AstBase< EmptyType > Ast
Definition filter_string.h:30
static const char * RECOVER_DEFINITION_NAME
Definition peglib.h:2570
std::any call(F fn, Args &&...args)
Definition peglib.h:616
std::shared_ptr< Ope > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1850
std::shared_ptr< Ope > bkr(std::string &&name)
Definition peglib.h:1948
std::shared_ptr< Ope > usr(std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn)
Definition peglib.h:1932
std::string to_lower(std::string s)
Definition peglib.h:383
void enable_tracing(parser &parser, std::ostream &os)
Definition peglib.h:5603
#define CPPPEGLIB_HEURISTIC_ERROR_TOKEN_MAX_CHAR_COUNT
Definition peglib.h:15
Definition clipboard_testing.h:11
void visit(Holder &ope) override
Definition peglib.h:3603
std::unordered_map< void *, size_t > ids
Definition peglib.h:2065
const size_t column
Definition peglib.h:5104
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:5091
std::weak_ptr< AstBase< EmptyType > > parent
Definition peglib.h:5121
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)
Definition peglib.h:5082
const std::string name
Definition peglib.h:5106
T token_to_number() const
Definition peglib.h:5128
const bool is_token
Definition peglib.h:5117
const size_t line
Definition peglib.h:5103
size_t length
Definition peglib.h:5108
const unsigned int original_tag
Definition peglib.h:5115
const size_t choice
Definition peglib.h:5110
size_t position
Definition peglib.h:5107
const size_t original_choice_count
Definition peglib.h:5112
const std::string_view token
Definition peglib.h:5118
std::vector< std::shared_ptr< AstBase< EmptyType > > > nodes
Definition peglib.h:5120
const size_t choice_count
Definition peglib.h:5109
const size_t original_choice
Definition peglib.h:5113
const std::string path
Definition peglib.h:5102
std::string token_to_string() const
Definition peglib.h:5123
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)
Definition peglib.h:5072
const unsigned int tag
Definition peglib.h:5114
const std::string original_name
Definition peglib.h:5111
const bool mode_
Definition peglib.h:5200
const std::vector< std::string > rules_
Definition peglib.h:5201
std::shared_ptr< T > optimize(std::shared_ptr< T > original, std::shared_ptr< T > parent=nullptr)
Definition peglib.h:5172
AstOptimizer(bool mode, const std::vector< std::string > &rules={})
Definition peglib.h:5168
void visit(Repetition &ope) override
Definition peglib.h:2209
void visit(BackReference &) override
Definition peglib.h:2219
void visit(Cut &) override
Definition peglib.h:2220
void visit(LiteralString &ope) override
Definition peglib.h:2213
void visit(NotPredicate &) override
Definition peglib.h:2211
bool result
Definition peglib.h:2193
void visit(Dictionary &) override
Definition peglib.h:2212
void visit(User &) override
Definition peglib.h:2217
void visit(Character &) override
Definition peglib.h:2215
void visit(AndPredicate &) override
Definition peglib.h:2210
void visit(Sequence &ope) override
Definition peglib.h:2195
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2202
void visit(AnyCharacter &) override
Definition peglib.h:2216
void visit(CharacterClass &) override
Definition peglib.h:2214
void visit(User &) override
Definition peglib.h:2524
void visit(BackReference &) override
Definition peglib.h:2526
void visit(AndPredicate &) override
Definition peglib.h:2466
void visit(NotPredicate &) override
Definition peglib.h:2467
void visit(Cut &) override
Definition peglib.h:2527
void visit(LiteralString &ope) override
Definition peglib.h:2480
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2453
void visit(Repetition &ope) override
Definition peglib.h:2462
std::unordered_set< std::string > refs_
Definition peglib.h:2532
void visit(Dictionary &ope) override
Definition peglib.h:2468
void visit(AnyCharacter &) override
Definition peglib.h:2523
void visit(CharacterClass &ope) override
Definition peglib.h:2493
FirstSet result_
Definition peglib.h:2529
void visit(Character &ope) override
Definition peglib.h:2516
void visit(Sequence &ope) override
Definition peglib.h:2435
std::any val
Definition peglib.h:847
size_t len
Definition peglib.h:846
size_t misses
Definition peglib.h:916
size_t hits
Definition peglib.h:915
std::string_view sv_sv
Definition peglib.h:1013
size_t sv_tags_size
Definition peglib.h:1011
size_t sv_tokens_size
Definition peglib.h:1012
size_t capture_size
Definition peglib.h:1016
size_t choice
Definition peglib.h:1015
size_t choice_count
Definition peglib.h:1014
size_t sv_size
Definition peglib.h:1010
bool ret
Definition peglib.h:2578
size_t len
Definition peglib.h:2580
ErrorInfo error_info
Definition peglib.h:2581
bool recovered
Definition peglib.h:2579
void visit(Repetition &ope) override
Definition peglib.h:2290
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2284
DetectInfiniteLoop(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2274
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2311
void visit(Sequence &ope) override
Definition peglib.h:2278
bool has_error
Definition peglib.h:2305
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2310
const char * error_s
Definition peglib.h:2306
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:2267
std::string error_name
Definition peglib.h:2307
bool done_
Definition peglib.h:2186
void visit(AnyCharacter &) override
Definition peglib.h:2173
void visit(Sequence &ope) override
Definition peglib.h:2137
void visit(AndPredicate &ope) override
Definition peglib.h:2161
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2148
void visit(BackReference &) override
Definition peglib.h:2176
const char * error_s
Definition peglib.h:2179
void visit(Repetition &ope) override
Definition peglib.h:2157
std::unordered_set< std::string > refs_
Definition peglib.h:2185
void visit(Cut &) override
Definition peglib.h:2177
void visit(Character &) override
Definition peglib.h:2172
std::string name_
Definition peglib.h:2184
void visit(LiteralString &ope) override
Definition peglib.h:2170
void visit(CharacterClass &) override
Definition peglib.h:2171
DetectLeftRecursion(const std::string &name)
Definition peglib.h:2135
void visit(Dictionary &) override
Definition peglib.h:2169
void visit(NotPredicate &ope) override
Definition peglib.h:2165
std::vector< const std::vector< std::shared_ptr< Ope > > * > macro_args_stack_
Definition peglib.h:2187
void visit(User &) override
Definition peglib.h:2174
std::shared_ptr< Ope > resolve_macro_arg(size_t iarg) const
Definition peglib.h:3686
std::vector< std::pair< const char *, const Definition * > > expected_tokens
Definition peglib.h:733
std::string replace_all(std::string str, const std::string &from, const std::string &to) const
Definition peglib.h:784
void clear()
Definition peglib.h:740
const char * message_pos
Definition peglib.h:734
int cast_char(char c) const
Definition peglib.h:757
std::string heuristic_error_token(const char *s, size_t n, const char *pos) const
Definition peglib.h:759
const char * last_output_pos
Definition peglib.h:737
void output_log(const Log &log, const char *s, size_t n)
Definition peglib.h:2938
bool keep_previous_token
Definition peglib.h:738
void add(const char *error_literal, const Definition *error_rule)
Definition peglib.h:747
std::string message
Definition peglib.h:735
std::string label
Definition peglib.h:736
const char * error_pos
Definition peglib.h:732
void visit(LiteralString &ope) override
Definition peglib.h:2116
static const char * token(Ope &ope)
Definition peglib.h:2122
void visit(TokenBoundary &ope) override
Definition peglib.h:2117
const char * token_
Definition peglib.h:2129
void visit(Ignore &ope) override
Definition peglib.h:2118
void visit(Recovery &ope) override
Definition peglib.h:2120
const std::vector< std::string > & params_
Definition peglib.h:2426
void visit(Repetition &ope) override
Definition peglib.h:2368
void visit(WeakHolder &ope) override
Definition peglib.h:2405
void visit(Character &ope) override
Definition peglib.h:2387
void visit(CharacterClass &ope) override
Definition peglib.h:2384
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2360
void visit(Ignore &ope) override
Definition peglib.h:2401
void visit(Cut &ope) override
Definition peglib.h:2420
void visit(AnyCharacter &ope) override
Definition peglib.h:2388
void visit(LiteralString &ope) override
Definition peglib.h:2381
void visit(Recovery &ope) override
Definition peglib.h:2416
void visit(Holder &ope) override
Definition peglib.h:2406
const std::vector< std::shared_ptr< Ope > > & args_
Definition peglib.h:2425
void visit(Dictionary &ope) override
Definition peglib.h:2380
void visit(Whitespace &ope) override
Definition peglib.h:2408
void visit(TokenBoundary &ope) override
Definition peglib.h:2397
std::shared_ptr< Ope > found_ope
Definition peglib.h:2422
void visit(NotPredicate &ope) override
Definition peglib.h:2376
FindReference(const std::vector< std::shared_ptr< Ope > > &args, const std::vector< std::string > ¶ms)
Definition peglib.h:2348
void visit(Sequence &ope) override
Definition peglib.h:2352
void visit(AndPredicate &ope) override
Definition peglib.h:2372
void visit(Capture &ope) override
Definition peglib.h:2393
void visit(CaptureScope &ope) override
Definition peglib.h:2389
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2412
const char * first_literal
Definition peglib.h:1198
void merge(const FirstSet &other)
Definition peglib.h:1202
bool any_char
Definition peglib.h:1197
std::bitset< 256 > chars
Definition peglib.h:1195
bool can_be_empty
Definition peglib.h:1196
const Definition * first_rule
Definition peglib.h:1199
std::string error_name
Definition peglib.h:2253
void visit(Sequence &ope) override
Definition peglib.h:3701
bool is_empty
Definition peglib.h:2251
void visit(Repetition &ope) override
Definition peglib.h:2237
const char * error_s
Definition peglib.h:2252
void visit(NotPredicate &) override
Definition peglib.h:2245
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2260
void visit(LiteralString &ope) override
Definition peglib.h:2246
void visit(AndPredicate &) override
Definition peglib.h:2244
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2261
void set_error()
Definition peglib.h:2256
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2231
HasEmptyElement(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2226
void visit(Dictionary &) override
Definition peglib.h:2078
void visit(LiteralString &) override
Definition peglib.h:2079
bool result_
Definition peglib.h:2088
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2071
static bool check(Ope &ope)
Definition peglib.h:2081
std::bitset< 256 > identifier_rest
Definition peglib.h:1099
std::bitset< 256 > identifier_first
Definition peglib.h:1098
size_t max_keyword_len
Definition peglib.h:1103
size_t min_keyword_len
Definition peglib.h:1102
std::vector< std::string > exact_keywords
Definition peglib.h:1100
std::vector< std::string > prefix_keywords
Definition peglib.h:1101
static bool matches_any(const std::vector< std::string > &keywords, std::string_view input)
Definition peglib.h:1105
const std::vector< std::string > & params_
Definition peglib.h:2342
Grammar & grammar_
Definition peglib.h:2341
void visit(Reference &ope) override
Definition peglib.h:4018
LinkReferences(Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2335
virtual void visit(WeakHolder &)
Definition peglib.h:1985
virtual void visit(TokenBoundary &)
Definition peglib.h:1982
virtual void visit(Repetition &)
Definition peglib.h:1972
virtual void visit(Dictionary &)
Definition peglib.h:1975
virtual void visit(Character &)
Definition peglib.h:1978
virtual ~Visitor()
Definition peglib.h:1969
virtual void visit(AndPredicate &)
Definition peglib.h:1973
virtual void visit(LiteralString &)
Definition peglib.h:1976
virtual void visit(Reference &)
Definition peglib.h:1987
virtual void visit(CharacterClass &)
Definition peglib.h:1977
virtual void visit(PrioritizedChoice &)
Definition peglib.h:1971
virtual void visit(Ignore &)
Definition peglib.h:1983
virtual void visit(PrecedenceClimbing &)
Definition peglib.h:1990
virtual void visit(CaptureScope &)
Definition peglib.h:1980
virtual void visit(Sequence &)
Definition peglib.h:1970
virtual void visit(Holder &)
Definition peglib.h:1986
virtual void visit(Capture &)
Definition peglib.h:1981
virtual void visit(NotPredicate &)
Definition peglib.h:1974
virtual void visit(BackReference &)
Definition peglib.h:1989
virtual void visit(Cut &)
Definition peglib.h:1992
virtual void visit(AnyCharacter &)
Definition peglib.h:1979
virtual void visit(Whitespace &)
Definition peglib.h:1988
virtual void visit(Recovery &)
Definition peglib.h:1991
virtual void visit(User &)
Definition peglib.h:1984
Data()
Definition peglib.h:4122
std::vector< std::pair< std::string, const char * > > duplicates_of_definition
Definition peglib.h:4111
bool enablePackratParsing
Definition peglib.h:4120
std::map< std::string, std::vector< Instruction > > instructions
Definition peglib.h:4114
std::string start
Definition peglib.h:4108
std::vector< std::pair< std::string, const char * > > duplicates_of_instruction
Definition peglib.h:4113
const char * start_pos
Definition peglib.h:4109
std::set< std::string_view > captures_in_current_definition
Definition peglib.h:4119
std::vector< std::pair< std::string, const char * > > undefined_back_references
Definition peglib.h:4116
std::shared_ptr< Grammar > grammar
Definition peglib.h:4107
std::vector< std::set< std::string_view > > captures_stack
Definition peglib.h:4117
std::any data
Definition peglib.h:4102
std::string type
Definition peglib.h:4101
std::string_view sv
Definition peglib.h:4103
std::shared_ptr< Grammar > grammar
Definition peglib.h:4061
bool enablePackratParsing
Definition peglib.h:4063
std::string start
Definition peglib.h:4062
std::unordered_set< std::string > referenced
Definition peglib.h:2325
std::unordered_map< std::string, const char * > error_s
Definition peglib.h:2323
const std::vector< std::string > & params_
Definition peglib.h:2329
std::unordered_map< std::string, std::string > error_message
Definition peglib.h:2324
ReferenceChecker(const Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2317
const Grammar & grammar_
Definition peglib.h:2328
void visit(Reference &ope) override
Definition peglib.h:3778
std::pair< size_t, size_t > line_info() const
Definition peglib.h:2933
std::string token_to_string(size_t id=0) const
Definition peglib.h:554
std::vector< std::string_view > tokens
Definition peglib.h:545
size_t choice_
Definition peglib.h:609
Context * c_
Definition peglib.h:606
std::string name_
Definition peglib.h:610
friend class Holder
Definition peglib.h:603
friend class Sequence
Definition peglib.h:600
std::string_view token(size_t id=0) const
Definition peglib.h:547
std::string_view sv() const
Definition peglib.h:528
std::string_view sv_
Definition peglib.h:607
size_t choice() const
Definition peglib.h:542
T token_to_number() const
Definition peglib.h:558
const char * ss
Definition peglib.h:525
size_t choice_count_
Definition peglib.h:608
friend class Dictionary
Definition peglib.h:599
size_t choice_count() const
Definition peglib.h:539
std::vector< T > transform(size_t beg=0, size_t end=static_cast< size_t >(-1)) const
Definition peglib.h:564
const char * path
Definition peglib.h:524
std::vector< unsigned int > tags
Definition peglib.h:533
const std::string & name() const
Definition peglib.h:531
friend class Repetition
Definition peglib.h:602
friend class PrecedenceClimbing
Definition peglib.h:604
SemanticValues(Context *c)
Definition peglib.h:521
friend class Context
Definition peglib.h:598
friend class PrioritizedChoice
Definition peglib.h:601
void setup_keyword_guarded_identifier(Sequence &ope)
Definition peglib.h:3833
void visit(Repetition &ope) override
Definition peglib.h:2553
void visit(Sequence &ope) override
Definition peglib.h:3825
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2541
std::unordered_set< std::string > refs_
Definition peglib.h:2562
bool has_rule_
Definition peglib.h:2110
bool has_token_boundary_
Definition peglib.h:2109
void visit(TokenBoundary &) override
Definition peglib.h:2094
void visit(WeakHolder &) override
Definition peglib.h:2097
void visit(NotPredicate &) override
Definition peglib.h:2096
void visit(AndPredicate &) override
Definition peglib.h:2095
static bool is_token(Ope &ope)
Definition peglib.h:2100
void visit(Recovery &) override
Definition peglib.h:2045
void visit(Cut &) override
Definition peglib.h:2046
void visit(Holder &ope) override
Definition peglib.h:2040
void visit(User &) override
Definition peglib.h:2038
void visit(NotPredicate &) override
Definition peglib.h:2028
void visit(TokenBoundary &) override
Definition peglib.h:2036
void visit(LiteralString &) override
Definition peglib.h:2030
void visit(AnyCharacter &) override
Definition peglib.h:2033
void visit(Whitespace &) override
Definition peglib.h:2042
void visit(WeakHolder &) override
Definition peglib.h:2039
void visit(Repetition &) override
Definition peglib.h:2026
void visit(Character &) override
Definition peglib.h:2032
void visit(CharacterClass &) override
Definition peglib.h:2031
void visit(Reference &) override
Definition peglib.h:2041
static std::string get(Ope &ope)
Definition peglib.h:2048
const char * name_
Definition peglib.h:2055
void visit(Capture &) override
Definition peglib.h:2035
void visit(CaptureScope &) override
Definition peglib.h:2034
void visit(PrecedenceClimbing &) override
Definition peglib.h:2044
void visit(Sequence &) override
Definition peglib.h:2024
void visit(PrioritizedChoice &) override
Definition peglib.h:2025
void visit(Ignore &) override
Definition peglib.h:2037
void visit(AndPredicate &) override
Definition peglib.h:2027
void visit(BackReference &) override
Definition peglib.h:2043
void visit(Dictionary &) override
Definition peglib.h:2029
void visit(TokenBoundary &ope) override
Definition peglib.h:2012
void visit(Recovery &ope) override
Definition peglib.h:2017
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2002
void visit(Capture &ope) override
Definition peglib.h:2011
void visit(Whitespace &ope) override
Definition peglib.h:2016
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2018
void visit(Repetition &ope) override
Definition peglib.h:2007
void visit(CaptureScope &ope) override
Definition peglib.h:2010
void visit(AndPredicate &ope) override
Definition peglib.h:2008
void visit(Sequence &ope) override
Definition peglib.h:1997
void visit(WeakHolder &ope) override
Definition peglib.h:2014
void visit(NotPredicate &ope) override
Definition peglib.h:2009
void visit(Ignore &ope) override
Definition peglib.h:2013
void visit(Holder &ope) override
Definition peglib.h:2015
bool match
Definition peglib.h:454
size_t id
Definition peglib.h:455
bool done
Definition peglib.h:453
bool execute_on_destruction
Definition peglib.h:77
scope_exit(scope_exit &&rhs)
Definition peglib.h:59
EF exit_function
Definition peglib.h:76
~scope_exit()
Definition peglib.h:65
scope_exit(EF &&f)
Definition peglib.h:56
scope_exit(const scope_exit &)=delete
void operator=(const scope_exit &)=delete
scope_exit & operator=(scope_exit &&)=delete
void release()
Definition peglib.h:69