diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc index 592d20dcc..1049840d3 100644 --- a/preprocessor/ComputingTasks.cc +++ b/preprocessor/ComputingTasks.cc @@ -994,3 +994,20 @@ WriteLatexStaticModelStatement::writeOutput(ostream &output, const string &basen { static_model.writeLatexFile(basename); } + +ShockDecompositionStatement::ShockDecompositionStatement(const SymbolList &symbol_list_arg, + const OptionsList &options_list_arg) : + symbol_list(symbol_list_arg), + options_list(options_list_arg) +{ +} + +void +ShockDecompositionStatement::writeOutput(ostream &output, const string &basename) const +{ + options_list.writeOutput(output); + symbol_list.writeOutput("var_list_", output); + output << "oo_ = shock_decomposition(M_,oo_,options_,var_list_);\n"; +} + + diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh index 1810a699d..eca744d98 100644 --- a/preprocessor/ComputingTasks.hh +++ b/preprocessor/ComputingTasks.hh @@ -458,4 +458,15 @@ public: virtual void writeOutput(ostream &output, const string &basename) const; }; +class ShockDecompositionStatement : public Statement +{ +private: + const SymbolList symbol_list; + const OptionsList options_list; +public: + ShockDecompositionStatement(const SymbolList &symbol_list_arg, + const OptionsList &options_list_arg); + virtual void writeOutput(ostream &output, const string &basename) const; +}; + #endif diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index b868694b2..b15fb93f4 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -122,7 +122,7 @@ class ParsingDriver; %token SPARSE SPARSE_DLL STDERR STEADY STOCH_SIMUL %token TEX RAMSEY_POLICY PLANNER_DISCOUNT %token TEX_NAME -%token UNIFORM_PDF UNIT_ROOT_VARS USE_DLL +%token UNIFORM_PDF UNIT_ROOT_VARS USE_DLL SHOCK_DECOMPOSITION LABELS %token VALUES VAR VAREXO VAREXO_DET VAROBS %token WRITE_LATEX_DYNAMIC_MODEL WRITE_LATEX_STATIC_MODEL %token XLS_SHEET XLS_RANGE @@ -212,6 +212,7 @@ statement : parameters | identification | write_latex_dynamic_model | write_latex_static_model + | shock_decomposition ; dsample : DSAMPLE INT_NUMBER ';' @@ -719,6 +720,24 @@ symbol_list_ext : symbol_list driver.add_in_symbol_list(colon); } ; + +list_of_symbol_lists : symbol_list ';' NAME + { + string *semicolon = new string(";"); + driver.add_in_symbol_list(semicolon); + driver.add_in_symbol_list($3); + } + | list_of_symbol_lists NAME + { driver.add_in_symbol_list($2); } + | list_of_symbol_lists COMMA NAME + { driver.add_in_symbol_list($3); } + | list_of_symbol_lists ';' NAME + { + string *semicolon = new string(";"); + driver.add_in_symbol_list(semicolon); + driver.add_in_symbol_list($3); + } + ; signed_integer : PLUS INT_NUMBER { $$ = $2; } @@ -1169,6 +1188,16 @@ write_latex_static_model : WRITE_LATEX_STATIC_MODEL ';' { driver.write_latex_static_model(); } ; +shock_decomposition : SHOCK_DECOMPOSITION ';' + {driver.shock_decomposition(); } + | SHOCK_DECOMPOSITION '(' shock_decomposition_options_list ')' ';' + { driver.shock_decomposition(); } + | SHOCK_DECOMPOSITION symbol_list ';' + { driver.shock_decomposition(); } + | SHOCK_DECOMPOSITION '(' shock_decomposition_options_list ')' symbol_list ';' + { driver.shock_decomposition(); } + ; + bvar_prior_option : o_bvar_prior_tau | o_bvar_prior_decay | o_bvar_prior_lambda @@ -1269,6 +1298,14 @@ dynare_sensitivity_option : o_gsa_identification | o_gsa_trans_ident ; +shock_decomposition_options_list : shock_decomposition_option COMMA shock_decomposition_options_list + | shock_decomposition_option + ; + +shock_decomposition_option : o_parameters + | o_shocks + | o_labels + ; homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END { driver.end_homotopy();}; @@ -1436,6 +1473,10 @@ o_gsa_trans_ident : TRANS_IDENT EQUAL INT_NUMBER { driver.option_num("trans_iden o_homotopy_mode : HOMOTOPY_MODE EQUAL INT_NUMBER {driver.option_num("homotopy_mode",$3); }; o_homotopy_steps : HOMOTOPY_STEPS EQUAL INT_NUMBER {driver.option_num("homotopy_steps",$3); }; o_block_mfs : BLOCK_MFS { driver.option_num("block_mfs", "1"); } +o_parameters : PARAMETERS EQUAL NAME {driver.option_str("parameters",$3);}; +o_shocks : SHOCKS EQUAL '(' list_of_symbol_lists ')' { driver.option_symbol_list("shocks"); }; +o_labels : LABELS EQUAL '(' symbol_list ')' { driver.option_symbol_list("labels"); }; + range : NAME ':' NAME { diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index 013e116ff..5ee0ecdc0 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -135,6 +135,7 @@ int sigma_e = 0; dynare_sensitivity {BEGIN DYNARE_STATEMENT; return token::DYNARE_SENSITIVITY;} initval_file {BEGIN DYNARE_STATEMENT; return token::INITVAL_FILE;} forecast {BEGIN DYNARE_STATEMENT; return token::FORECAST;} +shock_decomposition {BEGIN DYNARE_STATEMENT; return token::SHOCK_DECOMPOSITION;} /* End of a Dynare statement */ ; { @@ -282,7 +283,7 @@ int sigma_e = 0; xls_range {return token::XLS_RANGE;} mh_recover {return token::MH_RECOVER;} planner_discount {return token::PLANNER_DISCOUNT;} - +labels {return token::LABELS;} [\.] {return Dynare::parser::token_type (yytext[0]);} [\\] {return Dynare::parser::token_type (yytext[0]);} diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index 7041a685f..ec46f99bc 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -1071,6 +1071,15 @@ ParsingDriver::bvar_forecast(string *nlags) delete nlags; } +void +ParsingDriver::shock_decomposition() +{ + mod_file->addStatement(new ShockDecompositionStatement(symbol_list, options_list)); + symbol_list.clear(); + options_list.clear(); +} + + NodeID ParsingDriver::add_model_equal(NodeID arg1, NodeID arg2) { diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 6f90c5174..399b8a24c 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -350,6 +350,8 @@ public: void bvar_density(string *maxnlags); //! BVAR forecast void bvar_forecast(string *nlags); + //! Shock decomposition + void shock_decomposition(); //! Writes token "arg1=arg2" to model tree NodeID add_model_equal(NodeID arg1, NodeID arg2); //! Writes token "arg=0" to model tree