Use a constructor rather than aggregate initialization for Production

This commit is contained in:
Max Brunsfeld 2017-08-08 10:41:54 -07:00
parent f3e3e6193b
commit 947c161c2f
5 changed files with 32 additions and 36 deletions

View file

@ -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{{
{

View file

@ -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);

View file

@ -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(); }

View file

@ -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}
}},
}, {}, {}, {}, {}};

View file

@ -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)
})));
});
});