Skip to content

Commit b76e4fe

Browse files
committed
Keep selected rule id in AST
1 parent 5f323c5 commit b76e4fe

File tree

1 file changed

+58
-15
lines changed

1 file changed

+58
-15
lines changed

peglib.h

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,9 @@ struct SemanticValues : protected std::vector<any>
459459
return peg::line_info(ss, s_);
460460
}
461461

462+
// Choice count
463+
size_t choice_count() const { return choice_count_; }
464+
462465
// Choice number (0 based index)
463466
size_t choice() const { return choice_; }
464467

@@ -480,7 +483,7 @@ struct SemanticValues : protected std::vector<any>
480483
return this->transform(beg, end, [](const any& v) { return v.get<T>(); });
481484
}
482485

483-
SemanticValues() : s_(nullptr), n_(0), choice_(0) {}
486+
SemanticValues() : s_(nullptr), n_(0), choice_count_(0), choice_(0) {}
484487

485488
using std::vector<any>::iterator;
486489
using std::vector<any>::const_iterator;
@@ -512,6 +515,7 @@ struct SemanticValues : protected std::vector<any>
512515

513516
const char* s_;
514517
size_t n_;
518+
size_t choice_count_;
515519
size_t choice_;
516520

517521
template <typename F>
@@ -532,6 +536,17 @@ struct SemanticValues : protected std::vector<any>
532536
}
533537
return r;
534538
}
539+
540+
void reset() {
541+
path = nullptr;
542+
ss = nullptr;
543+
tokens.clear();
544+
545+
s_ = nullptr;
546+
n_ = 0;
547+
choice_count_ = 0;
548+
choice_ = 0;
549+
}
535550
};
536551

