@@ -6,16 +6,13 @@ namespace lars {
6
6
7
7
template <class R = void , typename ... Args> class ParserGenerator : public Program <R, Args ...> {
8
8
private:
9
- Program< peg::GrammarNode::Shared> grammarProgram;
9
+ peg::GrammarProgram grammarProgram;
10
10
std::unordered_map<std::string, std::shared_ptr<peg::Rule>> rules;
11
11
peg::GrammarNode::Shared separatorRule;
12
-
13
12
public:
14
13
15
14
ParserGenerator (){
16
- grammarProgram = peg::createGrammarProgram ([this ](const std::string_view &name){
17
- return getRuleNode (std::string (name));
18
- });
15
+ grammarProgram = peg::createGrammarProgram ();
19
16
}
20
17
21
18
std::shared_ptr<peg::Rule> getRule (const std::string &name) {
@@ -45,8 +42,13 @@ namespace lars {
45
42
return rule;
46
43
}
47
44
45
+ peg::GrammarNode::Shared parseRule (const std::string_view &grammar){
46
+ peg::RuleGetter rg = [this ](const auto &name){ return getRuleNode (std::string (name)); };
47
+ return grammarProgram.run (grammar, rg);
48
+ }
49
+
48
50
std::shared_ptr<peg::Rule> setRule (const std::string &name, const std::string_view &grammar, const typename Interpreter<R, Args ...>::Callback &callback = typename Interpreter<R, Args ...>::Callback()){
49
- return setRule (name, grammarProgram. run (grammar), callback);
51
+ return setRule (name, parseRule (grammar), callback);
50
52
}
51
53
52
54
template <class R2 , typename ... Args2> std::shared_ptr<peg::Rule> setProgramRule (const std::string &name, Program<R2, Args2 ...> subprogram, std::function<R(typename Interpreter<R2, Args2 ...>::Expression,Args...)> callback = [](auto e, Args...){ return e.evaluate (); }){
@@ -59,7 +61,7 @@ namespace lars {
59
61
}
60
62
61
63
std::shared_ptr<peg::Rule> setFilteredRule (const std::string &name, const std::string_view &grammar, const peg::GrammarNode::FilterCallback &filter, const typename Interpreter<R, Args ...>::Callback &callback = typename Interpreter<R, Args ...>::Callback()){
62
- return setRule (name, peg::GrammarNode::Sequence ({grammarProgram. run (grammar), peg::GrammarNode::Filter (filter)}), callback);
64
+ return setRule (name, peg::GrammarNode::Sequence ({parseRule (grammar), peg::GrammarNode::Filter (filter)}), callback);
63
65
}
64
66
65
67
void setSeparator (const std::shared_ptr<peg::Rule> &rule){
@@ -74,7 +76,7 @@ namespace lars {
74
76
}
75
77
76
78
std::shared_ptr<peg::Rule> setSeparatorRule (const std::string &name, const std::string_view &grammar){
77
- return setSeparatorRule (name, grammarProgram. run (grammar));
79
+ return setSeparatorRule (name, parseRule (grammar));
78
80
}
79
81
80
82
void setStart (const std::shared_ptr<peg::Rule> &rule){
0 commit comments