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>
43#if !defined(__cplusplus) || __cplusplus < 201703L
44#error "Requires complete C++17 support"
87 auto b =
static_cast<uint8_t
>(s8[0]);
88 if ((b & 0x80) == 0) {
90 }
else if ((b & 0xE0) == 0xC0 && l >= 2) {
92 }
else if ((b & 0xF0) == 0xE0 && l >= 3) {
94 }
else if ((b & 0xF8) == 0xF0 && l >= 4) {
103 for (
size_t i = 0; i < l;) {
117 buff[0] =
static_cast<char>(cp & 0x7F);
119 }
else if (cp < 0x0800) {
120 buff[0] =
static_cast<char>(0xC0 | ((cp >> 6) & 0x1F));
121 buff[1] =
static_cast<char>(0x80 | (cp & 0x3F));
123 }
else if (cp < 0xD800) {
124 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
125 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
126 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
128 }
else if (cp < 0xE000) {
131 }
else if (cp < 0x10000) {
132 buff[0] =
static_cast<char>(0xE0 | ((cp >> 12) & 0xF));
133 buff[1] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
134 buff[2] =
static_cast<char>(0x80 | (cp & 0x3F));
136 }
else if (cp < 0x110000) {
137 buff[0] =
static_cast<char>(0xF0 | ((cp >> 18) & 0x7));
138 buff[1] =
static_cast<char>(0x80 | ((cp >> 12) & 0x3F));
139 buff[2] =
static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
140 buff[3] =
static_cast<char>(0x80 | (cp & 0x3F));
149 return std::string(buff, l);
155 auto b =
static_cast<uint8_t
>(s8[0]);
156 if ((b & 0x80) == 0) {
160 }
else if ((b & 0xE0) == 0xC0) {
163 cp = ((
static_cast<char32_t>(s8[0] & 0x1F)) << 6) |
164 (
static_cast<char32_t>(s8[1] & 0x3F));
167 }
else if ((b & 0xF0) == 0xE0) {
170 cp = ((
static_cast<char32_t>(s8[0] & 0x0F)) << 12) |
171 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 6) |
172 (
static_cast<char32_t>(s8[2] & 0x3F));
175 }
else if ((b & 0xF8) == 0xF0) {
178 cp = ((
static_cast<char32_t>(s8[0] & 0x07)) << 18) |
179 ((
static_cast<char32_t>(s8[1] & 0x3F)) << 12) |
180 ((
static_cast<char32_t>(s8[2] & 0x3F)) << 6) |
181 (
static_cast<char32_t>(s8[3] & 0x3F));
201inline std::u32string
decode(
const char *s8,
size_t l) {
206 while (i < l && (s8[i] & 0xc0) == 0x80) {
214template <
typename T>
const char *
u8(
const T *s) {
215 return reinterpret_cast<const char *
>(s);
224 for (
size_t i = 0; i < n; i++) {
227 case '\f': str +=
"\\f";
break;
228 case '\n': str +=
"\\n";
break;
229 case '\r': str +=
"\\r";
break;
230 case '\t': str +=
"\\t";
break;
231 case '\v': str +=
"\\v";
break;
232 default: str += c;
break;
247 if (
'0' <= c && c <=
'9') {
250 }
else if (
'a' <= c && c <=
'f') {
253 }
else if (
'A' <= c && c <=
'F') {
261 if (
'0' <= c && c <=
'9') {
272 while (i < n &&
is_hex(s[i], val)) {
273 ret =
static_cast<int>(ret * 16 + val);
276 return std::pair(ret, i);
283 while (i < n &&
is_digit(s[i], val)) {
284 ret =
static_cast<int>(ret * 8 + val);
287 return std::pair(ret, i);
370#if __has_include(<charconv>)
371 if constexpr (!std::is_floating_point<T>::value) {
372 std::from_chars(sv.data(), sv.data() + sv.size(), n);
374 if constexpr (
false) {
377 auto s = std::string(sv);
378 std::istringstream ss(s);
386 c =
static_cast<char>(std::tolower(
static_cast<unsigned char>(c)));
397 Trie(
const std::vector<std::string> &items,
bool ignore_case)
400 for (
const auto &item : items) {
401 const auto &s = ignore_case ?
to_lower(item) : item;
403 for (
size_t len = 1; len <= item.size(); len++) {
404 auto last = len == item.size();
405 std::string_view sv(s.data(), len);
406 auto it =
dic_.find(sv);
407 if (it ==
dic_.end()) {
408 dic_.emplace(sv,
Info{last, last,
id});
410 it->second.match =
true;
412 it->second.done =
false;
419 size_t match(
const char *text,
size_t text_len,
size_t &
id)
const {
420 auto limit = std::min(text_len,
max_len_);
421 std::string lower_text;
423 lower_text =
to_lower(std::string(text, limit));
424 text = lower_text.data();
427 size_t match_len = 0;
430 while (!done && len <= limit) {
431 std::string_view sv(text, len);
432 auto it =
dic_.find(sv);
433 if (it ==
dic_.end()) {
436 if (it->second.match) {
440 if (it->second.done) { done =
true; }
461 std::map<std::string, Info, std::less<>>
dic_;
475inline std::pair<size_t, size_t>
line_info(
const char *start,
const char *cur) {
490 return std::pair(no, col);
500 (h * 33) ^
static_cast<unsigned char>(*s));
503inline constexpr unsigned int str2tag(std::string_view sv) {
509inline constexpr unsigned int operator"" _(
const char *s,
size_t l) {
526 const char *
ss =
nullptr;
529 std::string_view
sv()
const {
return sv_; }
534 std::vector<unsigned int>
tags;
537 std::pair<size_t, size_t>
line_info()
const;
548 std::string_view
token(
size_t id = 0)
const {
550 assert(
id <
tokens.size());
556 return std::string(
token(
id));
564 template <
typename T>
566 size_t end =
static_cast<size_t>(-1))
const {
568 end = (std::min)(end, size());
569 for (
size_t i = beg; i < end; i++) {
570 r.emplace_back(std::any_cast<T>((*
this)[i]));
575 using std::vector<std::any>::iterator;
576 using std::vector<std::any>::const_iterator;
577 using std::vector<std::any>::size;
578 using std::vector<std::any>::empty;
579 using std::vector<std::any>::assign;
580 using std::vector<std::any>::begin;
581 using std::vector<std::any>::end;
582 using std::vector<std::any>::rbegin;
583 using std::vector<std::any>::rend;
584 using std::vector<std::any>::operator[];
585 using std::vector<std::any>::at;
586 using std::vector<std::any>::resize;
587 using std::vector<std::any>::front;
588 using std::vector<std::any>::back;
589 using std::vector<std::any>::push_back;
590 using std::vector<std::any>::pop_back;
591 using std::vector<std::any>::insert;
592 using std::vector<std::any>::erase;
593 using std::vector<std::any>::clear;
594 using std::vector<std::any>::swap;
595 using std::vector<std::any>::emplace;
596 using std::vector<std::any>::emplace_back;
617template <
typename F,
typename... Args> std::any
call(F fn, Args &&...args) {
618 using R =
decltype(fn(std::forward<Args>(args)...));
619 if constexpr (std::is_void<R>::value) {
620 fn(std::forward<Args>(args)...);
622 }
else if constexpr (std::is_same<typename std::remove_cv<R>::type,
624 return fn(std::forward<Args>(args)...);
626 return std::any(fn(std::forward<Args>(args)...));
632template <
typename R,
typename... Args>
634 : std::integral_constant<unsigned,
sizeof...(Args)> {};
635template <
typename R,
typename C,
typename... Args>
637 : std::integral_constant<unsigned, sizeof...(Args)> {};
638template <
typename R,
typename C,
typename... Args>
640 : std::integral_constant<unsigned, sizeof...(Args)> {};
650 operator bool()
const {
return bool(
fn_); }
653 const std::any &predicate_data)
const {
654 return fn_(vs, dt, predicate_data);
659 const std::any &predicate_data)>;
663 return [fn](
auto &vs,
auto & ,
const auto & ) {
667 return [fn](
auto &vs,
auto &dt,
const auto & ) {
668 return call(fn, vs, dt);
671 return [fn](
auto &vs,
auto &dt,
const auto &predicate_data) {
672 return call(fn, vs, dt, predicate_data);
688 operator bool()
const {
return bool(
fn_); }
691 std::string &msg, std::any &predicate_data)
const {
692 return fn_(vs, dt, msg, predicate_data);
697 std::string &msg, std::any &predicate_data)>;
701 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
702 auto & ) {
return fn(vs, dt, msg); };
704 return [fn](
const auto &vs,
const auto &dt,
auto &msg,
705 auto &predicate_data) {
706 return fn(vs, dt, msg, predicate_data);
717inline bool success(
size_t len) {
return len !=
static_cast<size_t>(-1); }
719inline bool fail(
size_t len) {
return len ==
static_cast<size_t>(-1); }
724using Log = std::function<void(
size_t line,
size_t col,
const std::string &msg,
725 const std::string &rule)>;
750 if (t == error_literal && r == error_rule) {
return; }
758 int cast_char(
char c)
const {
return static_cast<unsigned char>(c); }
761 const char *pos)
const {
762 auto len = n - std::distance(s, pos);
766 if (!std::ispunct(c) && !std::isspace(c)) {
767 while (i < len && !std::ispunct(
cast_char(pos[i])) &&
775 while (count > 0 && j < i) {
782 return std::string();
786 const std::string &to)
const {
788 while ((pos = str.find(from, pos)) != std::string::npos) {
789 str.replace(pos, from.length(), to);
803 const Context &c,
const std::any &dt, std::any &trace_data)>;
807 const Context &c,
const std::any &dt,
size_t, std::any &trace_data)>;
842 std::map<std::pair<size_t, size_t>, std::tuple<size_t, std::any>>
847 size_t len =
static_cast<size_t>(-1);
862 auto col =
static_cast<size_t>(pos -
s);
872 const std::any &val) {
875 auto idx =
def_count *
static_cast<size_t>(col) + def_id;
879 auto key = std::pair(col, def_id);
926 template <
typename T>
927 void packrat(
const char *a_s,
size_t def_id,
size_t &len, std::any &val,
935 auto idx =
def_count *
static_cast<size_t>(col) + def_id;
939 (*packrat_stats)[def_id].hits++;
942 auto key = std::pair(col, def_id);
946 len =
static_cast<size_t>(-1);
955 (*packrat_stats)[def_id].misses++;
977 value_stack.emplace_back(std::make_shared<SemanticValues>(
this));
982 if (!vs.tags.empty()) { vs.tags.clear(); }
984 vs.sv_ = std::string_view();
985 vs.choice_count_ = 0;
987 if (!vs.tokens.empty()) { vs.tokens.clear(); }
999 void push_args(std::vector<std::shared_ptr<Ope>> &&args) {
1005 const std::vector<std::shared_ptr<Ope>> &
top_args()
const {
1021 return {vs.size(), vs.
tags.size(), vs.
tokens.size(), vs.
sv_,
1042 void set_error_pos(
const char *a_s,
const char *literal =
nullptr);
1052 std::pair<size_t, size_t>
line_info(
const char *cur)
const {
1054 for (
size_t pos = 0; pos <
l; pos++) {
1060 auto pos =
static_cast<size_t>(std::distance(
s, cur));
1062 auto it = std::lower_bound(
1064 [](
size_t element,
size_t value) { return element < value; });
1068 return std::pair(
id + 1, off + 1);
1087 std::any &dt)
const;
1089 Context &c, std::any &dt)
const = 0;
1107 std::string_view input) {
1108 return std::any_of(keywords.begin(), keywords.end(),
1109 [&](
const auto &kw) { return kw == input; });
1115 template <
typename... Args>
1117 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...} {}
1122 std::any &dt)
const override {
1132 for (
const auto &ope :
opes_) {
1133 auto len = ope->parse(s + i, n - i, vs, c, dt);
1134 if (
fail(len)) {
return len; }
1140 void accept(Visitor &v)
override;
1142 std::vector<std::shared_ptr<Ope>>
opes_;
1151 std::any &dt)
const {
1153 if (n < 1 || !kw.identifier_first.test(
static_cast<unsigned char>(*s))) {
1155 return static_cast<size_t>(-1);
1159 while (id_len < n &&
1160 kw.identifier_rest.test(
static_cast<unsigned char>(s[id_len]))) {
1164 if (id_len >= kw.min_keyword_len && id_len <= kw.max_keyword_len) {
1166 std::unique_ptr<char[]> lower_heap;
1167 char *lower = lower_buf;
1168 if (id_len >
sizeof(lower_buf)) {
1169 lower_heap.reset(
new char[id_len]);
1170 lower = lower_heap.get();
1172 std::transform(s, s + id_len, lower, [](
unsigned char ch) {
1173 return static_cast<char>(std::tolower(ch));
1175 std::string_view lower_sv(lower, id_len);
1179 return static_cast<size_t>(-1);
1182 return std::nullopt;
1186 vs.
tokens.emplace_back(std::string_view(s, id_len));
1188 if (
fail(wl)) {
return wl; }
1213 template <
typename... Args>
1215 :
opes_{static_cast<std::shared_ptr<
Ope>>(args)...},
1224 :
opes_(std::move(opes)) {
1229 std::any &dt)
const override {
1230 size_t len =
static_cast<size_t>(-1);
1238 for (
const auto &ope :
opes_) {
1242 if (!fs.any_char && !fs.can_be_empty &&
1243 !fs.chars.test(
static_cast<unsigned char>(*s))) {
1244 if (c.
log && (fs.first_literal || fs.first_rule)) {
1250 if (fs.first_literal) {
1267 len = ope->parse(s, n, vs, c, dt);
1286 void accept(Visitor &v)
override;
1290 std::vector<std::shared_ptr<Ope>>
opes_;
1297 Repetition(
const std::shared_ptr<Ope> &ope,
size_t min,
size_t max)
1301 std::any &dt)
const override {
1308 if (
max_ == std::numeric_limits<size_t>::max()) {
1310 while (i < n && bitset.test(
static_cast<unsigned char>(s[i]))) {
1314 auto limit = std::min(n,
max_);
1315 while (i < limit && bitset.test(
static_cast<unsigned char>(s[i]))) {
1321 return static_cast<size_t>(-1);
1328 while (count <
min_) {
1329 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1330 if (
fail(len)) {
return len; }
1335 while (count <
max_) {
1337 auto len =
ope_->parse(s + i, n - i, vs, c, dt);
1348 void accept(Visitor &v)
override;
1351 return min_ == 0 &&
max_ == std::numeric_limits<size_t>::max();
1354 static std::shared_ptr<Repetition>
zom(
const std::shared_ptr<Ope> &ope) {
1355 return std::make_shared<Repetition>(ope, 0,
1356 std::numeric_limits<size_t>::max());
1359 static std::shared_ptr<Repetition>
oom(
const std::shared_ptr<Ope> &ope) {
1360 return std::make_shared<Repetition>(ope, 1,
1361 std::numeric_limits<size_t>::max());
1364 static std::shared_ptr<Repetition>
opt(
const std::shared_ptr<Ope> &ope) {
1365 return std::make_shared<Repetition>(ope, 0, 1);
1380 std::any &dt)
const override {
1382 auto len =
ope_->parse(s, n, vs, c, dt);
1391 void accept(Visitor &v)
override;
1401 std::any &dt)
const override {
1403 auto len =
ope_->parse(s, n, vs, c, dt);
1407 return static_cast<size_t>(-1);
1413 void accept(Visitor &v)
override;
1421 :
trie_(v, ignore_case) {
1426 std::any &dt)
const override;
1428 void accept(Visitor &v)
override;
1434 public std::enable_shared_from_this<LiteralString> {
1447 std::any &dt)
const override;
1449 void accept(Visitor &v)
override;
1459 public std::enable_shared_from_this<CharacterClass> {
1463 auto chars =
decode(s.data(), s.length());
1465 while (i < chars.size()) {
1466 if (i + 2 < chars.size() && chars[i + 1] ==
'-') {
1467 auto cp1 = chars[i];
1468 auto cp2 = chars[i + 2];
1469 ranges_.emplace_back(std::pair(cp1, cp2));
1473 ranges_.emplace_back(std::pair(cp, cp));
1482 bool negated,
bool ignore_case)
1489 Context &c, std::any & )
const override {
1492 return static_cast<size_t>(-1);
1498 for (
const auto &range :
ranges_) {
1502 return static_cast<size_t>(-1);
1513 return static_cast<size_t>(-1);
1517 void accept(Visitor &v)
override;
1525 bool in_range(
const std::pair<char32_t, char32_t> &range,
char32_t cp)
const {
1527 auto cpl = std::tolower(cp);
1528 return std::tolower(range.first) <= cpl &&
1529 cpl <= std::tolower(range.second);
1531 return range.first <= cp && cp <= range.second;
1537 for (
const auto &[lo, hi] :
ranges_) {
1538 if (lo > 0x7F || hi > 0x7F) {
return; }
1541 for (
const auto &[lo, hi] :
ranges_) {
1542 for (
auto cp = lo; cp <= hi; cp++) {
1543 auto ch =
static_cast<unsigned char>(cp);
1546 ascii_bitset_.set(
static_cast<unsigned char>(std::toupper(ch)));
1547 ascii_bitset_.set(
static_cast<unsigned char>(std::tolower(ch)));
1553 std::vector<std::pair<char32_t, char32_t>>
ranges_;
1560class Character :
public Ope,
public std::enable_shared_from_this<Character> {
1565 Context &c, std::any & )
const override {
1568 return static_cast<size_t>(-1);
1576 return static_cast<size_t>(-1);
1581 void accept(Visitor &v)
override;
1587 public std::enable_shared_from_this<AnyCharacter> {
1590 Context &c, std::any & )
const override {
1594 return static_cast<size_t>(-1);
1599 void accept(Visitor &v)
override;
1607 std::any &dt)
const override {
1609 auto len =
ope_->parse(s, n, vs, c, dt);
1614 void accept(Visitor &v)
override;
1627 std::any &dt)
const override {
1628 auto len =
ope_->parse(s, n, vs, c, dt);
1633 void accept(Visitor &v)
override;
1646 std::any &dt)
const override;
1648 void accept(Visitor &v)
override;
1658 Context &c, std::any &dt)
const override {
1661 return ope_->parse(s, n, chvs, c, dt);
1664 void accept(Visitor &v)
override;
1676 Context & , std::any &dt)
const override {
1678 return fn_(s, n, vs, dt);
1680 void accept(Visitor &v)
override;
1681 std::function<size_t(
const char *s,
size_t n,
SemanticValues &vs,
1691 std::any &dt)
const override {
1692 auto ope =
weak_.lock();
1694 return ope->parse(s, n, vs, c, dt);
1697 void accept(Visitor &v)
override;
1707 std::any &dt)
const override;
1709 void accept(Visitor &v)
override;
1712 const std::any &predicate_data)
const;
1714 const std::string &
name()
const;
1725using Grammar = std::unordered_map<std::string, Definition>;
1727class Reference :
public Ope,
public std::enable_shared_from_this<Reference> {
1730 bool is_macro,
const std::vector<std::shared_ptr<Ope>> &args)
1735 std::any &dt)
const override;
1737 void accept(Visitor &v)
override;
1746 const std::vector<std::shared_ptr<Ope>>
args_;
1757 std::any &dt)
const override {
1761 return ope_->parse(s, n, vs, c, dt);
1764 void accept(Visitor &v)
override;
1776 std::any &dt)
const override;
1778 void accept(Visitor &v)
override;
1785 using BinOpeInfo = std::map<std::string_view, std::pair<size_t, char>>;
1788 const std::shared_ptr<Ope> &binop,
const BinOpeInfo &info,
1793 std::any &dt)
const override {
1797 void accept(Visitor &v)
override;
1806 Context &c, std::any &dt,
size_t min_prec)
const;
1816 std::any &dt)
const override;
1818 void accept(Visitor &v)
override;
1823class Cut :
public Ope,
public std::enable_shared_from_this<Cut> {
1826 Context &c, std::any & )
const override {
1831 void accept(Visitor &v)
override;
1837template <
typename... Args> std::shared_ptr<Ope>
seq(Args &&...args) {
1838 return std::make_shared<Sequence>(
static_cast<std::shared_ptr<Ope>
>(args)...);
1841template <
typename... Args> std::shared_ptr<Ope>
cho(Args &&...args) {
1842 return std::make_shared<PrioritizedChoice>(
1843 false,
static_cast<std::shared_ptr<Ope>
>(args)...);
1846template <
typename... Args> std::shared_ptr<Ope>
cho4label_(Args &&...args) {
1847 return std::make_shared<PrioritizedChoice>(
1848 true,
static_cast<std::shared_ptr<Ope>
>(args)...);
1851inline std::shared_ptr<Ope>
zom(
const std::shared_ptr<Ope> &ope) {
1855inline std::shared_ptr<Ope>
oom(
const std::shared_ptr<Ope> &ope) {
1859inline std::shared_ptr<Ope>
opt(
const std::shared_ptr<Ope> &ope) {
1863inline std::shared_ptr<Ope>
rep(
const std::shared_ptr<Ope> &ope,
size_t min,
1865 return std::make_shared<Repetition>(ope, min, max);
1868inline std::shared_ptr<Ope>
apd(
const std::shared_ptr<Ope> &ope) {
1869 return std::make_shared<AndPredicate>(ope);
1872inline std::shared_ptr<Ope>
npd(
const std::shared_ptr<Ope> &ope) {
1873 return std::make_shared<NotPredicate>(ope);
1876inline std::shared_ptr<Ope>
dic(
const std::vector<std::string> &v,
1878 return std::make_shared<Dictionary>(v, ignore_case);
1881inline std::shared_ptr<Ope>
lit(std::string &&s) {
1882 return std::make_shared<LiteralString>(s,
false);
1885inline std::shared_ptr<Ope>
liti(std::string &&s) {
1886 return std::make_shared<LiteralString>(s,
true);
1889inline std::shared_ptr<Ope>
cls(
const std::string &s) {
1890 return std::make_shared<CharacterClass>(s,
false,
false);
1893inline std::shared_ptr<Ope>
1894cls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
1895 bool ignore_case =
false) {
1896 return std::make_shared<CharacterClass>(ranges,
false, ignore_case);
1899inline std::shared_ptr<Ope>
ncls(
const std::string &s) {
1900 return std::make_shared<CharacterClass>(s,
true,
false);
1903inline std::shared_ptr<Ope>
1904ncls(
const std::vector<std::pair<char32_t, char32_t>> &ranges,
1905 bool ignore_case =
false) {
1906 return std::make_shared<CharacterClass>(ranges,
true, ignore_case);
1909inline std::shared_ptr<Ope>
chr(
char32_t dt) {
1910 return std::make_shared<Character>(dt);
1913inline std::shared_ptr<Ope>
dot() {
return std::make_shared<AnyCharacter>(); }
1915inline std::shared_ptr<Ope>
csc(
const std::shared_ptr<Ope> &ope) {
1916 return std::make_shared<CaptureScope>(ope);
1919inline std::shared_ptr<Ope>
cap(
const std::shared_ptr<Ope> &ope,
1921 return std::make_shared<Capture>(ope, ma);
1924inline std::shared_ptr<Ope>
tok(
const std::shared_ptr<Ope> &ope) {
1925 return std::make_shared<TokenBoundary>(ope);
1928inline std::shared_ptr<Ope>
ign(
const std::shared_ptr<Ope> &ope) {
1929 return std::make_shared<Ignore>(ope);
1932inline std::shared_ptr<Ope>
1936 return std::make_shared<User>(fn);
1939inline std::shared_ptr<Ope>
ref(
const Grammar &grammar,
const std::string &name,
1940 const char *s,
bool is_macro,
1941 const std::vector<std::shared_ptr<Ope>> &args) {
1942 return std::make_shared<Reference>(grammar, name, s, is_macro, args);
1945inline std::shared_ptr<Ope>
wsp(
const std::shared_ptr<Ope> &ope) {
1946 return std::make_shared<Whitespace>(std::make_shared<Ignore>(ope));
1949inline std::shared_ptr<Ope>
bkr(std::string &&name) {
1950 return std::make_shared<BackReference>(name);
1953inline std::shared_ptr<Ope>
pre(
const std::shared_ptr<Ope> &atom,
1954 const std::shared_ptr<Ope> &binop,
1957 return std::make_shared<PrecedenceClimbing>(atom, binop, info, rule);
1960inline std::shared_ptr<Ope>
rec(
const std::shared_ptr<Ope> &ope) {
1961 return std::make_shared<Recovery>(ope);
1964inline std::shared_ptr<Ope>
cut() {
return std::make_shared<Cut>(); }
1999 for (
auto &op : ope.
opes_) {
2004 for (
auto &op : ope.
opes_) {
2066 std::unordered_map<void *, size_t>
ids;
2073 for (
const auto &op : ope.
opes_) {
2139 for (
const auto &op : ope.
opes_) {
2150 for (
const auto &op : ope.
opes_) {
2159 ope.
ope_->accept(*
this);
2163 ope.
ope_->accept(*
this);
2167 ope.
ope_->accept(*
this);
2198 ComputeCanBeEmpty vis;
2205 ComputeCanBeEmpty vis;
2228 std::unordered_map<std::string, bool> &has_error_cache)
2233 for (
const auto &op : ope.
opes_) {
2239 if (ope.
min_ == 0) {
2242 ope.
ope_->accept(*
this);
2261 std::vector<std::pair<const char *, std::string>> &
refs_;
2269 std::vector<std::pair<const char *, std::string>> &refs,
2270 std::unordered_map<std::string, bool> &has_error_cache)
2272 refs_.emplace_back(s, name);
2276 std::unordered_map<std::string, bool> &has_error_cache)
2280 for (
const auto &op : ope.
opes_) {
2286 for (
const auto &op : ope.
opes_) {
2292 if (ope.
max_ == std::numeric_limits<size_t>::max()) {
2294 ope.
ope_->accept(vis);
2301 ope.
ope_->accept(*
this);
2311 std::vector<std::pair<const char *, std::string>> &
refs_;
2319 const std::vector<std::string> ¶ms)
2324 std::unordered_map<std::string, const char *>
error_s;
2350 const std::vector<std::string> ¶ms)
2354 std::vector<std::shared_ptr<Ope>> opes;
2355 for (
const auto &o : ope.
opes_) {
2357 opes.emplace_back(std::move(
found_ope));
2359 found_ope = std::make_shared<Sequence>(opes);
2362 std::vector<std::shared_ptr<Ope>> opes;
2363 for (
const auto &o : ope.
opes_) {
2365 opes.emplace_back(std::move(
found_ope));
2367 found_ope = std::make_shared<PrioritizedChoice>(opes);
2370 ope.
ope_->accept(*
this);
2374 ope.
ope_->accept(*
this);
2378 ope.
ope_->accept(*
this);
2391 ope.
ope_->accept(*
this);
2395 ope.
ope_->accept(*
this);
2399 ope.
ope_->accept(*
this);
2403 ope.
ope_->accept(*
this);
2410 ope.
ope_->accept(*
this);
2414 ope.
atom_->accept(*
this);
2418 ope.
ope_->accept(*
this);
2426 const std::vector<std::shared_ptr<Ope>> &
args_;
2437 for (
const auto &op : ope.
opes_) {
2457 for (
const auto &op : ope.
opes_) {
2465 ope.
ope_->accept(*
this);
2466 if (ope.
min_ == 0) {
result_.can_be_empty =
true; }
2471 for (
const auto &[key, info] : ope.
trie_.
dic_) {
2473 auto ch =
static_cast<unsigned char>(key[0]);
2476 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2477 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2483 if (ope.
lit_.empty()) {
2486 auto ch =
static_cast<unsigned char>(ope.
lit_[0]);
2489 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2490 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2496 for (
const auto &range : ope.
ranges_) {
2497 auto cp1 = range.first;
2498 auto cp2 = range.second;
2499 if (cp1 > 0x7F || cp2 > 0x7F) {
2504 for (
auto cp = cp1; cp <= cp2; cp++) {
2505 auto ch =
static_cast<unsigned char>(cp);
2508 result_.chars.set(
static_cast<unsigned char>(std::toupper(ch)));
2509 result_.chars.set(
static_cast<unsigned char>(std::tolower(ch)));
2519 if (ope.
ch_ > 0x7F) {
2522 result_.chars.set(
static_cast<unsigned char>(ope.
ch_));
2545 std::unordered_set<const Definition *>
refs_;
2558 for (
const auto &op : ope.
opes_) {
2563 for (
const auto &op : ope.
opes_) {
2568 ope.
ope_->accept(*
this);
2571 if (cc && cc->is_ascii_only()) { ope.
span_bitset_ = &cc->ascii_bitset(); }
2610 operator std::shared_ptr<Ope>() {
2611 return std::make_shared<WeakHolder>(
holder_);
2620 Log log =
nullptr)
const {
2627 Log log =
nullptr)
const {
2629 return parse(s, n, path, log);
2633 const char *path =
nullptr,
Log log =
nullptr)
const {
2639 Log log =
nullptr)
const {
2641 return parse(s, n, dt, path, log);
2644 template <
typename T>
2646 const char *path =
nullptr,
2647 Log log =
nullptr)
const {
2650 auto r =
parse_core(s, n, vs, dt, path, log);
2651 if (r.ret && !vs.empty() && vs.front().has_value()) {
2652 val = std::any_cast<T>(vs[0]);
2657 template <
typename T>
2659 Log log =
nullptr)
const {
2664 template <
typename T>
2666 const char *path =
nullptr,
2667 Log log =
nullptr)
const {
2669 auto r =
parse_core(s, n, vs, dt, path, log);
2670 if (r.ret && !vs.empty() && vs.front().has_value()) {
2671 val = std::any_cast<T>(vs[0]);
2676 template <
typename T>
2678 const char *path =
nullptr,
2679 Log log =
nullptr)
const {
2684#if defined(__cpp_lib_char8_t)
2685 Result parse(
const char8_t *s,
size_t n,
const char *path =
nullptr,
2686 Log log =
nullptr)
const {
2687 return parse(
reinterpret_cast<const char *
>(s), n, path, log);
2690 Result parse(
const char8_t *s,
const char *path =
nullptr,
2691 Log log =
nullptr)
const {
2692 return parse(
reinterpret_cast<const char *
>(s), path, log);
2695 Result parse(
const char8_t *s,
size_t n, std::any &dt,
2696 const char *path =
nullptr,
Log log =
nullptr)
const {
2697 return parse(
reinterpret_cast<const char *
>(s), n, dt, path, log);
2700 Result parse(
const char8_t *s, std::any &dt,
const char *path =
nullptr,
2701 Log log =
nullptr)
const {
2702 return parse(
reinterpret_cast<const char *
>(s), dt, path, log);
2705 template <
typename T>
2707 const char *path =
nullptr,
2708 Log log =
nullptr)
const {
2713 template <
typename T>
2715 const char *path =
nullptr,
2716 Log log =
nullptr)
const {
2721 template <
typename T>
2723 const char *path =
nullptr,
2724 Log log =
nullptr)
const {
2729 template <
typename T>
2731 const char *path =
nullptr,
2732 Log log =
nullptr)
const {
2762 const char *
s_ =
nullptr;
2763 std::pair<size_t, size_t>
line_ = {1, 1};
2769 std::function<void(
const Context &c,
const char *s,
size_t n, std::any &dt)>
2771 std::function<void(
const Context &c,
const char *s,
size_t n,
size_t matchlen,
2772 std::any &value, std::any &dt)>
2819 const char *path,
Log log)
const {
2822 std::shared_ptr<Ope> ope =
holder_;
2824 std::any trace_data;
2849 auto save_ignore_trace_state = c.ignore_trace_state;
2850 c.ignore_trace_state = !c.verbose_trace;
2852 scope_exit([&]() { c.ignore_trace_state = save_ignore_trace_state; });
2855 if (
fail(len)) {
return Result{
false, c.recovered, i, c.error_info}; }
2860 auto len = ope->parse(s + i, n - i, vs, c, dt);
2866 if (c.error_info.error_pos - c.s < s + i - c.s) {
2867 c.error_info.message_pos = s + i;
2868 c.error_info.message =
"expected end of input";
2874 return Result{ret, c.recovered, i, c.error_info};
2892 Context &c, std::any &dt,
const std::string &
lit,
2893 std::once_flag &init_is_word,
bool &is_word,
2894 bool ignore_case,
const std::string &lower_lit) {
2896 for (; i <
lit.size(); i++) {
2898 (ignore_case ? (
static_cast<char>(std::tolower(
2899 static_cast<unsigned char>(s[i]))) != lower_lit[i])
2900 : (s[i] !=
lit[i]))) {
2902 return static_cast<size_t>(-1);
2913 std::call_once(init_is_word, [&]() {
2915 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
2916 nullptr,
nullptr,
false,
nullptr);
2920 c.
wordOpe->parse(
lit.data(),
lit.size(), dummy_vs, dummy_c, dummy_dt);
2926 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
2927 nullptr,
nullptr,
false,
nullptr);
2931 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
2942 if (
fail(wl)) {
return wl; }
2950 return c_->line_info(
sv_.data());
2960 !unexpected_token.empty()) {
2963 auto unexpected_char = unexpected_token.substr(
2971 log(line.first, line.second, msg,
label);
2980 msg =
"syntax error.";
2982 msg =
"syntax error";
2986 !unexpected_token.empty()) {
2987 msg +=
", unexpected '";
2988 msg += unexpected_token;
2992 auto first_item =
true;
2998 if (!(error_rule && error_rule->name[0] ==
'_')) {
2999 msg += (first_item ?
", expecting " :
", ");
3000 if (error_literal) {
3002 msg += error_literal;
3005 msg +=
"<" + error_rule->name +
">";
3006 if (
label.empty()) {
label = error_rule->name; }
3015 log(line.first, line.second, msg,
label);
3037 const char *error_literal =
nullptr;
3041 error_literal = literal;
3044 auto ope = rule->get_core_operator();
3046 token && token[0] !=
'\0') {
3047 error_literal = token;
3053 if (r->is_token()) {
break; }
3056 if (error_literal || error_rule) {
3085 Context &c, std::any &dt)
const {
3097 std::any &dt)
const {
3099 auto i =
trie_.match(s, n,
id);
3103 return static_cast<size_t>(-1);
3118 Context dummy_c(
nullptr, c.
s, c.
l, 0,
nullptr,
nullptr,
false,
nullptr,
3119 nullptr,
nullptr,
false,
nullptr);
3123 auto len = ope.
parse(s + i, n - i, dummy_vs, dummy_c, dummy_dt);
3134 if (
fail(wl)) {
return wl; }
3142 std::any &dt)
const {
3149 std::any &dt)
const {
3159 len =
ope_->parse(s, n, vs, c, dt);
3163 vs.
tokens.emplace_back(std::string_view(s, len));
3166 if (
fail(wl)) {
return wl; }
3173 Context &c, std::any &dt)
const {
3175 throw std::logic_error(
"Uninitialized definition ope was used...");
3181 auto len =
ope_->parse(s, n, vs, c, dt);
3192 auto do_parse = [&]() {
3200 if (
outer_->leave) {
outer_->leave(c, s, n, parse_len, parse_val, dt); }
3204 parse_len =
ope_->parse(s, n, chvs, c, dt);
3208 chvs.sv_ = std::string_view(s, parse_len);
3209 chvs.name_ =
outer_->name;
3211 auto ope_ptr =
ope_.get();
3212 if (ope_ptr->is_token_boundary) {
3215 if (!ope_ptr->is_choice_like) {
3216 chvs.choice_count_ = 0;
3221 std::any predicate_data;
3223 if (!
outer_->predicate(chvs, dt, msg, predicate_data)) {
3229 parse_len =
static_cast<size_t>(-1);
3243 if (c.
log && !
outer_->error_message.empty() &&
3251 return std::make_pair(parse_len, std::move(parse_val));
3254 if (
outer_->is_left_recursive) {
3255 auto lr_key = std::make_pair(
outer_, s);
3258 auto it = c.
lr_memo.find(lr_key);
3260 if (
success(it->second.len)) {
3261 len = it->second.len;
3262 val = it->second.val;
3264 len =
static_cast<size_t>(-1);
3271 c.
lr_memo[lr_key] = {
static_cast<size_t>(-1), {}};
3283 auto [initial_len, initial_val] = do_parse();
3290 if (!cycle_rules.empty()) { cycle_rules.insert(
outer_); }
3294 c.
lr_refs_hit.insert(cycle_rules.begin(), cycle_rules.end());
3298 len =
static_cast<size_t>(-1);
3302 val = std::move(initial_val);
3303 c.
lr_memo[lr_key] = {len, val};
3313 for (
auto memo_it = c.
lr_memo.begin(); memo_it != c.
lr_memo.end();) {
3314 if (memo_it->first.second == s && memo_it->first.first !=
outer_ &&
3315 cycle_rules.count(memo_it->first.first) &&
3317 memo_it = c.
lr_memo.erase(memo_it);
3323 auto [new_len, new_val] = do_parse();
3325 if (!
success(new_len) || new_len <= len) {
3330 val = std::move(new_val);
3331 c.
lr_memo[lr_key] = {len, val};
3344 auto [parse_len, parse_val] = do_parse();
3346 if (success(len)) { a_val = std::move(parse_val); }
3351 auto guard_key = std::make_pair(
outer_, s);
3352 if (c.
lr_memo.count(guard_key)) {
3353 len =
static_cast<size_t>(-1);
3355 c.
lr_memo[guard_key] = {
static_cast<size_t>(-1), {}};
3356 auto [parse_len, parse_val] = do_parse();
3358 val = std::move(parse_val);
3365 if (!outer_->ignoreSemanticValue) {
3366 vs.emplace_back(std::move(val));
3367 vs.tags.emplace_back(
str2tag(outer_->name));
3375 const std::any &predicate_data)
const {
3377 return outer_->action(vs, dt, predicate_data);
3378 }
else if (vs.empty()) {
3381 return std::move(vs.front());
3394 Context &c, std::any &dt)
const {
3404 if (
rule_->is_macro) {
3409 std::vector<std::shared_ptr<Ope>> args;
3410 for (
const auto &arg :
args_) {
3412 args.emplace_back(std::move(vis.
found_ope));
3417 return rule_->holder_->parse(s, n, vs, c, dt);
3420 c.
push_args(std::vector<std::shared_ptr<Ope>>());
3422 return rule_->holder_->parse(s, n, vs, c, dt);
3427 return args[
iarg_]->parse(s, n, vs, c, dt);
3432 return rule_->holder_;
3437 std::any &dt)
const {
3440 if (it->first ==
name_) {
3441 const auto &
lit = it->second;
3442 std::once_flag init_is_word;
3443 auto is_word =
false;
3444 static const std::string empty;
3452 return static_cast<size_t>(-1);
3457 if (
rule_.is_macro) {
3461 auto arg = args[iarg];
3471 size_t min_prec)
const {
3472 auto len =
atom_->parse(s, n, vs, c, dt);
3473 if (
fail(len)) {
return len; }
3477 auto action = std::move(rule.action);
3480 const std::any &predicate_data2) {
3483 return action(vs2, dt2, predicate_data2);
3484 }
else if (!vs2.empty()) {
3489 auto action_se =
scope_exit([&]() { rule.action = std::move(action); });
3493 std::vector<std::any> save_values(vs.begin(), vs.end());
3494 auto save_tokens = vs.
tokens;
3497 auto chlen =
binop_->parse(s + i, n - i, chvs, c, dt);
3500 if (
fail(chlen)) {
break; }
3503 if (it ==
info_.end()) {
break; }
3505 auto level = std::get<0>(it->second);
3506 auto assoc = std::get<1>(it->second);
3508 if (level < min_prec) {
break; }
3510 vs.emplace_back(std::move(chvs[0]));
3513 auto next_min_prec = level;
3514 if (assoc ==
'L') { next_min_prec = level + 1; }
3521 vs.assign(save_values.begin(), save_values.end());
3527 vs.emplace_back(std::move(chvs[0]));
3532 vs.
sv_ = std::string_view(s, i);
3533 static const std::any empty_predicate_data;
3534 val =
rule_.action(vs, dt, empty_predicate_data);
3535 }
else if (!vs.empty()) {
3539 vs.emplace_back(std::move(val));
3547 std::any & )
const {
3548 const auto &rule =
dynamic_cast<Reference &
>(*ope_);
3552 auto label =
dynamic_cast<Reference *
>(rule.args_[0].get());
3553 if (label && !label->rule_->error_message.empty()) {
3561 auto len =
static_cast<size_t>(-1);
3563 auto save_log = c.
log;
3570 len = rule.parse(s, n, dummy_vs, c, dummy_dt);
3619 auto p =
static_cast<void *
>(ope.
outer_);
3620 if (
ids.count(p)) {
return; }
3621 auto id =
ids.size();
3624 ope.
ope_->accept(*
this);
3629 for (
const auto &arg : ope.
args_) {
3637 ope.
atom_->accept(*
this);
3638 ope.
binop_->accept(*
this);
3643 for (
const auto &arg : ope.
args_) {
3654 for (
const auto &arg : ope.
args_) {
3672 resolved->accept(*
this);
3673 if (
done_ ==
false) {
return; }
3681 if (
done_ ==
false) {
return; }
3690 resolved->accept(cbe);
3700inline std::shared_ptr<Ope>
3704 if (iarg >= args.size()) {
return nullptr; }
3705 auto ref =
dynamic_cast<Reference *
>(args[iarg].get());
3706 if (
ref && !
ref->rule_) {
3717 auto save_is_empty =
false;
3718 const char *save_error_s =
nullptr;
3719 std::string save_error_name;
3721 auto it = ope.
opes_.begin();
3722 while (it != ope.
opes_.end()) {
3723 (*it)->accept(*
this);
3726 while (it != ope.
opes_.end()) {
3754 auto it = std::find_if(
refs_.begin(),
refs_.end(),
3755 [&](
const std::pair<const char *, std::string> &
ref) {
3756 return ope.name_ == ref.second;
3758 if (it !=
refs_.end()) {
return; }
3768 auto it = std::find_if(
refs_.begin(),
refs_.end(),
3769 [&](
const std::pair<const char *, std::string> &
ref) {
3770 return ope.name_ == ref.second;
3772 if (it !=
refs_.end()) {
return; }
3787 for (
const auto &arg : ope.
args_) {
3795 if (it !=
params_.end()) {
return; }
3803 if (rule.is_macro) {
3812 for (
const auto &arg : ope.
args_) {
3828 if (it !=
cache_.end()) {
3829 rule_fs = &it->second;
3838 computed = std::move(
result_);
3843 it =
cache_.try_emplace(ope.
rule_, std::move(computed)).first;
3844 rule_fs = &it->second;
3849 rule_fs = &computed;
3865 if (!ope.
rule_) {
return; }
3873 for (
const auto &op : ope.
opes_) {
3884 if (
seq.opes_.size() != 2) {
return; }
3888 if (!not_pred) {
return; }
3891 auto *
ref =
dynamic_cast<Reference *
>(not_pred->ope_.get());
3892 if (!
ref || !
ref->rule_) {
return; }
3896 auto *holder =
dynamic_cast<Holder *
>(
ref->get_core_operator().get());
3897 if (!holder) {
return; }
3899 if (!choice) {
return; }
3902 std::vector<std::string> exact_keywords;
3903 std::vector<std::string> prefix_keywords;
3905 for (
const auto &alt : choice->opes_) {
3908 if (!
lit->ignore_case_) {
return; }
3913 auto *sub_seq =
dynamic_cast<Sequence *
>(alt.get());
3914 if (sub_seq && !sub_seq->opes_.empty()) {
3915 auto *first_lit =
dynamic_cast<LiteralString *
>(sub_seq->opes_[0].get());
3917 auto all_ignore_case_lits =
3918 std::all_of(sub_seq->opes_.begin(), sub_seq->opes_.end(),
3919 [](
const auto &child) {
3920 auto *l = dynamic_cast<LiteralString *>(child.get());
3921 return l && l->ignore_case_;
3923 if (all_ignore_case_lits) {
3924 prefix_keywords.push_back(
to_lower(first_lit->lit_));
3933 if (exact_keywords.empty()) {
return; }
3937 if (!tb) {
return; }
3944 auto *inner_seq =
dynamic_cast<Sequence *
>(tb->ope_.get());
3945 if (inner_seq && inner_seq->opes_.size() == 2) {
3946 first_cc =
dynamic_cast<CharacterClass *
>(inner_seq->opes_[0].get());
3947 auto *
rep =
dynamic_cast<Repetition *
>(inner_seq->opes_[1].get());
3951 if (!first_cc || !rest_cc) {
return; }
3955 auto kw = std::make_unique<KeywordGuardData>();
3960 size_t min_len = SIZE_MAX, max_len = 0;
3961 for (
const auto &k : exact_keywords) {
3962 min_len = std::min(min_len, k.size());
3963 max_len = std::max(max_len, k.size());
3965 for (
const auto &k : prefix_keywords) {
3966 min_len = std::min(min_len, k.size());
3967 max_len = std::max(max_len, k.size());
3969 kw->min_keyword_len = min_len;
3970 kw->max_keyword_len = max_len;
3972 kw->exact_keywords = std::move(exact_keywords);
3973 kw->prefix_keywords = std::move(prefix_keywords);
3974 seq.kw_guard_ = std::move(kw);
3983 if (def_count == 0) {
return; }
3989 std::vector<bool> reachable;
3991 CollectReachableRules(
size_t n) : reachable(n,
false) {}
3993 void visit(
Holder &ope)
override {
3995 if (
id < reachable.size()) { reachable[
id] =
true; }
3996 ope.
ope_->accept(*
this);
4001 reachable[ope.
rule_->
id] =
true;
4008 std::vector<bool> benefits(def_count,
false);
4012 std::vector<bool> &benefits;
4014 std::vector<bool> visited_rules;
4016 FindBacktrackRules(std::vector<bool> &b,
size_t n)
4017 : benefits(b), def_count(n), visited_rules(n,
false) {}
4021 std::vector<std::vector<bool>> alt_reachable;
4022 for (
auto &op : ope.
opes_) {
4023 CollectReachableRules crr(def_count);
4025 alt_reachable.push_back(std::move(crr.reachable));
4029 for (
size_t id = 0;
id < def_count;
id++) {
4031 for (
auto &alt : alt_reachable) {
4032 if (alt[
id]) { count++; }
4034 if (count >= 2) { benefits[
id] =
true; }
4038 for (
auto &op : ope.
opes_) {
4042 void visit(
Holder &ope)
override {
4044 if (
id < visited_rules.size() && !visited_rules[
id]) {
4045 visited_rules[
id] =
true;
4046 ope.
ope_->accept(*
this);
4054 FindBacktrackRules finder(benefits, def_count);
4065 auto found_param =
false;
4066 for (
size_t i = 0; i <
params_.size(); i++) {
4067 const auto ¶m =
params_[i];
4068 if (param == ope.
name_) {
4081 for (
const auto &arg : ope.
args_) {
4087 for (
size_t i = 0; i <
args_.size(); i++) {
4088 const auto &name =
params_[i];
4089 if (name == ope.
name_) {
4101using Rules = std::unordered_map<std::string, std::shared_ptr<Ope>>;
4112 Log log, std::string_view start,
4113 bool enable_left_recursion =
true) {
4115 enable_left_recursion);
4121 std::any dt = &data;
4125 return r.ret && r.len == n;
4128#if defined(__cpp_lib_char8_t)
4129 static bool parse_test(
const char *d,
const char8_t *s) {
4130 return parse_test(d,
reinterpret_cast<const char *
>(s));
4173 : std::runtime_error(what_arg),
r_(r) {}
4178 std::pair<size_t, size_t>
r_;
4183 g[
"Grammar"] <=
seq(
g[
"Spacing"],
oom(
g[
"Definition"]),
g[
"EndOfFile"]);
4185 cho(
seq(
g[
"Ignore"],
g[
"IdentCont"],
g[
"Parameters"],
g[
"LEFTARROW"],
4186 g[
"Expression"],
opt(
g[
"Instruction"])),
4187 seq(
g[
"Ignore"],
g[
"Identifier"],
g[
"LEFTARROW"],
g[
"Expression"],
4188 opt(
g[
"Instruction"])));
4189 g[
"Expression"] <=
seq(
g[
"Sequence"],
zom(
seq(
g[
"SLASH"],
g[
"Sequence"])));
4190 g[
"Sequence"] <=
zom(
cho(
g[
"CUT"],
g[
"Prefix"]));
4191 g[
"Prefix"] <=
seq(
opt(
cho(
g[
"AND"],
g[
"NOT"])),
g[
"SuffixWithLabel"]);
4192 g[
"SuffixWithLabel"] <=
4193 seq(
g[
"Suffix"],
opt(
seq(
g[
"LABEL"],
g[
"Identifier"])));
4194 g[
"Suffix"] <=
seq(
g[
"Primary"],
opt(
g[
"Loop"]));
4195 g[
"Loop"] <=
cho(
g[
"QUESTION"],
g[
"STAR"],
g[
"PLUS"],
g[
"Repetition"]);
4196 g[
"Primary"] <=
cho(
seq(
g[
"Ignore"],
g[
"IdentCont"],
g[
"Arguments"],
4197 npd(
g[
"LEFTARROW"])),
4198 seq(
g[
"Ignore"],
g[
"Identifier"],
4200 seq(
g[
"OPEN"],
g[
"Expression"],
g[
"CLOSE"]),
4201 seq(
g[
"BeginTok"],
g[
"Expression"],
g[
"EndTok"]),
4203 seq(
g[
"BeginCap"],
g[
"Expression"],
g[
"EndCap"]),
4204 g[
"BackRef"],
g[
"DictionaryI"],
g[
"LiteralI"],
4205 g[
"Dictionary"],
g[
"Literal"],
g[
"NegatedClassI"],
4206 g[
"NegatedClass"],
g[
"ClassI"],
g[
"Class"],
g[
"DOT"]);
4208 g[
"Identifier"] <=
seq(
g[
"IdentCont"],
g[
"Spacing"]);
4209 g[
"IdentCont"] <=
tok(
seq(
g[
"IdentStart"],
zom(
g[
"IdentRest"])));
4211 const static std::vector<std::pair<char32_t, char32_t>> range = {
4216 g[
"IdentRest"] <=
cho(
g[
"IdentStart"],
cls(
"0-9"));
4218 g[
"Dictionary"] <=
seq(
g[
"LiteralD"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralD"])));
4221 seq(
g[
"LiteralID"],
oom(
seq(
g[
"PIPE"],
g[
"LiteralID"])));
4224 cls(
"'"),
g[
"Spacing"]),
4226 cls(
"\""),
g[
"Spacing"]));
4227 g[
"Literal"] <= lit_ope;
4228 g[
"LiteralD"] <= lit_ope;
4230 auto lit_case_ignore_ope =
4235 g[
"LiteralI"] <= lit_case_ignore_ope;
4236 g[
"LiteralID"] <= lit_case_ignore_ope;
4246 g[
"NegatedClass"] <=
seq(
lit(
"[^"),
4249 g[
"NegatedClassI"] <=
seq(
lit(
"[^"),
4251 lit(
"]i"),
g[
"Spacing"]);
4265 rep(
cls(
"0-9a-fA-F"), 4, 4)),
4266 rep(
cls(
"0-9a-fA-F"), 4, 5))),
4270 seq(
g[
"BeginBracket"],
g[
"RepetitionRange"],
g[
"EndBracket"]);
4271 g[
"RepetitionRange"] <=
cho(
seq(
g[
"Number"],
g[
"COMMA"],
g[
"Number"]),
4272 seq(
g[
"Number"],
g[
"COMMA"]),
g[
"Number"],
4273 seq(
g[
"COMMA"],
g[
"Number"]));
4274 g[
"Number"] <=
seq(
oom(
cls(
"0-9")),
g[
"Spacing"]);
4276 g[
"CapScope"] <=
seq(
g[
"BeginCapScope"],
g[
"Expression"],
g[
"EndCapScope"]);
4279 ~g[
"SLASH"] <=
seq(
chr(
'/'),
g[
"Spacing"]);
4280 ~g[
"PIPE"] <=
seq(
chr(
'|'),
g[
"Spacing"]);
4281 g[
"AND"] <=
seq(
chr(
'&'),
g[
"Spacing"]);
4282 g[
"NOT"] <=
seq(
chr(
'!'),
g[
"Spacing"]);
4283 g[
"QUESTION"] <=
seq(
chr(
'?'),
g[
"Spacing"]);
4284 g[
"STAR"] <=
seq(
chr(
'*'),
g[
"Spacing"]);
4285 g[
"PLUS"] <=
seq(
chr(
'+'),
g[
"Spacing"]);
4286 ~g[
"OPEN"] <=
seq(
chr(
'('),
g[
"Spacing"]);
4287 ~g[
"CLOSE"] <=
seq(
chr(
')'),
g[
"Spacing"]);
4288 g[
"DOT"] <=
seq(
chr(
'.'),
g[
"Spacing"]);
4293 ~g[
"Spacing"] <=
zom(
cho(
g[
"Space"],
g[
"Comment"]));
4295 opt(
g[
"EndOfLine"]));
4296 g[
"Space"] <=
cho(
chr(
' '),
chr(
'\t'),
g[
"EndOfLine"]);
4300 ~g[
"BeginTok"] <=
seq(
chr(
'<'),
g[
"Spacing"]);
4301 ~g[
"EndTok"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
4303 ~g[
"BeginCapScope"] <=
seq(
chr(
'$'),
chr(
'('),
g[
"Spacing"]);
4304 ~g[
"EndCapScope"] <=
seq(
chr(
')'),
g[
"Spacing"]);
4306 g[
"BeginCap"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
chr(
'<'),
g[
"Spacing"]);
4307 ~g[
"EndCap"] <=
seq(
chr(
'>'),
g[
"Spacing"]);
4309 g[
"BackRef"] <=
seq(
chr(
'$'),
tok(
g[
"IdentCont"]),
g[
"Spacing"]);
4311 g[
"IGNORE"] <=
chr(
'~');
4313 g[
"Ignore"] <=
opt(
g[
"IGNORE"]);
4314 g[
"Parameters"] <=
seq(
g[
"OPEN"],
g[
"Identifier"],
4315 zom(
seq(
g[
"COMMA"],
g[
"Identifier"])),
g[
"CLOSE"]);
4316 g[
"Arguments"] <=
seq(
g[
"OPEN"],
g[
"Expression"],
4317 zom(
seq(
g[
"COMMA"],
g[
"Expression"])),
g[
"CLOSE"]);
4318 ~g[
"COMMA"] <=
seq(
chr(
','),
g[
"Spacing"]);
4322 seq(
g[
"BeginBracket"],
4323 opt(
seq(
g[
"InstructionItem"],
zom(
seq(
g[
"InstructionItemSeparator"],
4324 g[
"InstructionItem"])))),
4326 g[
"InstructionItem"] <=
4327 cho(
g[
"PrecedenceClimbing"],
g[
"ErrorMessage"],
g[
"NoAstOpt"]);
4328 ~g[
"InstructionItemSeparator"] <=
seq(
chr(
';'),
g[
"Spacing"]);
4330 ~g[
"SpacesZom"] <=
zom(
g[
"Space"]);
4331 ~g[
"SpacesOom"] <=
oom(
g[
"Space"]);
4332 ~g[
"BeginBracket"] <=
seq(
chr(
'{'),
g[
"Spacing"]);
4333 ~g[
"EndBracket"] <=
seq(
chr(
'}'),
g[
"Spacing"]);
4336 g[
"PrecedenceClimbing"] <=
4337 seq(
lit(
"precedence"),
g[
"SpacesOom"],
g[
"PrecedenceInfo"],
4338 zom(
seq(
g[
"SpacesOom"],
g[
"PrecedenceInfo"])),
g[
"SpacesZom"]);
4339 g[
"PrecedenceInfo"] <=
4340 seq(
g[
"PrecedenceAssoc"],
4341 oom(
seq(
ign(
g[
"SpacesOom"]),
g[
"PrecedenceOpe"])));
4342 g[
"PrecedenceOpe"] <=
4351 g[
"PrecedenceAssoc"] <=
cls(
"LR");
4354 g[
"ErrorMessage"] <=
seq(
lit(
"error_message"),
g[
"SpacesOom"],
4355 g[
"LiteralD"],
g[
"SpacesZom"]);
4358 g[
"NoAstOpt"] <=
seq(
lit(
"no_ast_opt"),
g[
"SpacesZom"]);
4362 x.second.name = x.first;
4368 auto &data = *std::any_cast<Data *>(dt);
4370 auto is_macro = vs.
choice() == 0;
4371 auto ignore = std::any_cast<bool>(vs[0]);
4372 auto name = std::any_cast<std::string>(vs[1]);
4374 std::vector<std::string> params;
4375 std::shared_ptr<Ope> ope;
4376 auto has_instructions =
false;
4379 params = std::any_cast<std::vector<std::string>>(vs[2]);
4380 ope = std::any_cast<std::shared_ptr<Ope>>(vs[4]);
4381 if (vs.size() == 6) { has_instructions =
true; }
4383 ope = std::any_cast<std::shared_ptr<Ope>>(vs[3]);
4384 if (vs.size() == 5) { has_instructions =
true; }
4387 if (has_instructions) {
4388 auto index = is_macro ? 5 : 4;
4389 std::unordered_set<std::string> types;
4390 for (
const auto &instruction :
4391 std::any_cast<std::vector<Instruction>>(vs[index])) {
4392 const auto &type = instruction.type;
4393 if (types.find(type) == types.end()) {
4394 data.instructions[name].push_back(instruction);
4395 types.insert(instruction.type);
4396 if (type ==
"declare_symbol" || type ==
"check_symbol") {
4400 data.duplicates_of_instruction.emplace_back(type,
4401 instruction.sv.data());
4406 auto &grammar = *data.grammar;
4407 if (!grammar.count(name)) {
4408 auto &rule = grammar[name];
4411 rule.s_ = vs.
sv().data();
4413 rule.ignoreSemanticValue = ignore;
4414 rule.is_macro = is_macro;
4415 rule.params = params;
4417 if (data.start.empty()) {
4418 data.start = rule.name;
4419 data.start_pos = rule.s_;
4422 data.duplicates_of_definition.emplace_back(name, vs.
sv().data());
4426 g[
"Definition"].enter = [](
const Context & ,
const char * ,
4427 size_t , std::any &dt) {
4428 auto &data = *std::any_cast<Data *>(dt);
4429 data.captures_in_current_definition.clear();
4433 if (vs.size() == 1) {
4434 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4436 std::vector<std::shared_ptr<Ope>> opes;
4437 for (
auto i = 0u; i < vs.size(); i++) {
4438 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(vs[i]));
4440 const std::shared_ptr<Ope> ope =
4441 std::make_shared<PrioritizedChoice>(opes);
4449 }
else if (vs.size() == 1) {
4450 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4452 std::vector<std::shared_ptr<Ope>> opes;
4453 for (
const auto &x : vs) {
4454 opes.emplace_back(std::any_cast<std::shared_ptr<Ope>>(x));
4456 const std::shared_ptr<Ope> ope = std::make_shared<Sequence>(opes);
4462 std::shared_ptr<Ope> ope;
4463 if (vs.size() == 1) {
4464 ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4466 assert(vs.size() == 2);
4467 auto tok = std::any_cast<char>(vs[0]);
4468 ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
4479 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4480 if (vs.size() == 1) {
4483 assert(vs.size() == 2);
4484 auto &data = *std::any_cast<Data *>(dt);
4485 const auto &ident = std::any_cast<std::string>(vs[1]);
4486 auto label =
ref(*data.grammar, ident, vs.
sv().data(),
false, {});
4488 vs.
sv().data(),
true, {label}));
4496 std::pair<size_t, size_t> range;
4500 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4501 if (vs.size() == 1) {
4504 assert(vs.size() == 2);
4505 auto loop = std::any_cast<Loop>(vs[1]);
4506 switch (loop.type) {
4507 case Loop::Type::opt:
return opt(ope);
4508 case Loop::Type::zom:
return zom(ope);
4509 case Loop::Type::oom:
return oom(ope);
4511 return rep(ope, loop.range.first, loop.range.second);
4519 return Loop{Loop::Type::opt, std::pair<size_t, size_t>()};
4521 return Loop{Loop::Type::zom, std::pair<size_t, size_t>()};
4523 return Loop{Loop::Type::oom, std::pair<size_t, size_t>()};
4525 return Loop{Loop::Type::rep,
4526 std::any_cast<std::pair<size_t, size_t>>(vs[0])};
4531 auto &data = *std::any_cast<Data *>(dt);
4536 auto is_macro = vs.
choice() == 0;
4537 auto ignore = std::any_cast<bool>(vs[0]);
4538 const auto &ident = std::any_cast<std::string>(vs[1]);
4540 std::vector<std::shared_ptr<Ope>> args;
4542 args = std::any_cast<std::vector<std::shared_ptr<Ope>>>(vs[2]);
4545 auto ope =
ref(*data.grammar, ident, vs.
sv().data(), is_macro, args);
4555 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4558 return tok(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
4561 return csc(std::any_cast<std::shared_ptr<Ope>>(vs[0]));
4564 const auto &name = std::any_cast<std::string_view>(vs[0]);
4565 auto ope = std::any_cast<std::shared_ptr<Ope>>(vs[1]);
4567 data.captures_stack.back().insert(name);
4568 data.captures_in_current_definition.insert(name);
4570 return cap(ope, [name](
const char *a_s,
size_t a_n,
Context &c) {
4575 return std::any_cast<std::shared_ptr<Ope>>(vs[0]);
4581 return std::string(vs.
sv().data(), vs.
sv().length());
4585 auto items = vs.
transform<std::string>();
4586 return dic(items,
false);
4589 auto items = vs.
transform<std::string>();
4590 return dic(items,
true);
4611 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4615 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4616 return cls(ranges,
true);
4619 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4620 return ncls(ranges);
4623 auto ranges = vs.
transform<std::pair<char32_t, char32_t>>();
4624 return ncls(ranges,
true);
4629 auto s1 = std::any_cast<std::string>(vs[0]);
4630 auto s2 = std::any_cast<std::string>(vs[1]);
4637 return std::pair(cp1, cp2);
4640 auto s = std::any_cast<std::string>(vs[0]);
4642 return std::pair(cp, cp);
4645 return std::pair<char32_t, char32_t>(0, 0);
4654 auto min = std::any_cast<size_t>(vs[0]);
4655 auto max = std::any_cast<size_t>(vs[1]);
4656 return std::pair(min, max);
4659 return std::pair(std::any_cast<size_t>(vs[0]),
4660 std::numeric_limits<size_t>::max());
4662 auto n = std::any_cast<size_t>(vs[0]);
4663 return std::pair(n, n);
4666 return std::pair(std::numeric_limits<size_t>::min(),
4667 std::any_cast<size_t>(vs[0]));
4674 g[
"CapScope"].enter = [](
const Context & ,
const char * ,
4675 size_t , std::any &dt) {
4676 auto &data = *std::any_cast<Data *>(dt);
4677 data.captures_stack.emplace_back();
4679 g[
"CapScope"].leave = [](
const Context & ,
const char * ,
4681 std::any & , std::any &dt) {
4682 auto &data = *std::any_cast<Data *>(dt);
4683 data.captures_stack.pop_back();
4699 auto &data = *std::any_cast<Data *>(dt);
4704 auto it = data.captures_stack.rbegin();
4705 while (it != data.captures_stack.rend()) {
4706 if (it->find(vs.
token()) != it->end()) {
4713 auto ptr = vs.
token().data() - 1;
4714 data.undefined_back_references.emplace_back(vs.
token(), ptr);
4720 if (data.captures_in_current_definition.find(vs.
token()) ==
4721 data.captures_in_current_definition.end()) {
4722 data.enablePackratParsing =
false;
4735 return vs.
transform<std::shared_ptr<Ope>>();
4741 for (
const auto &v : vs) {
4742 auto tokens = std::any_cast<std::vector<std::string_view>>(v);
4743 auto assoc = tokens[0][0];
4744 for (
size_t i = 1; i < tokens.size(); i++) {
4745 binOpeInfo[tokens[i]] = std::pair(level, assoc);
4750 instruction.
type =
"precedence";
4751 instruction.
data = binOpeInfo;
4752 instruction.
sv = vs.sv();
4756 return vs.
transform<std::string_view>();
4763 instruction.
type =
"error_message";
4764 instruction.
data = std::any_cast<std::string>(vs[0]);
4765 instruction.
sv = vs.
sv();
4771 instruction.
type =
"no_ast_opt";
4772 instruction.
sv = vs.
sv();
4783 const char *s,
Log log) {
4786 auto atom =
seq.opes_[0];
4789 auto binop = seq1.
opes_[0];
4790 auto atom1 = seq1.opes_[1];
4796 if (!
rep.is_zom() || atom_name != atom1_name || atom_name == binop_name) {
4799 log(line.first, line.second,
4800 "'precedence' instruction cannot be applied to '" + rule.
name +
4807 rule.
holder_->ope_ =
pre(atom, binop, info, rule);
4812 log(line.first, line.second,
4813 "'precedence' instruction cannot be applied to '" + rule.
name +
4823 Log log, std::string requested_start,
4824 bool enable_left_recursion =
true) {
4826 auto &grammar = *data.
grammar;
4833 rule <=
ref(grammar,
"x",
"",
false, {});
4835 rule.s_ =
"[native]";
4836 rule.ignoreSemanticValue =
true;
4837 rule.is_macro =
true;
4838 rule.params = {
"x"};
4843 std::any dt = &data;
4844 auto r =
g[
"Grammar"].parse(s, n, dt,
nullptr, log);
4848 if (r.error_info.message_pos) {
4849 auto line =
line_info(s, r.error_info.message_pos);
4850 log(line.first, line.second, r.error_info.message,
4851 r.error_info.label);
4853 auto line =
line_info(s, r.error_info.error_pos);
4854 log(line.first, line.second,
"syntax error", r.error_info.label);
4862 log(line.first, line.second, e.what(),
"");
4868 for (
auto [user_name, user_rule] : rules) {
4869 auto name = user_name;
4870 auto ignore =
false;
4871 if (!name.empty() && name[0] ==
'~') {
4875 if (!name.empty()) {
4876 auto &rule = grammar[name];
4879 rule.ignoreSemanticValue = ignore;
4890 log(line.first, line.second,
4891 "the definition '" + name +
"' is already defined.",
"");
4902 log(line.first, line.second,
4903 "the instruction '" + type +
"' is already defined.",
"");
4914 log(line.first, line.second,
4915 "the back reference '" + name +
"' is undefined.",
"");
4922 auto start = data.
start;
4924 if (!requested_start.empty()) {
4925 if (grammar.count(requested_start)) {
4926 start = requested_start;
4930 log(line.first, line.second,
4931 "the specified start rule '" + requested_start +
4939 if (!ret) {
return {}; }
4941 auto &start_rule = grammar[start];
4945 if (start_rule.ignoreSemanticValue) {
4947 auto line =
line_info(s, start_rule.s_);
4948 log(line.first, line.second,
4949 "ignore operator cannot be applied to '" + start_rule.name +
"'.",
4956 if (!ret) {
return {}; }
4959 auto referenced = std::unordered_set<std::string>{
4966 for (
auto &[_, rule] : grammar) {
4970 for (
const auto &[name, ptr] : vis.
error_s) {
4979 for (
auto &[name, rule] : grammar) {
4980 if (!referenced.count(name)) {
4983 auto msg =
"'" + name +
"' is not referenced.";
4984 log(line.first, line.second, msg,
"");
4989 if (!ret) {
return {}; }
4992 for (
auto &x : grammar) {
4993 auto &rule = x.second;
5000 bool changed =
true;
5003 for (
auto &[name, rule] : grammar) {
5006 if (vis.
result != rule.can_be_empty) {
5007 rule.can_be_empty = vis.
result;
5015 if (enable_left_recursion) {
5016 for (
auto &[name, rule] : grammar) {
5019 if (vis.
error_s) { rule.is_left_recursive =
true; }
5024 for (
auto &[name, rule] : grammar) {
5030 log(line.first, line.second,
"'" + name +
"' is left recursive.",
5037 if (!ret) {
return {}; }
5045 for (
auto &x : grammar) {
5046 auto &rule = x.second;
5047 auto ope = rule.get_core_operator();
5052 start_rule.whitespaceOpe =
wsp(rule.get_core_operator());
5060 start_rule.wordOpe = rule.get_core_operator();
5066 for (
const auto &[name, instructions] : data.
instructions) {
5067 auto &rule = grammar[name];
5069 for (
const auto &instruction : instructions) {
5070 if (instruction.type ==
"precedence") {
5072 std::any_cast<PrecedenceClimbing::BinOpeInfo>(instruction.data);
5075 }
else if (instruction.type ==
"error_message") {
5076 rule.error_message = std::any_cast<std::string>(instruction.data);
5077 }
else if (instruction.type ==
"no_ast_opt") {
5078 rule.no_ast_opt =
true;
5084 for (
auto &x : grammar) {
5086 x.second.accept(vis);
5093 const char *s)
const {
5094 std::vector<std::pair<const char *, std::string>> refs;
5095 std::unordered_map<std::string, bool> has_error_cache;
5101 log(line.first, line.second,
5102 "infinite loop is detected in '" + vis.
error_name +
"'.",
"");
5116template <
typename Annotation>
struct AstBase :
public Annotation {
5118 const std::vector<std::shared_ptr<AstBase>> &
nodes,
5165 std::vector<std::shared_ptr<AstBase<Annotation>>>
nodes;
5170 return std::string(
token);
5178template <
typename T>
5180 std::function<std::string(
const T &ast,
int level)> fn) {
5181 const auto &ast = *ptr;
5182 for (
auto i = 0; i < level; i++) {
5185 auto name = ast.original_name;
5186 if (ast.original_choice_count > 0) {
5187 name +=
"/" + std::to_string(ast.original_choice);
5189 if (ast.name != ast.original_name) { name +=
"[" + ast.name +
"]"; }
5191 s +=
"- " + name +
" (";
5195 s +=
"+ " + name +
"\n";
5197 if (fn) { s += fn(ast, level + 1); }
5198 for (
const auto &node : ast.nodes) {
5203template <
typename T>
5206 std::function<std::string(
const T &ast,
int level)> fn =
nullptr) {
5216 template <
typename T>
5217 std::shared_ptr<T>
optimize(std::shared_ptr<T> original,
5218 std::shared_ptr<T> parent =
nullptr) {
5223 if (
opt && original->nodes.size() == 1) {
5224 auto child =
optimize(original->nodes[0], parent);
5225 auto ast = std::make_shared<T>(*child, original->name.data(),
5226 original->position, original->length,
5227 original->choice_count, original->choice);
5228 for (
auto &node : ast->nodes) {
5234 auto ast = std::make_shared<T>(*original);
5235 ast->parent = parent;
5237 for (
const auto &node : original->nodes) {
5239 ast->nodes.push_back(child);
5254 auto line = vs.line_info();
5257 return std::make_shared<T>(
5258 vs.path, line.first, line.second, rule.
name.data(), vs.token(),
5259 std::distance(vs.ss, vs.sv().data()), vs.sv().length(),
5260 vs.choice_count(), vs.choice());
5264 std::make_shared<T>(vs.path, line.first, line.second, rule.
name.data(),
5265 vs.transform<std::shared_ptr<T>>(),
5266 std::distance(vs.ss, vs.sv().data()),
5267 vs.sv().length(), vs.choice_count(), vs.choice());
5269 for (
auto &node : ast->nodes) {
5276#define PEG_EXPAND(...) __VA_ARGS__
5277#define PEG_CONCAT(a, b) a##b
5278#define PEG_CONCAT2(a, b) PEG_CONCAT(a, b)
5281 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, \
5282 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, \
5283 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, \
5284 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, \
5285 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76, \
5286 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, \
5287 a92, a93, a94, a95, a96, a97, a98, a99, a100, ...) \
5290#define PEG_COUNT(...) \
5291 PEG_EXPAND(PEG_PICK( \
5292 __VA_ARGS__, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, \
5293 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, \
5294 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, \
5295 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
5296 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, \
5297 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
5299#define PEG_DEF_1(r) \
5300 peg::Definition r; \
5302 peg::add_ast_action(r);
5304#define PEG_DEF_2(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_1(__VA_ARGS__))
5305#define PEG_DEF_3(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_2(__VA_ARGS__))
5306#define PEG_DEF_4(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_3(__VA_ARGS__))
5307#define PEG_DEF_5(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_4(__VA_ARGS__))
5308#define PEG_DEF_6(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_5(__VA_ARGS__))
5309#define PEG_DEF_7(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_6(__VA_ARGS__))
5310#define PEG_DEF_8(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_7(__VA_ARGS__))
5311#define PEG_DEF_9(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_8(__VA_ARGS__))
5312#define PEG_DEF_10(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_9(__VA_ARGS__))
5313#define PEG_DEF_11(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_10(__VA_ARGS__))
5314#define PEG_DEF_12(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_11(__VA_ARGS__))
5315#define PEG_DEF_13(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_12(__VA_ARGS__))
5316#define PEG_DEF_14(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_13(__VA_ARGS__))
5317#define PEG_DEF_15(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_14(__VA_ARGS__))
5318#define PEG_DEF_16(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_15(__VA_ARGS__))
5319#define PEG_DEF_17(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_16(__VA_ARGS__))
5320#define PEG_DEF_18(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_17(__VA_ARGS__))
5321#define PEG_DEF_19(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_18(__VA_ARGS__))
5322#define PEG_DEF_20(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_19(__VA_ARGS__))
5323#define PEG_DEF_21(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_20(__VA_ARGS__))
5324#define PEG_DEF_22(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_21(__VA_ARGS__))
5325#define PEG_DEF_23(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_22(__VA_ARGS__))
5326#define PEG_DEF_24(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_23(__VA_ARGS__))
5327#define PEG_DEF_25(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_24(__VA_ARGS__))
5328#define PEG_DEF_26(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_25(__VA_ARGS__))
5329#define PEG_DEF_27(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_26(__VA_ARGS__))
5330#define PEG_DEF_28(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_27(__VA_ARGS__))
5331#define PEG_DEF_29(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_28(__VA_ARGS__))
5332#define PEG_DEF_30(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_29(__VA_ARGS__))
5333#define PEG_DEF_31(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_30(__VA_ARGS__))
5334#define PEG_DEF_32(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_31(__VA_ARGS__))
5335#define PEG_DEF_33(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_32(__VA_ARGS__))
5336#define PEG_DEF_34(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_33(__VA_ARGS__))
5337#define PEG_DEF_35(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_34(__VA_ARGS__))
5338#define PEG_DEF_36(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_35(__VA_ARGS__))
5339#define PEG_DEF_37(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_36(__VA_ARGS__))
5340#define PEG_DEF_38(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_37(__VA_ARGS__))
5341#define PEG_DEF_39(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_38(__VA_ARGS__))
5342#define PEG_DEF_40(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_39(__VA_ARGS__))
5343#define PEG_DEF_41(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_40(__VA_ARGS__))
5344#define PEG_DEF_42(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_41(__VA_ARGS__))
5345#define PEG_DEF_43(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_42(__VA_ARGS__))
5346#define PEG_DEF_44(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_43(__VA_ARGS__))
5347#define PEG_DEF_45(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_44(__VA_ARGS__))
5348#define PEG_DEF_46(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_45(__VA_ARGS__))
5349#define PEG_DEF_47(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_46(__VA_ARGS__))
5350#define PEG_DEF_48(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_47(__VA_ARGS__))
5351#define PEG_DEF_49(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_48(__VA_ARGS__))
5352#define PEG_DEF_50(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_49(__VA_ARGS__))
5353#define PEG_DEF_51(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_50(__VA_ARGS__))
5354#define PEG_DEF_52(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_51(__VA_ARGS__))
5355#define PEG_DEF_53(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_52(__VA_ARGS__))
5356#define PEG_DEF_54(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_53(__VA_ARGS__))
5357#define PEG_DEF_55(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_54(__VA_ARGS__))
5358#define PEG_DEF_56(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_55(__VA_ARGS__))
5359#define PEG_DEF_57(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_56(__VA_ARGS__))
5360#define PEG_DEF_58(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_57(__VA_ARGS__))
5361#define PEG_DEF_59(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_58(__VA_ARGS__))
5362#define PEG_DEF_60(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_59(__VA_ARGS__))
5363#define PEG_DEF_61(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_60(__VA_ARGS__))
5364#define PEG_DEF_62(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_61(__VA_ARGS__))
5365#define PEG_DEF_63(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_62(__VA_ARGS__))
5366#define PEG_DEF_64(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_63(__VA_ARGS__))
5367#define PEG_DEF_65(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_64(__VA_ARGS__))
5368#define PEG_DEF_66(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_65(__VA_ARGS__))
5369#define PEG_DEF_67(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_66(__VA_ARGS__))
5370#define PEG_DEF_68(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_67(__VA_ARGS__))
5371#define PEG_DEF_69(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_68(__VA_ARGS__))
5372#define PEG_DEF_70(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_69(__VA_ARGS__))
5373#define PEG_DEF_71(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_70(__VA_ARGS__))
5374#define PEG_DEF_72(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_71(__VA_ARGS__))
5375#define PEG_DEF_73(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_72(__VA_ARGS__))
5376#define PEG_DEF_74(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_73(__VA_ARGS__))
5377#define PEG_DEF_75(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_74(__VA_ARGS__))
5378#define PEG_DEF_76(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_75(__VA_ARGS__))
5379#define PEG_DEF_77(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_76(__VA_ARGS__))
5380#define PEG_DEF_78(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_77(__VA_ARGS__))
5381#define PEG_DEF_79(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_78(__VA_ARGS__))
5382#define PEG_DEF_80(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_79(__VA_ARGS__))
5383#define PEG_DEF_81(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_80(__VA_ARGS__))
5384#define PEG_DEF_82(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_81(__VA_ARGS__))
5385#define PEG_DEF_83(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_82(__VA_ARGS__))
5386#define PEG_DEF_84(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_83(__VA_ARGS__))
5387#define PEG_DEF_85(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_84(__VA_ARGS__))
5388#define PEG_DEF_86(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_85(__VA_ARGS__))
5389#define PEG_DEF_87(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_86(__VA_ARGS__))
5390#define PEG_DEF_88(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_87(__VA_ARGS__))
5391#define PEG_DEF_89(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_88(__VA_ARGS__))
5392#define PEG_DEF_90(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_89(__VA_ARGS__))
5393#define PEG_DEF_91(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_90(__VA_ARGS__))
5394#define PEG_DEF_92(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_91(__VA_ARGS__))
5395#define PEG_DEF_93(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_92(__VA_ARGS__))
5396#define PEG_DEF_94(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_93(__VA_ARGS__))
5397#define PEG_DEF_95(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_94(__VA_ARGS__))
5398#define PEG_DEF_96(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_95(__VA_ARGS__))
5399#define PEG_DEF_97(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_96(__VA_ARGS__))
5400#define PEG_DEF_98(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_97(__VA_ARGS__))
5401#define PEG_DEF_99(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_98(__VA_ARGS__))
5402#define PEG_DEF_100(r1, ...) PEG_EXPAND(PEG_DEF_1(r1) PEG_DEF_99(__VA_ARGS__))
5404#define AST_DEFINITIONS(...) \
5405 PEG_EXPAND(PEG_CONCAT2(PEG_DEF_, PEG_COUNT(__VA_ARGS__))(__VA_ARGS__))
5416 std::string_view start = {}) {
5420 parser(
const char *s,
size_t n, std::string_view start = {})
5423 parser(std::string_view sv,
const Rules &rules, std::string_view start = {})
5424 :
parser(sv.data(), sv.size(), rules, start) {}
5426 parser(std::string_view sv, std::string_view start = {})
5429#if defined(__cpp_lib_char8_t)
5430 parser(std::u8string_view sv,
const Rules &rules, std::string_view start = {})
5431 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(), rules,
5434 parser(std::u8string_view sv, std::string_view start = {})
5435 :
parser(reinterpret_cast<const char *>(sv.data()), sv.size(),
Rules(),
5442 std::string_view start = {}) {
5456 std::string_view start = {}) {
5457 return load_grammar(sv.data(), sv.size(), rules, start);
5464 bool parse_n(
const char *s,
size_t n,
const char *path =
nullptr)
const {
5466 const auto &rule = (*grammar_)[
start_];
5467 auto result = rule.parse(s, n, path,
log_);
5473 bool parse_n(
const char *s,
size_t n, std::any &dt,
5474 const char *path =
nullptr)
const {
5476 const auto &rule = (*grammar_)[
start_];
5477 auto result = rule.parse(s, n, dt, path,
log_);
5483 template <
typename T>
5485 const char *path =
nullptr)
const {
5487 const auto &rule = (*grammar_)[
start_];
5488 auto result = rule.parse_and_get_value(s, n, val, path,
log_);
5494 template <
typename T>
5495 bool parse_n(
const char *s,
size_t n, std::any &dt, T &val,
5496 const char *path =
nullptr)
const {
5498 const auto &rule = (*grammar_)[
start_];
5499 auto result = rule.parse_and_get_value(s, n, dt, val, path,
log_);
5505 bool parse(std::string_view sv,
const char *path =
nullptr)
const {
5506 return parse_n(sv.data(), sv.size(), path);
5509 bool parse(std::string_view sv, std::any &dt,
5510 const char *path =
nullptr)
const {
5511 return parse_n(sv.data(), sv.size(), dt, path);
5514 template <
typename T>
5515 bool parse(std::string_view sv, T &val,
const char *path =
nullptr)
const {
5516 return parse_n(sv.data(), sv.size(), val, path);
5519 template <
typename T>
5520 bool parse(std::string_view sv, std::any &dt, T &val,
5521 const char *path =
nullptr)
const {
5522 return parse_n(sv.data(), sv.size(), dt, val, path);
5525#if defined(__cpp_lib_char8_t)
5526 bool parse(std::u8string_view sv,
const char *path =
nullptr)
const {
5527 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), path);
5530 bool parse(std::u8string_view sv, std::any &dt,
5531 const char *path =
nullptr)
const {
5532 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
5536 template <
typename T>
5537 bool parse(std::u8string_view sv, T &val,
const char *path =
nullptr)
const {
5538 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), val,
5542 template <
typename T>
5543 bool parse(std::u8string_view sv, std::any &dt, T &val,
5544 const char *path =
nullptr)
const {
5545 return parse_n(
reinterpret_cast<const char *
>(sv.data()), sv.size(), dt,
5558 auto &rule = (*grammar_)[
start_];
5559 rule.eoi_check =
false;
5569 auto &rule = (*grammar_)[
start_];
5576 auto &rule = (*grammar_)[
start_];
5577 rule.tracer_enter = tracer_enter;
5578 rule.tracer_leave = tracer_leave;
5586 auto &rule = (*grammar_)[
start_];
5587 rule.tracer_enter = tracer_enter;
5588 rule.tracer_leave = tracer_leave;
5589 rule.tracer_start = tracer_start;
5590 rule.tracer_end = tracer_end;
5596 auto &rule = (*grammar_)[
start_];
5597 rule.verbose_trace = verbose_trace;
5602 for (
auto &[_, rule] : *
grammar_) {
5608 template <
typename T>
5610 bool opt_mode =
true)
const {
5617 std::function<
void(
size_t line,
size_t col,
const std::string &msg)>
5619 log_ = [log](
size_t line,
size_t col,
const std::string &msg,
5620 const std::string & ) { log(line, col, msg); };
5630 std::vector<std::string> rules;
5631 for (
auto &[name, rule] : *
grammar_) {
5632 if (rule.no_ast_opt) { rules.push_back(name); }
5650 [&](
auto &ope,
auto s,
auto,
auto &,
auto &c,
auto &,
auto &trace_data) {
5651 auto prev_pos = std::any_cast<size_t>(trace_data);
5652 auto pos =
static_cast<size_t>(s - c.s);
5653 auto backtrack = (pos < prev_pos ?
"*" :
"");
5655 auto level = c.trace_ids.size() - 1;
5666 os <<
"E " << pos + 1 << backtrack <<
"\t" << indent <<
"┌" << name
5667 <<
" #" << c.trace_ids.back() << std::endl;
5668 trace_data =
static_cast<size_t>(pos);
5670 [&](
auto &ope,
auto s,
auto,
auto &sv,
auto &c,
auto &,
auto len,
5672 auto pos =
static_cast<size_t>(s - c.s);
5673 if (len !=
static_cast<size_t>(-1)) { pos += len; }
5675 auto level = c.trace_ids.size() - 1;
5679 auto ret = len !=
static_cast<size_t>(-1) ?
"└o " :
"└x ";
5681 std::stringstream choice;
5682 if (sv.choice_count() > 0) {
5683 choice <<
" " << sv.choice() <<
"/" << sv.choice_count();
5686 if (!sv.tokens.empty()) {
5687 token +=
", token '";
5688 token += sv.tokens[0];
5691 std::string matched;
5696 os <<
"L " << pos + 1 <<
"\t" << indent << ret << name <<
" #"
5697 << c.trace_ids.back() << choice.str() << token << matched
5700 [&](
auto &trace_data) { trace_data =
static_cast<size_t>(0); },
5715 std::vector<Item> items;
5716 std::map<std::string, size_t> index;
5718 std::chrono::steady_clock::time_point start;
5722 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &, std::any &trace_data) {
5723 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
5724 auto &stats = *std::any_cast<Stats *>(trace_data);
5726 auto &name = holder->name();
5727 if (stats.index.find(name) == stats.index.end()) {
5728 stats.index[name] = stats.index.size();
5729 stats.items.push_back({name, 0, 0});
5734 [&](
auto &ope,
auto,
auto,
auto &,
auto &,
auto &,
auto len,
5735 std::any &trace_data) {
5736 if (
auto holder =
dynamic_cast<const peg::Holder *
>(&ope)) {
5737 auto &stats = *std::any_cast<Stats *>(trace_data);
5739 auto &name = holder->name();
5740 auto index = stats.index[name];
5741 auto &stat = stats.items[index];
5742 if (len !=
static_cast<size_t>(-1)) {
5749 auto end = std::chrono::steady_clock::now();
5750 auto nano = std::chrono::duration_cast<std::chrono::microseconds>(
5753 auto sec = nano / 1000000.0;
5754 os <<
"duration: " << sec <<
"s (" << nano <<
"µs)" << std::endl
5758 size_t total_success = 0;
5759 size_t total_fail = 0;
5765 os <<
" id total % success fail "
5769 auto grand_total = total_success + total_fail;
5770 snprintf(buff, BUFSIZ,
"%4s %10zu %5s %10zu %10zu %s",
"",
5771 grand_total,
"", total_success, total_fail,
5773 os << buff << std::endl;
5775 snprintf(buff, BUFSIZ,
"%4s %10s %5s %10.2f %10.2f %s",
"",
"",
5776 "", total_success * 100.0 / grand_total,
5777 total_fail * 100.0 / grand_total,
"% success/fail");
5778 os << buff << std::endl << std::endl;
5784 auto ratio = total * 100.0 / stats.total;
5785 snprintf(buff, BUFSIZ,
"%4zu %10zu %5.2f %10zu %10zu %s",
id,
5787 os << buff << std::endl;
5793 [&](
auto &trace_data) {
5794 auto stats =
new Stats{};
5795 stats->start = std::chrono::steady_clock::now();
5798 [&](
auto &trace_data) {
5799 auto stats = std::any_cast<Stats *>(trace_data);
void operator=(F fn)
Definition peglib.h:647
Action(Action &&rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:661
std::function< std::any(SemanticValues &vs, std::any &dt, const std::any &predicate_data)> Fty
Definition peglib.h:658
std::any operator()(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:652
Fty fn_
Definition peglib.h:677
Action(F fn)
Definition peglib.h:646
Action & operator=(const Action &rhs)=default
AndPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1377
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1379
std::shared_ptr< Ope > ope_
Definition peglib.h:1393
void accept(Visitor &v) override
Definition peglib.h:3597
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1589
void accept(Visitor &v) override
Definition peglib.h:3603
std::string name_
Definition peglib.h:1780
BackReference(const std::string &name)
Definition peglib.h:1773
BackReference(std::string &&name)
Definition peglib.h:1771
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3435
void accept(Visitor &v) override
Definition peglib.h:3613
void accept(Visitor &v) override
Definition peglib.h:3604
CaptureScope(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1604
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1606
std::shared_ptr< Ope > ope_
Definition peglib.h:1616
MatchAction match_action_
Definition peglib.h:1636
std::function< void(const char *s, size_t n, Context &c)> MatchAction
Definition peglib.h:1621
std::shared_ptr< Ope > ope_
Definition peglib.h:1635
void accept(Visitor &v) override
Definition peglib.h:3605
Capture(const std::shared_ptr< Ope > &ope, MatchAction ma)
Definition peglib.h:1623
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1626
bool negated_
Definition peglib.h:1554
bool ignore_case_
Definition peglib.h:1555
std::vector< std::pair< char32_t, char32_t > > ranges_
Definition peglib.h:1553
CharacterClass(const std::string &s, bool negated, bool ignore_case)
Definition peglib.h:1461
void setup_ascii_bitset()
Definition peglib.h:1535
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1488
bool in_range(const std::pair< char32_t, char32_t > &range, char32_t cp) const
Definition peglib.h:1525
CharacterClass(const std::vector< std::pair< char32_t, char32_t > > &ranges, bool negated, bool ignore_case)
Definition peglib.h:1481
bool is_ascii_only_
Definition peglib.h:1557
bool is_ascii_only() const
Definition peglib.h:1521
friend struct ComputeFirstSet
Definition peglib.h:1519
const std::bitset< 256 > & ascii_bitset() const
Definition peglib.h:1522
void accept(Visitor &v) override
Definition peglib.h:3601
std::bitset< 256 > ascii_bitset_
Definition peglib.h:1556
Character(char32_t ch)
Definition peglib.h:1562
char32_t ch_
Definition peglib.h:1583
void accept(Visitor &v) override
Definition peglib.h:3602
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1564
size_t in_token_boundary_count
Definition peglib.h:826
std::vector< Definition * > rule_stack
Definition peglib.h:823
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:3069
std::vector< std::pair< std::string_view, std::string > > capture_entries
Definition peglib.h:833
std::once_flag source_line_index_init_
Definition peglib.h:1074
std::shared_ptr< Ope > wordOpe
Definition peglib.h:831
std::set< std::pair< const Definition *, const char * > > lr_active_seeds
Definition peglib.h:858
void trace_enter(const Ope &ope, const char *a_s, size_t n, const SemanticValues &vs, std::any &dt)
Definition peglib.h:3063
TracerEnter tracer_enter
Definition peglib.h:883
std::vector< bool > cut_stack
Definition peglib.h:835
size_t skip_whitespace(const char *a_s, size_t n, SemanticValues &vs, std::any &dt)
Definition peglib.h:3020
const std::vector< std::shared_ptr< Ope > > & top_args() const
Definition peglib.h:1005
std::vector< bool > cache_success
Definition peglib.h:840
std::set< const Definition * > lr_refs_hit
Definition peglib.h:854
Context operator=(const Context &)=delete
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:828
void clear_packrat_cache(const char *pos, size_t def_id)
Definition peglib.h:860
std::map< std::pair< size_t, size_t >, std::tuple< size_t, std::any > > cache_values
Definition peglib.h:843
const size_t def_count
Definition peglib.h:837
std::map< std::pair< const Definition *, const char * >, LRMemo > lr_memo
Definition peglib.h:850
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:890
const bool verbose_trace
Definition peglib.h:886
Log log
Definition peglib.h:888
std::vector< PackratStats > * packrat_stats
Definition peglib.h:919
const char * s
Definition peglib.h:814
size_t next_trace_id
Definition peglib.h:1071
SemanticValues & push_semantic_values_scope()
Definition peglib.h:974
void pop_semantic_values_scope()
Definition peglib.h:996
bool is_traceable(const Ope &ope) const
Definition peglib.h:3076
const char * path
Definition peglib.h:813
std::any trace_data
Definition peglib.h:885
TracerLeave tracer_leave
Definition peglib.h:884
Snapshot snapshot(const SemanticValues &vs) const
Definition peglib.h:1020
std::vector< size_t > trace_ids
Definition peglib.h:1072
void write_packrat_cache(const char *pos, size_t def_id, size_t len, const std::any &val)
Definition peglib.h:871
size_t value_stack_size
Definition peglib.h:821
const size_t l
Definition peglib.h:815
void push_args(std::vector< std::shared_ptr< Ope > > &&args)
Definition peglib.h:999
void pop_args()
Definition peglib.h:1003
ErrorInfo error_info
Definition peglib.h:817
std::vector< bool > cache_registered
Definition peglib.h:839
bool in_whitespace
Definition peglib.h:829
std::pair< size_t, size_t > line_info(const char *cur) const
Definition peglib.h:1052
std::vector< size_t > source_line_index
Definition peglib.h:1075
bool recovered
Definition peglib.h:818
std::vector< std::shared_ptr< SemanticValues > > value_stack
Definition peglib.h:820
~Context()
Definition peglib.h:905
void packrat(const char *a_s, size_t def_id, size_t &len, std::any &val, T fn)
Definition peglib.h:927
const bool enablePackratParsing
Definition peglib.h:838
void rollback(SemanticValues &vs, const Snapshot &snap)
Definition peglib.h:1025
Context(const Context &)=delete
void set_error_pos(const char *a_s, const char *literal=nullptr)
Definition peglib.h:3029
bool ignore_trace_state
Definition peglib.h:1073
const std::vector< bool > * packrat_rule_filter
Definition peglib.h:924
std::vector< std::vector< std::shared_ptr< Ope > > > args_stack
Definition peglib.h:824
void accept(Visitor &v) override
Definition peglib.h:3616
size_t parse_core(const char *, size_t, SemanticValues &, Context &c, std::any &) const override
Definition peglib.h:1825
std::shared_ptr< Ope > wordOpe
Definition peglib.h:2776
bool is_macro
Definition peglib.h:2778
bool ignoreSemanticValue
Definition peglib.h:2774
bool eoi_check
Definition peglib.h:2793
Predicate predicate
Definition peglib.h:2765
Definition & operator<=(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2614
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:2773
void initialize_packrat_filter() const
Definition peglib.h:3980
Definition()
Definition peglib.h:2599
Result parse(const char *s, std::any &dt, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2638
bool is_left_recursive
Definition peglib.h:2781
bool disable_action
Definition peglib.h:2780
TracerEnter tracer_enter
Definition peglib.h:2784
std::vector< std::string > params
Definition peglib.h:2779
std::once_flag packrat_filter_init_
Definition peglib.h:2883
Definition & operator~()
Definition peglib.h:2745
Result parse(const char *s, size_t n, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2619
bool enablePackratParsing
Definition peglib.h:2777
std::pair< size_t, size_t > line_
Definition peglib.h:2763
friend class ParserGenerator
Definition peglib.h:2801
std::vector< bool > packrat_filter_
Definition peglib.h:2884
std::once_flag is_token_init_
Definition peglib.h:2878
TracerStartOrEnd tracer_end
Definition peglib.h:2788
std::vector< Context::PackratStats > packrat_stats_
Definition peglib.h:2797
std::once_flag definition_ids_init_
Definition peglib.h:2881
bool collect_packrat_stats
Definition peglib.h:2796
bool no_ast_opt
Definition peglib.h:2791
Definition & operator,(T fn)
Definition peglib.h:2740
friend class Reference
Definition peglib.h:2800
void operator=(Action a)
Definition peglib.h:2738
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:2665
Result parse(const char *s, size_t n, std::any &dt, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2632
std::unordered_map< void *, size_t > definition_ids_
Definition peglib.h:2882
Result parse_and_get_value(const char *s, size_t n, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2645
std::once_flag assign_id_to_definition_init_
Definition peglib.h:2880
TracerLeave tracer_leave
Definition peglib.h:2785
size_t id
Definition peglib.h:2767
bool can_be_empty
Definition peglib.h:2782
std::shared_ptr< Ope > whitespaceOpe
Definition peglib.h:2775
bool is_token() const
Definition peglib.h:2754
Result parse_and_get_value(const char *s, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2658
Definition & operator=(Definition &&rhs)
bool is_token_
Definition peglib.h:2879
Definition(const Definition &rhs)
Definition peglib.h:2601
Result parse_core(const char *s, size_t n, SemanticValues &vs, std::any &dt, const char *path, Log log) const
Definition peglib.h:2818
Definition & operator=(const Definition &rhs)
void accept(Ope::Visitor &v)
Definition peglib.h:2750
bool verbose_trace
Definition peglib.h:2786
std::string name
Definition peglib.h:2761
std::shared_ptr< Holder > holder_
Definition peglib.h:2877
std::string error_message
Definition peglib.h:2790
std::function< void(const Context &c, const char *s, size_t n, std::any &dt)> enter
Definition peglib.h:2770
Result parse_and_get_value(const char *s, std::any &dt, T &val, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2677
TracerStartOrEnd tracer_start
Definition peglib.h:2787
Action action
Definition peglib.h:2768
Result parse(const char *s, const char *path=nullptr, Log log=nullptr) const
Definition peglib.h:2626
void initialize_definition_ids() const
Definition peglib.h:2806
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:2752
Definition(const std::shared_ptr< Ope > &ope)
Definition peglib.h:2605
const char * s_
Definition peglib.h:2762
Dictionary(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:1420
void accept(Visitor &v) override
Definition peglib.h:3599
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3095
Trie trie_
Definition peglib.h:1430
Holder(Definition *outer)
Definition peglib.h:1704
const std::string & name() const
Definition peglib.h:3385
Definition * outer_
Definition peglib.h:1718
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3172
const std::string & trace_name() const
Definition peglib.h:3387
void accept(Visitor &v) override
Definition peglib.h:3610
std::string trace_name_
Definition peglib.h:1720
friend class Definition
Definition peglib.h:1722
std::once_flag trace_name_init_
Definition peglib.h:1719
std::any reduce(SemanticValues &vs, std::any &dt, const std::any &predicate_data) const
Definition peglib.h:3374
std::shared_ptr< Ope > ope_
Definition peglib.h:1717
void accept(Visitor &v) override
Definition peglib.h:3607
Ignore(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1655
std::shared_ptr< Ope > ope_
Definition peglib.h:1666
size_t parse_core(const char *s, size_t n, SemanticValues &, Context &c, std::any &dt) const override
Definition peglib.h:1657
void accept(Visitor &v) override
Definition peglib.h:3600
bool ignore_case_
Definition peglib.h:1452
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3140
std::string lower_lit_
Definition peglib.h:1453
std::string lit_
Definition peglib.h:1451
LiteralString(std::string &&s, bool ignore_case)
Definition peglib.h:1436
std::once_flag init_is_word_
Definition peglib.h:1454
bool is_word_
Definition peglib.h:1455
LiteralString(const std::string &s, bool ignore_case)
Definition peglib.h:1441
std::shared_ptr< Ope > ope_
Definition peglib.h:1415
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1400
NotPredicate(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1398
void accept(Visitor &v) override
Definition peglib.h:3598
bool is_choice_like
Definition peglib.h:1093
bool is_token_boundary
Definition peglib.h:1092
size_t parse(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:3084
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:4178
std::pair< size_t, size_t > line_info() const
Definition peglib.h:4175
SyntaxErrorException(const char *what_arg, std::pair< size_t, size_t > r)
Definition peglib.h:4172
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:4822
bool apply_precedence_instruction(Definition &rule, const PrecedenceClimbing::BinOpeInfo &info, const char *s, Log log)
Definition peglib.h:4781
void make_grammar()
Definition peglib.h:4181
Grammar g
Definition peglib.h:5109
ParserGenerator()
Definition peglib.h:4140
static bool parse_test(const char *d, const char *s)
Definition peglib.h:4119
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:4111
bool detect_infiniteLoop(const Data &data, Definition &rule, const Log &log, const char *s) const
Definition peglib.h:5092
static ParserGenerator & get_instance()
Definition peglib.h:4135
void setup_actions()
Definition peglib.h:4366
std::shared_ptr< Ope > atom_
Definition peglib.h:1799
std::map< std::string_view, std::pair< size_t, char > > BinOpeInfo
Definition peglib.h:1785
PrecedenceClimbing(const std::shared_ptr< Ope > &atom, const std::shared_ptr< Ope > &binop, const BinOpeInfo &info, const Definition &rule)
Definition peglib.h:1787
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1792
const Definition & rule_
Definition peglib.h:1802
std::shared_ptr< Ope > binop_
Definition peglib.h:1800
Definition & get_reference_for_binop(Context &c) const
Definition peglib.h:3456
BinOpeInfo info_
Definition peglib.h:1801
void accept(Visitor &v) override
Definition peglib.h:3614
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:3468
bool operator()(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data) const
Definition peglib.h:690
Predicate & operator=(const Predicate &rhs)=default
Fty make_adaptor(F fn)
Definition peglib.h:699
Fty fn_
Definition peglib.h:711
Predicate(Predicate &&rhs)=default
Predicate(F fn)
Definition peglib.h:684
void operator=(F fn)
Definition peglib.h:685
std::function< bool(const SemanticValues &vs, const std::any &dt, std::string &msg, std::any &predicate_data)> Fty
Definition peglib.h:696
PrioritizedChoice(bool for_label, const Args &...args)
Definition peglib.h:1214
size_t size() const
Definition peglib.h:1288
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1228
void accept(Visitor &v) override
Definition peglib.h:3595
bool for_label_
Definition peglib.h:1291
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1290
PrioritizedChoice(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1219
std::vector< FirstSet > first_sets_
Definition peglib.h:1292
PrioritizedChoice(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1223
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3545
void accept(Visitor &v) override
Definition peglib.h:3615
Recovery(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1813
std::shared_ptr< Ope > ope_
Definition peglib.h:1820
const std::string name_
Definition peglib.h:1742
Definition * rule_
Definition peglib.h:1748
std::shared_ptr< Ope > get_core_operator() const
Definition peglib.h:3431
const char * s_
Definition peglib.h:1743
void accept(Visitor &v) override
Definition peglib.h:3611
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3393
const bool is_macro_
Definition peglib.h:1745
const std::vector< std::shared_ptr< Ope > > args_
Definition peglib.h:1746
size_t iarg_
Definition peglib.h:1749
const Grammar & grammar_
Definition peglib.h:1741
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:1729
static std::shared_ptr< Repetition > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1354
static std::shared_ptr< Repetition > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1364
bool is_zom() const
Definition peglib.h:1350
const std::bitset< 256 > * span_bitset_
Definition peglib.h:1371
Repetition(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:1297
std::shared_ptr< Ope > ope_
Definition peglib.h:1368
size_t max_
Definition peglib.h:1370
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:1300
size_t min_
Definition peglib.h:1369
static std::shared_ptr< Repetition > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1359
Sequence(std::vector< std::shared_ptr< Ope > > &&opes)
Definition peglib.h:1119
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1121
std::unique_ptr< KeywordGuardData > kw_guard_
Definition peglib.h:1146
std::vector< std::shared_ptr< Ope > > opes_
Definition peglib.h:1142
std::optional< size_t > parse_keyword_guarded(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const
Definition peglib.h:1149
void accept(Visitor &v) override
Definition peglib.h:3594
Sequence(const Args &...args)
Definition peglib.h:1116
Sequence(const std::vector< std::shared_ptr< Ope > > &opes)
Definition peglib.h:1118
friend struct SetupFirstSets
Definition peglib.h:1145
void accept(Visitor &v) override
Definition peglib.h:3606
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:3147
std::shared_ptr< Ope > ope_
Definition peglib.h:1650
TokenBoundary(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1641
size_t max_len_
Definition peglib.h:465
std::map< std::string, Info, std::less<> > dic_
Definition peglib.h:461
size_t match(const char *text, size_t text_len, size_t &id) const
Definition peglib.h:419
friend struct ComputeFirstSet
Definition peglib.h:450
Trie(const std::vector< std::string > &items, bool ignore_case)
Definition peglib.h:397
size_t size() const
Definition peglib.h:447
bool ignore_case_
Definition peglib.h:463
size_t items_count_
Definition peglib.h:464
size_t items_count() const
Definition peglib.h:448
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn_
Definition peglib.h:1683
void accept(Visitor &v) override
Definition peglib.h:3608
User(Parser fn)
Definition peglib.h:1674
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &, std::any &dt) const override
Definition peglib.h:1675
WeakHolder(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1688
void accept(Visitor &v) override
Definition peglib.h:3609
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1690
std::weak_ptr< Ope > weak_
Definition peglib.h:1699
std::shared_ptr< Ope > ope_
Definition peglib.h:1766
size_t parse_core(const char *s, size_t n, SemanticValues &vs, Context &c, std::any &dt) const override
Definition peglib.h:1756
void accept(Visitor &v) override
Definition peglib.h:3612
Whitespace(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1754
parser(const char *s, size_t n, std::string_view start={})
Definition peglib.h:5420
Log log_
Definition peglib.h:5641
bool enablePackratParsing_
Definition peglib.h:5640
parser(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:5415
bool parse_n(const char *s, size_t n, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:5495
std::string start_
Definition peglib.h:5638
const Grammar & get_grammar() const
Definition peglib.h:5554
std::shared_ptr< Grammar > grammar_
Definition peglib.h:5637
bool parse_n(const char *s, size_t n, std::any &dt, const char *path=nullptr) const
Definition peglib.h:5473
void set_logger(Log log)
Definition peglib.h:5614
bool enableLeftRecursion_
Definition peglib.h:5639
bool load_grammar(std::string_view sv, std::string_view start={})
Definition peglib.h:5460
void enable_packrat_parsing()
Definition peglib.h:5567
parser & enable_ast()
Definition peglib.h:5601
parser(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:5423
void disable_eoi_check()
Definition peglib.h:5556
bool load_grammar(const char *s, size_t n, std::string_view start={})
Definition peglib.h:5451
std::shared_ptr< T > optimize_ast(std::shared_ptr< T > ast, bool opt_mode=true) const
Definition peglib.h:5609
void set_verbose_trace(bool verbose_trace)
Definition peglib.h:5594
void enable_left_recursion(bool enable=true)
Definition peglib.h:5563
const Definition & operator[](const char *s) const
Definition peglib.h:5552
bool parse_n(const char *s, size_t n, T &val, const char *path=nullptr) const
Definition peglib.h:5484
bool parse(std::string_view sv, std::any &dt, const char *path=nullptr) const
Definition peglib.h:5509
parser(std::string_view sv, std::string_view start={})
Definition peglib.h:5426
void set_logger(std::function< void(size_t line, size_t col, const std::string &msg)> log)
Definition peglib.h:5616
bool load_grammar(const char *s, size_t n, const Rules &rules, std::string_view start={})
Definition peglib.h:5441
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave)
Definition peglib.h:5574
bool parse(std::string_view sv, std::any &dt, T &val, const char *path=nullptr) const
Definition peglib.h:5520
bool post_process(const char *s, size_t n, Definition::Result &r) const
Definition peglib.h:5624
std::vector< std::string > get_no_ast_opt_rules() const
Definition peglib.h:5629
bool load_grammar(std::string_view sv, const Rules &rules, std::string_view start={})
Definition peglib.h:5455
bool parse(std::string_view sv, T &val, const char *path=nullptr) const
Definition peglib.h:5515
Definition & operator[](const char *s)
Definition peglib.h:5550
bool parse_n(const char *s, size_t n, const char *path=nullptr) const
Definition peglib.h:5464
bool parse(std::string_view sv, const char *path=nullptr) const
Definition peglib.h:5505
void enable_trace(TracerEnter tracer_enter, TracerLeave tracer_leave, TracerStartOrEnd tracer_start, TracerStartOrEnd tracer_end)
Definition peglib.h:5582
Definition filter_string.h:27
std::string escape_characters(const char *s, size_t n)
Definition peglib.h:222
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:2891
static const char * WORD_DEFINITION_NAME
Definition peglib.h:2584
const char * u8(const T *s)
Definition peglib.h:214
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:1939
size_t encode_codepoint(char32_t cp, char *buff)
Definition peglib.h:115
std::shared_ptr< Ope > cut()
Definition peglib.h:1964
std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> Parser
Definition peglib.h:1669
std::shared_ptr< Ope > tok(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1924
std::shared_ptr< Ope > csc(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1915
bool decode_codepoint(const char *s8, size_t l, size_t &bytes, char32_t &cp)
Definition peglib.h:152
std::function< void(size_t line, size_t col, const std::string &msg, const std::string &rule)> Log
Definition peglib.h:724
size_t codepoint_count(const char *s8, size_t l)
Definition peglib.h:101
std::shared_ptr< Ope > apd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1868
std::pair< int, size_t > parse_octal_number(const char *s, size_t n, size_t i)
Definition peglib.h:279
std::u32string decode(const char *s8, size_t l)
Definition peglib.h:201
std::pair< size_t, size_t > line_info(const char *start, const char *cur)
Definition peglib.h:475
std::shared_ptr< Ope > rec(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1960
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:805
std::shared_ptr< Ope > cls(const std::string &s)
Definition peglib.h:1889
std::shared_ptr< Ope > wsp(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1945
bool fail(size_t len)
Definition peglib.h:719
T token_to_number_(std::string_view sv)
Definition peglib.h:368
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:1953
bool is_digit(char c, int &v)
Definition peglib.h:260
std::shared_ptr< Ope > dic(const std::vector< std::string > &v, bool ignore_case)
Definition peglib.h:1876
std::shared_ptr< Ope > liti(std::string &&s)
Definition peglib.h:1885
std::shared_ptr< Ope > ign(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1928
std::unordered_map< std::string, Definition > Grammar
Definition peglib.h:1725
size_t codepoint_length(const char *s8, size_t l)
Definition peglib.h:85
static const char * WHITESPACE_DEFINITION_NAME
Definition peglib.h:2583
std::string resolve_escape_sequence(const char *s, size_t n)
Definition peglib.h:290
std::shared_ptr< Ope > lit(std::string &&s)
Definition peglib.h:1881
std::shared_ptr< Ope > cho4label_(Args &&...args)
Definition peglib.h:1846
std::shared_ptr< Ope > dot()
Definition peglib.h:1913
std::unordered_map< std::string, std::shared_ptr< Ope > > Rules
Definition peglib.h:4101
void enable_profiling(parser &parser, std::ostream &os)
Definition peglib.h:5708
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:801
std::shared_ptr< Ope > chr(char32_t dt)
Definition peglib.h:1909
bool is_hex(char c, int &v)
Definition peglib.h:246
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:5205
std::shared_ptr< Ope > opt(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1859
std::function< void(std::any &trace_data)> TracerStartOrEnd
Definition peglib.h:809
std::shared_ptr< Ope > oom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1855
std::shared_ptr< Ope > cho(Args &&...args)
Definition peglib.h:1841
std::shared_ptr< Ope > rep(const std::shared_ptr< Ope > &ope, size_t min, size_t max)
Definition peglib.h:1863
constexpr unsigned int str2tag_core(const char *s, size_t l, unsigned int h)
Definition peglib.h:496
std::shared_ptr< Ope > npd(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1872
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:5179
constexpr unsigned int str2tag(std::string_view sv)
Definition peglib.h:503
std::shared_ptr< Ope > seq(Args &&...args)
Definition peglib.h:1837
bool success(size_t len)
Definition peglib.h:717
std::shared_ptr< Ope > ncls(const std::string &s)
Definition peglib.h:1899
std::pair< int, size_t > parse_hex_number(const char *s, size_t n, size_t i)
Definition peglib.h:268
std::shared_ptr< Ope > cap(const std::shared_ptr< Ope > &ope, Capture::MatchAction ma)
Definition peglib.h:1919
void add_ast_action(Definition &rule)
Definition peglib.h:5252
AstBase< EmptyType > Ast
Definition filter_string.h:30
static const char * RECOVER_DEFINITION_NAME
Definition peglib.h:2585
std::any call(F fn, Args &&...args)
Definition peglib.h:617
std::shared_ptr< Ope > zom(const std::shared_ptr< Ope > &ope)
Definition peglib.h:1851
std::shared_ptr< Ope > bkr(std::string &&name)
Definition peglib.h:1949
std::shared_ptr< Ope > usr(std::function< size_t(const char *s, size_t n, SemanticValues &vs, std::any &dt)> fn)
Definition peglib.h:1933
std::string to_lower(std::string s)
Definition peglib.h:384
void enable_tracing(parser &parser, std::ostream &os)
Definition peglib.h:5648
#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:3618
std::unordered_map< void *, size_t > ids
Definition peglib.h:2066
const size_t column
Definition peglib.h:5149
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:5136
std::weak_ptr< AstBase< EmptyType > > parent
Definition peglib.h:5166
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:5127
const std::string name
Definition peglib.h:5151
T token_to_number() const
Definition peglib.h:5173
const bool is_token
Definition peglib.h:5162
const size_t line
Definition peglib.h:5148
size_t length
Definition peglib.h:5153
const unsigned int original_tag
Definition peglib.h:5160
const size_t choice
Definition peglib.h:5155
size_t position
Definition peglib.h:5152
const size_t original_choice_count
Definition peglib.h:5157
const std::string_view token
Definition peglib.h:5163
std::vector< std::shared_ptr< AstBase< EmptyType > > > nodes
Definition peglib.h:5165
const size_t choice_count
Definition peglib.h:5154
const size_t original_choice
Definition peglib.h:5158
const std::string path
Definition peglib.h:5147
std::string token_to_string() const
Definition peglib.h:5168
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:5117
const unsigned int tag
Definition peglib.h:5159
const std::string original_name
Definition peglib.h:5156
const bool mode_
Definition peglib.h:5245
const std::vector< std::string > rules_
Definition peglib.h:5246
std::shared_ptr< T > optimize(std::shared_ptr< T > original, std::shared_ptr< T > parent=nullptr)
Definition peglib.h:5217
AstOptimizer(bool mode, const std::vector< std::string > &rules={})
Definition peglib.h:5213
void visit(Repetition &ope) override
Definition peglib.h:2210
void visit(BackReference &) override
Definition peglib.h:2220
void visit(Cut &) override
Definition peglib.h:2221
void visit(LiteralString &ope) override
Definition peglib.h:2214
void visit(NotPredicate &) override
Definition peglib.h:2212
bool result
Definition peglib.h:2194
void visit(Dictionary &) override
Definition peglib.h:2213
void visit(User &) override
Definition peglib.h:2218
void visit(Character &) override
Definition peglib.h:2216
void visit(AndPredicate &) override
Definition peglib.h:2211
void visit(Sequence &ope) override
Definition peglib.h:2196
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2203
void visit(AnyCharacter &) override
Definition peglib.h:2217
void visit(CharacterClass &) override
Definition peglib.h:2215
void visit(User &) override
Definition peglib.h:2526
ComputeFirstSet(FirstSetCache &cache)
Definition peglib.h:2539
void visit(BackReference &) override
Definition peglib.h:2528
void visit(AndPredicate &) override
Definition peglib.h:2468
void visit(NotPredicate &) override
Definition peglib.h:2469
FirstSetCache & cache_
Definition peglib.h:2544
void visit(Cut &) override
Definition peglib.h:2529
void visit(LiteralString &ope) override
Definition peglib.h:2482
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2455
void visit(Repetition &ope) override
Definition peglib.h:2464
void visit(Dictionary &ope) override
Definition peglib.h:2470
std::unordered_map< const Definition *, FirstSet > FirstSetCache
Definition peglib.h:2537
void visit(AnyCharacter &) override
Definition peglib.h:2525
void visit(CharacterClass &ope) override
Definition peglib.h:2495
std::unordered_set< const Definition * > refs_
Definition peglib.h:2545
FirstSet result_
Definition peglib.h:2541
void visit(Character &ope) override
Definition peglib.h:2518
void visit(Sequence &ope) override
Definition peglib.h:2436
size_t cycle_count_
Definition peglib.h:2546
std::any val
Definition peglib.h:848
size_t len
Definition peglib.h:847
size_t misses
Definition peglib.h:917
size_t hits
Definition peglib.h:916
std::string_view sv_sv
Definition peglib.h:1014
size_t sv_tags_size
Definition peglib.h:1012
size_t sv_tokens_size
Definition peglib.h:1013
size_t capture_size
Definition peglib.h:1017
size_t choice
Definition peglib.h:1016
size_t choice_count
Definition peglib.h:1015
size_t sv_size
Definition peglib.h:1011
bool ret
Definition peglib.h:2593
size_t len
Definition peglib.h:2595
ErrorInfo error_info
Definition peglib.h:2596
bool recovered
Definition peglib.h:2594
void visit(Repetition &ope) override
Definition peglib.h:2291
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2285
DetectInfiniteLoop(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2275
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2312
void visit(Sequence &ope) override
Definition peglib.h:2279
bool has_error
Definition peglib.h:2306
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2311
const char * error_s
Definition peglib.h:2307
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:2268
std::string error_name
Definition peglib.h:2308
bool done_
Definition peglib.h:2187
void visit(AnyCharacter &) override
Definition peglib.h:2174
void visit(Sequence &ope) override
Definition peglib.h:2138
void visit(AndPredicate &ope) override
Definition peglib.h:2162
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2149
void visit(BackReference &) override
Definition peglib.h:2177
const char * error_s
Definition peglib.h:2180
void visit(Repetition &ope) override
Definition peglib.h:2158
std::unordered_set< std::string > refs_
Definition peglib.h:2186
void visit(Cut &) override
Definition peglib.h:2178
void visit(Character &) override
Definition peglib.h:2173
std::string name_
Definition peglib.h:2185
void visit(LiteralString &ope) override
Definition peglib.h:2171
void visit(CharacterClass &) override
Definition peglib.h:2172
DetectLeftRecursion(const std::string &name)
Definition peglib.h:2136
void visit(Dictionary &) override
Definition peglib.h:2170
void visit(NotPredicate &ope) override
Definition peglib.h:2166
std::vector< const std::vector< std::shared_ptr< Ope > > * > macro_args_stack_
Definition peglib.h:2188
void visit(User &) override
Definition peglib.h:2175
std::shared_ptr< Ope > resolve_macro_arg(size_t iarg) const
Definition peglib.h:3701
std::vector< std::pair< const char *, const Definition * > > expected_tokens
Definition peglib.h:734
std::string replace_all(std::string str, const std::string &from, const std::string &to) const
Definition peglib.h:785
void clear()
Definition peglib.h:741
const char * message_pos
Definition peglib.h:735
int cast_char(char c) const
Definition peglib.h:758
std::string heuristic_error_token(const char *s, size_t n, const char *pos) const
Definition peglib.h:760
const char * last_output_pos
Definition peglib.h:738
void output_log(const Log &log, const char *s, size_t n)
Definition peglib.h:2953
bool keep_previous_token
Definition peglib.h:739
void add(const char *error_literal, const Definition *error_rule)
Definition peglib.h:748
std::string message
Definition peglib.h:736
std::string label
Definition peglib.h:737
const char * error_pos
Definition peglib.h:733
void visit(LiteralString &ope) override
Definition peglib.h:2117
static const char * token(Ope &ope)
Definition peglib.h:2123
void visit(TokenBoundary &ope) override
Definition peglib.h:2118
const char * token_
Definition peglib.h:2130
void visit(Ignore &ope) override
Definition peglib.h:2119
void visit(Recovery &ope) override
Definition peglib.h:2121
const std::vector< std::string > & params_
Definition peglib.h:2427
void visit(Repetition &ope) override
Definition peglib.h:2369
void visit(WeakHolder &ope) override
Definition peglib.h:2406
void visit(Character &ope) override
Definition peglib.h:2388
void visit(CharacterClass &ope) override
Definition peglib.h:2385
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2361
void visit(Ignore &ope) override
Definition peglib.h:2402
void visit(Cut &ope) override
Definition peglib.h:2421
void visit(AnyCharacter &ope) override
Definition peglib.h:2389
void visit(LiteralString &ope) override
Definition peglib.h:2382
void visit(Recovery &ope) override
Definition peglib.h:2417
void visit(Holder &ope) override
Definition peglib.h:2407
const std::vector< std::shared_ptr< Ope > > & args_
Definition peglib.h:2426
void visit(Dictionary &ope) override
Definition peglib.h:2381
void visit(Whitespace &ope) override
Definition peglib.h:2409
void visit(TokenBoundary &ope) override
Definition peglib.h:2398
std::shared_ptr< Ope > found_ope
Definition peglib.h:2423
void visit(NotPredicate &ope) override
Definition peglib.h:2377
FindReference(const std::vector< std::shared_ptr< Ope > > &args, const std::vector< std::string > ¶ms)
Definition peglib.h:2349
void visit(Sequence &ope) override
Definition peglib.h:2353
void visit(AndPredicate &ope) override
Definition peglib.h:2373
void visit(Capture &ope) override
Definition peglib.h:2394
void visit(CaptureScope &ope) override
Definition peglib.h:2390
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2413
const char * first_literal
Definition peglib.h:1199
void merge(const FirstSet &other)
Definition peglib.h:1203
bool any_char
Definition peglib.h:1198
std::bitset< 256 > chars
Definition peglib.h:1196
bool can_be_empty
Definition peglib.h:1197
const Definition * first_rule
Definition peglib.h:1200
std::string error_name
Definition peglib.h:2254
void visit(Sequence &ope) override
Definition peglib.h:3716
bool is_empty
Definition peglib.h:2252
void visit(Repetition &ope) override
Definition peglib.h:2238
const char * error_s
Definition peglib.h:2253
void visit(NotPredicate &) override
Definition peglib.h:2246
std::vector< std::pair< const char *, std::string > > & refs_
Definition peglib.h:2261
void visit(LiteralString &ope) override
Definition peglib.h:2247
void visit(AndPredicate &) override
Definition peglib.h:2245
std::unordered_map< std::string, bool > & has_error_cache_
Definition peglib.h:2262
void set_error()
Definition peglib.h:2257
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2232
HasEmptyElement(std::vector< std::pair< const char *, std::string > > &refs, std::unordered_map< std::string, bool > &has_error_cache)
Definition peglib.h:2227
void visit(Dictionary &) override
Definition peglib.h:2079
void visit(LiteralString &) override
Definition peglib.h:2080
bool result_
Definition peglib.h:2089
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2072
static bool check(Ope &ope)
Definition peglib.h:2082
std::bitset< 256 > identifier_rest
Definition peglib.h:1100
std::bitset< 256 > identifier_first
Definition peglib.h:1099
size_t max_keyword_len
Definition peglib.h:1104
size_t min_keyword_len
Definition peglib.h:1103
std::vector< std::string > exact_keywords
Definition peglib.h:1101
std::vector< std::string > prefix_keywords
Definition peglib.h:1102
static bool matches_any(const std::vector< std::string > &keywords, std::string_view input)
Definition peglib.h:1106
const std::vector< std::string > & params_
Definition peglib.h:2343
Grammar & grammar_
Definition peglib.h:2342
void visit(Reference &ope) override
Definition peglib.h:4063
LinkReferences(Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2336
virtual void visit(WeakHolder &)
Definition peglib.h:1986
virtual void visit(TokenBoundary &)
Definition peglib.h:1983
virtual void visit(Repetition &)
Definition peglib.h:1973
virtual void visit(Dictionary &)
Definition peglib.h:1976
virtual void visit(Character &)
Definition peglib.h:1979
virtual ~Visitor()
Definition peglib.h:1970
virtual void visit(AndPredicate &)
Definition peglib.h:1974
virtual void visit(LiteralString &)
Definition peglib.h:1977
virtual void visit(Reference &)
Definition peglib.h:1988
virtual void visit(CharacterClass &)
Definition peglib.h:1978
virtual void visit(PrioritizedChoice &)
Definition peglib.h:1972
virtual void visit(Ignore &)
Definition peglib.h:1984
virtual void visit(PrecedenceClimbing &)
Definition peglib.h:1991
virtual void visit(CaptureScope &)
Definition peglib.h:1981
virtual void visit(Sequence &)
Definition peglib.h:1971
virtual void visit(Holder &)
Definition peglib.h:1987
virtual void visit(Capture &)
Definition peglib.h:1982
virtual void visit(NotPredicate &)
Definition peglib.h:1975
virtual void visit(BackReference &)
Definition peglib.h:1990
virtual void visit(Cut &)
Definition peglib.h:1993
virtual void visit(AnyCharacter &)
Definition peglib.h:1980
virtual void visit(Whitespace &)
Definition peglib.h:1989
virtual void visit(Recovery &)
Definition peglib.h:1992
virtual void visit(User &)
Definition peglib.h:1985
Data()
Definition peglib.h:4167
std::vector< std::pair< std::string, const char * > > duplicates_of_definition
Definition peglib.h:4156
bool enablePackratParsing
Definition peglib.h:4165
std::map< std::string, std::vector< Instruction > > instructions
Definition peglib.h:4159
std::string start
Definition peglib.h:4153
std::vector< std::pair< std::string, const char * > > duplicates_of_instruction
Definition peglib.h:4158
const char * start_pos
Definition peglib.h:4154
std::set< std::string_view > captures_in_current_definition
Definition peglib.h:4164
std::vector< std::pair< std::string, const char * > > undefined_back_references
Definition peglib.h:4161
std::shared_ptr< Grammar > grammar
Definition peglib.h:4152
std::vector< std::set< std::string_view > > captures_stack
Definition peglib.h:4162
std::any data
Definition peglib.h:4147
std::string type
Definition peglib.h:4146
std::string_view sv
Definition peglib.h:4148
std::shared_ptr< Grammar > grammar
Definition peglib.h:4106
bool enablePackratParsing
Definition peglib.h:4108
std::string start
Definition peglib.h:4107
std::unordered_set< std::string > referenced
Definition peglib.h:2326
std::unordered_map< std::string, const char * > error_s
Definition peglib.h:2324
const std::vector< std::string > & params_
Definition peglib.h:2330
std::unordered_map< std::string, std::string > error_message
Definition peglib.h:2325
ReferenceChecker(const Grammar &grammar, const std::vector< std::string > ¶ms)
Definition peglib.h:2318
const Grammar & grammar_
Definition peglib.h:2329
void visit(Reference &ope) override
Definition peglib.h:3793
std::pair< size_t, size_t > line_info() const
Definition peglib.h:2948
std::string token_to_string(size_t id=0) const
Definition peglib.h:555
std::vector< std::string_view > tokens
Definition peglib.h:546
size_t choice_
Definition peglib.h:610
Context * c_
Definition peglib.h:607
std::string name_
Definition peglib.h:611
friend class Holder
Definition peglib.h:604
friend class Sequence
Definition peglib.h:601
std::string_view token(size_t id=0) const
Definition peglib.h:548
std::string_view sv() const
Definition peglib.h:529
std::string_view sv_
Definition peglib.h:608
size_t choice() const
Definition peglib.h:543
T token_to_number() const
Definition peglib.h:559
const char * ss
Definition peglib.h:526
size_t choice_count_
Definition peglib.h:609
friend class Dictionary
Definition peglib.h:600
size_t choice_count() const
Definition peglib.h:540
std::vector< T > transform(size_t beg=0, size_t end=static_cast< size_t >(-1)) const
Definition peglib.h:565
const char * path
Definition peglib.h:525
std::vector< unsigned int > tags
Definition peglib.h:534
const std::string & name() const
Definition peglib.h:532
friend class Repetition
Definition peglib.h:603
friend class PrecedenceClimbing
Definition peglib.h:605
SemanticValues(Context *c)
Definition peglib.h:522
friend class Context
Definition peglib.h:599
friend class PrioritizedChoice
Definition peglib.h:602
void setup_keyword_guarded_identifier(Sequence &ope)
Definition peglib.h:3878
void visit(Repetition &ope) override
Definition peglib.h:2567
ComputeFirstSet::FirstSetCache first_set_cache_
Definition peglib.h:2576
void visit(Sequence &ope) override
Definition peglib.h:3870
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2555
std::unordered_set< const Definition * > visited_rules_
Definition peglib.h:2577
bool has_rule_
Definition peglib.h:2111
bool has_token_boundary_
Definition peglib.h:2110
void visit(TokenBoundary &) override
Definition peglib.h:2095
void visit(WeakHolder &) override
Definition peglib.h:2098
void visit(NotPredicate &) override
Definition peglib.h:2097
void visit(AndPredicate &) override
Definition peglib.h:2096
static bool is_token(Ope &ope)
Definition peglib.h:2101
void visit(Recovery &) override
Definition peglib.h:2046
void visit(Cut &) override
Definition peglib.h:2047
void visit(Holder &ope) override
Definition peglib.h:2041
void visit(User &) override
Definition peglib.h:2039
void visit(NotPredicate &) override
Definition peglib.h:2029
void visit(TokenBoundary &) override
Definition peglib.h:2037
void visit(LiteralString &) override
Definition peglib.h:2031
void visit(AnyCharacter &) override
Definition peglib.h:2034
void visit(Whitespace &) override
Definition peglib.h:2043
void visit(WeakHolder &) override
Definition peglib.h:2040
void visit(Repetition &) override
Definition peglib.h:2027
void visit(Character &) override
Definition peglib.h:2033
void visit(CharacterClass &) override
Definition peglib.h:2032
void visit(Reference &) override
Definition peglib.h:2042
static std::string get(Ope &ope)
Definition peglib.h:2049
const char * name_
Definition peglib.h:2056
void visit(Capture &) override
Definition peglib.h:2036
void visit(CaptureScope &) override
Definition peglib.h:2035
void visit(PrecedenceClimbing &) override
Definition peglib.h:2045
void visit(Sequence &) override
Definition peglib.h:2025
void visit(PrioritizedChoice &) override
Definition peglib.h:2026
void visit(Ignore &) override
Definition peglib.h:2038
void visit(AndPredicate &) override
Definition peglib.h:2028
void visit(BackReference &) override
Definition peglib.h:2044
void visit(Dictionary &) override
Definition peglib.h:2030
void visit(TokenBoundary &ope) override
Definition peglib.h:2013
void visit(Recovery &ope) override
Definition peglib.h:2018
void visit(PrioritizedChoice &ope) override
Definition peglib.h:2003
void visit(Capture &ope) override
Definition peglib.h:2012
void visit(Whitespace &ope) override
Definition peglib.h:2017
void visit(PrecedenceClimbing &ope) override
Definition peglib.h:2019
void visit(Repetition &ope) override
Definition peglib.h:2008
void visit(CaptureScope &ope) override
Definition peglib.h:2011
void visit(AndPredicate &ope) override
Definition peglib.h:2009
void visit(Sequence &ope) override
Definition peglib.h:1998
void visit(WeakHolder &ope) override
Definition peglib.h:2015
void visit(NotPredicate &ope) override
Definition peglib.h:2010
void visit(Ignore &ope) override
Definition peglib.h:2014
void visit(Holder &ope) override
Definition peglib.h:2016
bool match
Definition peglib.h:455
size_t id
Definition peglib.h:456
bool done
Definition peglib.h:454
bool execute_on_destruction
Definition peglib.h:78
scope_exit(scope_exit &&rhs)
Definition peglib.h:60
EF exit_function
Definition peglib.h:77
~scope_exit()
Definition peglib.h:66
scope_exit(EF &&f)
Definition peglib.h:57
scope_exit(const scope_exit &)=delete
void operator=(const scope_exit &)=delete
scope_exit & operator=(scope_exit &&)=delete
void release()
Definition peglib.h:70