@@ -459,6 +459,9 @@ struct SemanticValues : protected std::vector<any>
459
459
return peg::line_info (ss, s_);
460
460
}
461
461
462
+ // Choice count
463
+ size_t choice_count () const { return choice_count_; }
464
+
462
465
// Choice number (0 based index)
463
466
size_t choice () const { return choice_; }
464
467
@@ -480,7 +483,7 @@ struct SemanticValues : protected std::vector<any>
480
483
return this ->transform (beg, end, [](const any& v) { return v.get <T>(); });
481
484
}
482
485
483
- SemanticValues () : s_(nullptr ), n_(0 ), choice_(0 ) {}
486
+ SemanticValues () : s_(nullptr ), n_(0 ), choice_count_( 0 ), choice_(0 ) {}
484
487
485
488
using std::vector<any>::iterator;
486
489
using std::vector<any>::const_iterator;
@@ -512,6 +515,7 @@ struct SemanticValues : protected std::vector<any>
512
515
513
516
const char * s_;
514
517
size_t n_;
518
+ size_t choice_count_;
515
519
size_t choice_;
516
520
517
521
template <typename F>
@@ -532,6 +536,17 @@ struct SemanticValues : protected std::vector<any>
532
536
}
533
537
return r;
534
538
}
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
+ }
535
550
};
536
551
537
552
/*
@@ -846,11 +861,9 @@ class Context
846
861
if (!sv.empty ()) {
847
862
sv.clear ();
848
863
}
864
+ sv.reset ();
849
865
sv.path = path;
850
866
sv.ss = s;
851
- sv.s_ = nullptr ;
852
- sv.n_ = 0 ;
853
- sv.tokens .clear ();
854
867
return sv;
855
868
}
856
869
@@ -996,6 +1009,7 @@ class PrioritizedChoice : public Ope
996
1009
}
997
1010
sv.s_ = chldsv.c_str ();
998
1011
sv.n_ = chldsv.length ();
1012
+ sv.choice_count_ = opes_.size ();
999
1013
sv.choice_ = id;
1000
1014
sv.tokens .insert (sv.tokens .end (), chldsv.tokens .begin (), chldsv.tokens .end ());
1001
1015
@@ -2893,12 +2907,18 @@ inline constexpr unsigned int operator "" _(const char* s, size_t) {
2893
2907
template <typename Annotation>
2894
2908
struct AstBase : public Annotation
2895
2909
{
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)
2897
2913
: path(a_path ? a_path : " " )
2898
2914
, line(a_line)
2899
2915
, column(a_column)
2900
2916
, name(a_name)
2917
+ , choice_count(a_choice_count)
2918
+ , choice(a_choice)
2901
2919
, original_name(a_name)
2920
+ , original_choice_count(a_choice_count)
2921
+ , original_choice(a_choice)
2902
2922
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
2903
2923
, tag(str2tag(a_name))
2904
2924
, original_tag(tag)
@@ -2907,12 +2927,18 @@ struct AstBase : public Annotation
2907
2927
, nodes(a_nodes)
2908
2928
{}
2909
2929
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)
2911
2933
: path(a_path ? a_path : " " )
2912
2934
, line(a_line)
2913
2935
, column(a_column)
2914
2936
, name(a_name)
2937
+ , choice_count(a_choice_count)
2938
+ , choice(a_choice)
2915
2939
, original_name(a_name)
2940
+ , original_choice_count(a_choice_count)
2941
+ , original_choice(a_choice)
2916
2942
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
2917
2943
, tag(str2tag(a_name))
2918
2944
, original_tag(tag)
@@ -2921,12 +2947,17 @@ struct AstBase : public Annotation
2921
2947
, token(a_token)
2922
2948
{}
2923
2949
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)
2925
2952
: path(ast.path)
2926
2953
, line(ast.line)
2927
2954
, column(ast.column)
2928
2955
, name(ast.name)
2956
+ , choice_count(ast.choice_count)
2957
+ , choice(ast.choice)
2929
2958
, original_name(a_original_name)
2959
+ , original_choice_count(a_original_choice_count)
2960
+ , original_choice(a_original_choise)
2930
2961
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
2931
2962
, tag(ast.tag)
2932
2963
, original_tag(str2tag(a_original_name))
@@ -2942,7 +2973,11 @@ struct AstBase : public Annotation
2942
2973
const size_t column;
2943
2974
2944
2975
const std::string name;
2976
+ const size_t choice_count;
2977
+ const size_t choice;
2945
2978
const std::string original_name;
2979
+ const size_t original_choice_count;
2980
+ const size_t original_choice;
2946
2981
#ifndef PEGLIB_NO_CONSTEXPR_SUPPORT
2947
2982
const unsigned int tag;
2948
2983
const unsigned int original_tag;
@@ -2966,11 +3001,12 @@ void ast_to_s_core(
2966
3001
for (auto i = 0 ; i < level; i++) {
2967
3002
s += " " ;
2968
3003
}
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 + " ]" ;
2974
3010
}
2975
3011
if (ast.is_token ) {
2976
3012
s += " - " + name + " (" + ast.token + " )\n " ;
@@ -3009,7 +3045,8 @@ struct AstOptimizer
3009
3045
3010
3046
if (opt && original->nodes .size () == 1 ) {
3011
3047
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 );
3013
3050
}
3014
3051
3015
3052
auto ast = std::make_shared<T>(*original);
@@ -3199,10 +3236,16 @@ class parser
3199
3236
auto line = line_info (sv.ss , sv.c_str ());
3200
3237
3201
3238
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 ());
3203
3243
}
3204
3244
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>>());
3206
3249
3207
3250
for (auto node: ast->nodes ) {
3208
3251
node->parent = ast;
0 commit comments