From eb20a995f28d11e061e0bbb1e1aeba54d6a5eba3 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan.bastani@ens.fr>
Date: Thu, 15 Dec 2011 11:49:04 +0100
Subject: [PATCH] preprocessor: allow symbol.subsample=symbol.subsample

---
 preprocessor/DynareBison.yy   |  5 +++++
 preprocessor/ParsingDriver.cc | 15 +++++++++++++++
 preprocessor/ParsingDriver.hh |  2 ++
 3 files changed, 22 insertions(+)

diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index 0dcbffb64c..d23d5137d0 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 c16e6fedd8..30ab3369db 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 0deebfd147..74ba84409d 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
-- 
GitLab