diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 0dcbffb64..d23d5137d 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -218,6 +218,7 @@ statement : parameters | data | prior | subsamples + | subsamples_eq | varobs | observation_trends | unit_root_vars @@ -1202,6 +1203,10 @@ subsamples : symbol '.' SUBSAMPLES '(' subsamples_name_list ')' ';' { driver.set_subsamples($1); } ; +subsamples_eq : symbol '.' SUBSAMPLES EQUAL symbol '.' SUBSAMPLES ';' + { driver.copy_subsamples($1, $5); } + ; + subsamples_name_list : subsamples_name_list COMMA o_subsample_name | o_subsample_name ; diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index c16e6fedd..30ab3369d 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -1234,6 +1234,21 @@ ParsingDriver::estimation_data() options_list.clear(); } +void +ParsingDriver::copy_subsamples(string *to_parameter, string *from_parameter) +{ + check_symbol_is_parameter(to_parameter); + check_symbol_is_parameter(from_parameter); + if (subsample_declarations.find(*to_parameter) != subsample_declarations.end()) + error("Parameter " + *to_parameter + " has more than one subsample statement." + + "You may only have one subsample statement per parameter."); + if (subsample_declarations.find(*from_parameter) == subsample_declarations.end()) + error("Parameter " + *from_parameter + " does not have an associated subsample statement."); + subsample_declarations[*to_parameter] = subsample_declarations[*from_parameter]; + delete to_parameter; + delete from_parameter; +} + void ParsingDriver::set_subsamples(string *name) { diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 0deebfd14..74ba84409 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -256,6 +256,8 @@ public: void set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2); //! Adds a subsample range to the list of options for the prior statement void add_subsample_range(string *parameter, string *subsample_name); + //! Copies the set of subsamples from_parameter to_parameter + void copy_subsamples(string *to_parameter, string *from_parameter); //! Declares declare_optimal_policy_discount_factor as a parameter and initializes it to exprnode void declare_optimal_policy_discount_factor_parameter(expr_t exprnode); //! Adds a predetermined_variable