537552
/*
@@ -846,11 +861,9 @@ class Context
846861
if (!sv.empty()) {
847862
sv.clear();
848863
}
864+
sv.reset();
849865
sv.path = path;
850866
sv.ss = s;
851-
sv.s_ = nullptr;
852-
sv.n_ = 0;
853-
sv.tokens.clear();
854867
return sv;
855868
}
856869

@@ -996,6 +1009,7 @@ class PrioritizedChoice : public Ope
9961009
}
9971010
sv.s_ = chldsv.c_str();
9981011
sv.n_ = chldsv.length();
1012+
sv.choice_count_ = opes_.size();
9991013
sv.choice_ = id;
10001014
sv.tokens.insert(sv.tokens.end(), chldsv.tokens.begin(), chldsv.tokens.end());
10011015

@@ -2893,12 +2907,18 @@ inline constexpr unsigned int operator "" _(const char* s, size_t) {
28932907
template <typename Annotation>
28942908
struct AstBase : public Annotation
28952909
{
2896-
AstBase(const char* a_path, size_t a_line, size_t a_column, const char* a_name, const std::vector<std::shared_ptr<AstBase>>& a_nodes)
2910+
AstBase(const char* a_path, size_t a_line, size_t a_column,
2911+
const char* a_name, size_t a_choice_count, size_t a_choice,
2912+
const std::vector<std::shared_ptr<AstBase>>& a_nodes)
28972913
: path(a_path ? a_path : "")
28982914
, line(a_line)
28992915
, column(a_column)
29002916
, name(a_name)
2917+
, choice_count(a_choice_count)
2918+
, choice(a_choice)
29012919
, original_name(a_name)
2920+
, original_choice_count(a_choice_count)
2921+
, original_choice(a_choice)
29022922
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
29032923
, tag(str2tag(a_name))
29042924
, original_tag(tag)
@@ -2907,12 +2927,18 @@ struct AstBase : public Annotation
29072927
, nodes(a_nodes)
29082928
{}
29092929

2910-
AstBase(const char* a_path, size_t a_line, size_t a_column, const char* a_name, const std::string& a_token)
2930+
AstBase(const char* a_path, size_t a_line, size_t a_column,
2931+
const char* a_name, size_t a_choice_count, size_t a_choice,
2932+
const std::string& a_token)
29112933
: path(a_path ? a_path : "")
29122934
, line(a_line)
29132935
, column(a_column)
29142936
, name(a_name)
2937+
, choice_count(a_choice_count)
2938+
, choice(a_choice)
29152939
, original_name(a_name)
2940+
, original_choice_count(a_choice_count)
2941+
, original_choice(a_choice)
29162942
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
29172943
, tag(str2tag(a_name))
29182944
, original_tag(tag)
@@ -2921,12 +2947,17 @@ struct AstBase : public Annotation
29212947
, token(a_token)
29222948
{}
29232949

2924-
AstBase(const AstBase& ast, const char* a_original_name)
2950+
AstBase(const AstBase& ast, const char* a_original_name,
2951+
size_t a_original_choice_count, size_t a_original_choise)
29252952
: path(ast.path)
29262953
, line(ast.line)
29272954
, column(ast.column)
29282955
, name(ast.name)
2956+
, choice_count(ast.choice_count)
2957+
, choice(ast.choice)
29292958
, original_name(a_original_name)
2959+
, original_choice_count(a_original_choice_count)
2960+
, original_choice(a_original_choise)
29302961
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
29312962
, tag(ast.tag)
29322963
, original_tag(str2tag(a_original_name))
@@ -2942,7 +2973,11 @@ struct AstBase : public Annotation
29422973
const size_t column;
29432974

29442975
const std::string name;
2976+
const size_t choice_count;
2977+
const size_t choice;
29452978
const std::string original_name;
2979+
const size_t original_choice_count;
2980+
const size_t original_choice;
29462981
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
29472982
const unsigned int tag;
29482983
const unsigned int original_tag;
@@ -2966,11 +3001,12 @@ void ast_to_s_core(
29663001
for (auto i = 0; i < level; i++) {
29673002
s += " ";
29683003
}
2969-
std::string name;
2970-
if (ast.name == ast.original_name) {
2971-
name = ast.name;
2972-
} else {
2973-
name = ast.original_name + "[" + ast.name + "]";
3004+
auto name = ast.original_name;
3005+
if (ast.original_choice_count > 0) {
3006+
name += "/" + std::to_string(ast.original_choice);
3007+
}
3008+
if (ast.name != ast.original_name) {
3009+
name += "[" + ast.name + "]";
29743010
}
29753011
if (ast.is_token) {
29763012
s += "- " + name + " (" + ast.token + ")\n";
@@ -3009,7 +3045,8 @@ struct AstOptimizer
30093045

30103046
if (opt && original->nodes.size() == 1) {
30113047
auto child = optimize(original->nodes[0], parent);
3012-
return std::make_shared<T>(*child, original->name.c_str());
3048+
return std::make_shared<T>(
3049+
*child, original->name.c_str(), original->choice_count, original->choice);
30133050
}
30143051

30153052
auto ast = std::make_shared<T>(*original);
@@ -3199,10 +3236,16 @@ class parser
31993236
auto line = line_info(sv.ss, sv.c_str());
32003237

32013238
if (rule.is_token()) {
3202-
return std::make_shared<T>(sv.path, line.first, line.second, name.c_str(), sv.token());
3239+
return std::make_shared<T>(
3240+
sv.path, line.first, line.second,
3241+
name.c_str(), sv.choice_count(), sv.choice(),
3242+
sv.token());
32033243
}
32043244

3205-
auto ast = std::make_shared<T>(sv.path, line.first, line.second, name.c_str(), sv.transform<std::shared_ptr<T>>());
3245+
auto ast = std::make_shared<T>(
3246+
sv.path, line.first, line.second,
3247+
name.c_str(), sv.choice_count(), sv.choice(),
3248+
sv.transform<std::shared_ptr<T>>());
32063249

32073250
for (auto node: ast->nodes) {
32083251
node->parent = ast;

0 commit comments

Comments
 (0)