Use a constructor rather than aggregate initialization for Production
This commit is contained in:
parent
f3e3e6193b
commit
947c161c2f
5 changed files with 32 additions and 36 deletions
|
|
@ -74,13 +74,7 @@ class ParseTableBuilder {
|
|||
Symbol::terminal(0) :
|
||||
Symbol::non_terminal(0);
|
||||
|
||||
Production start_production;
|
||||
start_production.steps.push_back({
|
||||
start_symbol,
|
||||
0,
|
||||
rules::AssociativityNone,
|
||||
rules::Alias{}
|
||||
});
|
||||
Production start_production({{start_symbol, 0, rules::AssociativityNone, rules::Alias{}}}, 0);
|
||||
|
||||
add_parse_state({}, ParseItemSet{{
|
||||
{
|
||||
|
|
|
|||
|
|
@ -207,10 +207,7 @@ const vector<Production> &ParseItemSetBuilder::inline_production(const ParseItem
|
|||
auto begin = item.production->steps.begin();
|
||||
auto end = item.production->steps.end();
|
||||
auto step = begin + item.step_index;
|
||||
|
||||
Production production;
|
||||
production.steps.assign(begin, step);
|
||||
production.dynamic_precedence = item.production->dynamic_precedence;
|
||||
Production production({begin, step}, item.production->dynamic_precedence);
|
||||
|
||||
for (auto &step : *production_to_insert) {
|
||||
production.steps.push_back(step);
|
||||
|
|
|
|||
|
|
@ -22,7 +22,12 @@ struct ProductionStep {
|
|||
|
||||
struct Production {
|
||||
std::vector<ProductionStep> steps;
|
||||
int dynamic_precedence = 0;
|
||||
int dynamic_precedence;
|
||||
|
||||
inline Production() : dynamic_precedence(0) {}
|
||||
|
||||
inline Production(std::vector<ProductionStep> &&steps, int dynamic_precedence = 0) :
|
||||
steps(move(steps)), dynamic_precedence(dynamic_precedence) {}
|
||||
|
||||
bool operator==(const Production &) const;
|
||||
inline ProductionStep &back() { return steps.back(); }
|
||||
|
|
|
|||
|
|
@ -27,25 +27,25 @@ describe("ParseItemSetBuilder", []() {
|
|||
it("adds items at the beginnings of referenced rules", [&]() {
|
||||
SyntaxGrammar grammar{{
|
||||
SyntaxVariable{"rule0", VariableTypeNamed, {
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::terminal(11), 0, AssociativityNone, Alias{}},
|
||||
}, 0},
|
||||
}, 0),
|
||||
}},
|
||||
SyntaxVariable{"rule1", VariableTypeNamed, {
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::terminal(12), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::terminal(13), 0, AssociativityNone, Alias{}},
|
||||
}, 0},
|
||||
Production{{
|
||||
}, 0),
|
||||
Production({
|
||||
{Symbol::non_terminal(2), 0, AssociativityNone, Alias{}},
|
||||
}, 0}
|
||||
}, 0)
|
||||
}},
|
||||
SyntaxVariable{"rule2", VariableTypeNamed, {
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::terminal(14), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::terminal(15), 0, AssociativityNone, Alias{}},
|
||||
}, 0}
|
||||
}, 0)
|
||||
}},
|
||||
}, {}, {}, {}, {}};
|
||||
|
||||
|
|
@ -86,16 +86,16 @@ describe("ParseItemSetBuilder", []() {
|
|||
it("handles rules with empty productions", [&]() {
|
||||
SyntaxGrammar grammar{{
|
||||
SyntaxVariable{"rule0", VariableTypeNamed, {
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::terminal(11), 0, AssociativityNone, Alias{}},
|
||||
}, 0},
|
||||
}, 0),
|
||||
}},
|
||||
SyntaxVariable{"rule1", VariableTypeNamed, {
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::terminal(12), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::terminal(13), 0, AssociativityNone, Alias{}},
|
||||
}, 0},
|
||||
}, 0),
|
||||
Production{{}, 0}
|
||||
}},
|
||||
}, {}, {}, {}, {}};
|
||||
|
|
|
|||
|
|
@ -34,21 +34,21 @@ describe("flatten_grammar", []() {
|
|||
AssertThat(result.name, Equals("test"));
|
||||
AssertThat(result.type, Equals(VariableTypeNamed));
|
||||
AssertThat(result.productions, Equals(vector<Production>({
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(2), 101, AssociativityLeft, Alias{}},
|
||||
{Symbol::non_terminal(3), 102, AssociativityRight, Alias{}},
|
||||
{Symbol::non_terminal(4), 101, AssociativityLeft, Alias{}},
|
||||
{Symbol::non_terminal(6), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(7), 0, AssociativityNone, Alias{}},
|
||||
}, 0},
|
||||
Production{{
|
||||
}, 0),
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(2), 101, AssociativityLeft, Alias{}},
|
||||
{Symbol::non_terminal(5), 101, AssociativityLeft, Alias{}},
|
||||
{Symbol::non_terminal(6), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(7), 0, AssociativityNone, Alias{}},
|
||||
}, 0}
|
||||
}, 0)
|
||||
})));
|
||||
});
|
||||
|
||||
|
|
@ -76,21 +76,21 @@ describe("flatten_grammar", []() {
|
|||
AssertThat(result.name, Equals("test"));
|
||||
AssertThat(result.type, Equals(VariableTypeNamed));
|
||||
AssertThat(result.productions, Equals(vector<Production>({
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(2), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(3), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(4), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(6), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(7), 0, AssociativityNone, Alias{}},
|
||||
}, 102},
|
||||
Production{{
|
||||
}, 102),
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(2), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(5), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(6), 0, AssociativityNone, Alias{}},
|
||||
{Symbol::non_terminal(7), 0, AssociativityNone, Alias{}},
|
||||
}, 101}
|
||||
}, 101),
|
||||
})));
|
||||
});
|
||||
|
||||
|
|
@ -105,10 +105,10 @@ describe("flatten_grammar", []() {
|
|||
});
|
||||
|
||||
AssertThat(result.productions, Equals(vector<Production>({
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 101, AssociativityLeft, Alias{}},
|
||||
{Symbol::non_terminal(2), 101, AssociativityLeft, Alias{}},
|
||||
}, 0}
|
||||
}, 0)
|
||||
})));
|
||||
|
||||
result = flatten_rule({
|
||||
|
|
@ -120,9 +120,9 @@ describe("flatten_grammar", []() {
|
|||
});
|
||||
|
||||
AssertThat(result.productions, Equals(vector<Production>({
|
||||
Production{{
|
||||
Production({
|
||||
{Symbol::non_terminal(1), 101, AssociativityLeft, Alias{}},
|
||||
}, 0}
|
||||
}, 0)
|
||||
})));
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue