From 947c161c2f5aacf26c74169a74ae5beea6ae8703 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 8 Aug 2017 10:41:54 -0700 Subject: [PATCH] Use a constructor rather than aggregate initialization for Production --- .../build_tables/build_parse_table.cc | 8 +------ .../build_tables/parse_item_set_builder.cc | 5 +--- src/compiler/syntax_grammar.h | 7 +++++- .../parse_item_set_builder_test.cc | 24 +++++++++---------- .../prepare_grammar/flatten_grammar_test.cc | 24 +++++++++---------- 5 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/compiler/build_tables/build_parse_table.cc b/src/compiler/build_tables/build_parse_table.cc index ed731fe6..65ed9b51 100644 --- a/src/compiler/build_tables/build_parse_table.cc +++ b/src/compiler/build_tables/build_parse_table.cc @@ -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{{ { diff --git a/src/compiler/build_tables/parse_item_set_builder.cc b/src/compiler/build_tables/parse_item_set_builder.cc index 4705dfb9..4a44627c 100644 --- a/src/compiler/build_tables/parse_item_set_builder.cc +++ b/src/compiler/build_tables/parse_item_set_builder.cc @@ -207,10 +207,7 @@ const vector &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); diff --git a/src/compiler/syntax_grammar.h b/src/compiler/syntax_grammar.h index 7714e475..2d55686b 100644 --- a/src/compiler/syntax_grammar.h +++ b/src/compiler/syntax_grammar.h @@ -22,7 +22,12 @@ struct ProductionStep { struct Production { std::vector steps; - int dynamic_precedence = 0; + int dynamic_precedence; + + inline Production() : dynamic_precedence(0) {} + + inline Production(std::vector &&steps, int dynamic_precedence = 0) : + steps(move(steps)), dynamic_precedence(dynamic_precedence) {} bool operator==(const Production &) const; inline ProductionStep &back() { return steps.back(); } diff --git a/test/compiler/build_tables/parse_item_set_builder_test.cc b/test/compiler/build_tables/parse_item_set_builder_test.cc index caceaad0..6cf5bb0e 100644 --- a/test/compiler/build_tables/parse_item_set_builder_test.cc +++ b/test/compiler/build_tables/parse_item_set_builder_test.cc @@ -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} }}, }, {}, {}, {}, {}}; diff --git a/test/compiler/prepare_grammar/flatten_grammar_test.cc b/test/compiler/prepare_grammar/flatten_grammar_test.cc index 5cd52d5c..1a42df2b 100644 --- a/test/compiler/prepare_grammar/flatten_grammar_test.cc +++ b/test/compiler/prepare_grammar/flatten_grammar_test.cc @@ -34,21 +34,21 @@ describe("flatten_grammar", []() { AssertThat(result.name, Equals("test")); AssertThat(result.type, Equals(VariableTypeNamed)); AssertThat(result.productions, Equals(vector({ - 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({ {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({ {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({ {Symbol::non_terminal(1), 101, AssociativityLeft, Alias{}}, - }, 0} + }, 0) }))); }); });