From d368a501d7e5f69da401a58ce888090d2790fcd8 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Fri, 15 Nov 2013 09:46:18 +0100 Subject: [PATCH 1/3] preprocessor: support long name for endogenous, #478 --- DynareBison.yy | 20 ++++++++++++++++++-- DynareFlex.ll | 2 ++ ParsingDriver.cc | 44 +++++++++++++++++++++++++++----------------- ParsingDriver.hh | 6 +++--- SymbolTable.cc | 13 +++++++++++-- SymbolTable.hh | 16 ++++++++++++++++ 6 files changed, 77 insertions(+), 24 deletions(-) diff --git a/DynareBison.yy b/DynareBison.yy index 7b047031..a12a7ad0 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -131,7 +131,7 @@ class ParsingDriver; %token UNIFORM_PDF UNIT_ROOT_VARS USE_DLL USEAUTOCORR GSA_SAMPLE_FILE USE_UNIVARIATE_FILTERS_IF_SINGULARITY_IS_DETECTED %token VALUES VAR VAREXO VAREXO_DET VAROBS PREDETERMINED_VARIABLES %token WRITE_LATEX_DYNAMIC_MODEL WRITE_LATEX_STATIC_MODEL -%token XLS_SHEET XLS_RANGE +%token XLS_SHEET XLS_RANGE LONG_NAME %left COMMA %left EQUAL_EQUAL EXCLAMATION_EQUAL %left LESS GREATER LESS_EQUAL GREATER_EQUAL @@ -181,7 +181,7 @@ class ParsingDriver; %type non_negative_number signed_number signed_integer date_number %type filename symbol vec_of_vec_value vec_value_list %type vec_value_1 vec_value signed_inf signed_number_w_inf -%type range vec_value_w_inf vec_value_1_w_inf +%type range vec_value_w_inf vec_value_1_w_inf named_var %type change_type_arg %type change_type_var_list subsamples_eq_opt prior_eq_opt options_eq_opt %type vec_int_elem vec_int_1 vec_int vec_int_number @@ -338,6 +338,12 @@ nonstationary_var_list : nonstationary_var_list symbol { driver.declare_nonstationary_var($3, $4); } | symbol TEX_NAME { driver.declare_nonstationary_var($1, $2); } + | nonstationary_var_list symbol TEX_NAME named_var + { driver.declare_nonstationary_var($2, $3, $4); } + | nonstationary_var_list COMMA symbol TEX_NAME named_var + { driver.declare_nonstationary_var($3, $4, $5); } + | symbol TEX_NAME named_var + { driver.declare_nonstationary_var($1, $2, $3); } ; varexo : VAREXO varexo_list ';'; @@ -348,6 +354,10 @@ predetermined_variables : PREDETERMINED_VARIABLES predetermined_variables_list ' parameters : PARAMETERS parameter_list ';'; +named_var : '(' LONG_NAME EQUAL QUOTED_STRING ')' + { $$ = $4; } + ; + var_list : var_list symbol { driver.declare_endogenous($2); } | var_list COMMA symbol @@ -360,6 +370,12 @@ var_list : var_list symbol { driver.declare_endogenous($3, $4); } | symbol TEX_NAME { driver.declare_endogenous($1, $2); } + | var_list symbol TEX_NAME named_var + { driver.declare_endogenous($2, $3, $4); } + | var_list COMMA symbol TEX_NAME named_var + { driver.declare_endogenous($3, $4, $5); } + | symbol TEX_NAME named_var + { driver.declare_endogenous($1, $2, $3); } ; varexo_list : varexo_list symbol diff --git a/DynareFlex.ll b/DynareFlex.ll index c58ca30a..31fb72c2 100644 --- a/DynareFlex.ll +++ b/DynareFlex.ll @@ -499,6 +499,8 @@ string eofbuff; analytic_derivation {return token::ANALYTIC_DERIVATION;} solver_periods {return token::SOLVER_PERIODS;} endogenous_prior {return token::ENDOGENOUS_PRIOR;} +long_name {return token::LONG_NAME;} + [\$][^$]*[\$] { strtok(yytext+1, "$"); diff --git a/ParsingDriver.cc b/ParsingDriver.cc index 55bf7aed..6d389865 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -131,14 +131,17 @@ ParsingDriver::warning(const string &m) } void -ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name) +ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name, const string *long_name) { try { - if (tex_name == NULL) + if (tex_name == NULL && long_name == NULL) mod_file->symbol_table.addSymbol(*name, type); else - mod_file->symbol_table.addSymbol(*name, type, *tex_name); + if (long_name == NULL) + mod_file->symbol_table.addSymbol(*name, type, *tex_name); + else + mod_file->symbol_table.addSymbol(*name, type, *tex_name, *long_name); } catch (SymbolTable::AlreadyDeclaredException &e) { @@ -150,18 +153,20 @@ ParsingDriver::declare_symbol(const string *name, SymbolType type, const string } void -ParsingDriver::declare_endogenous(string *name, string *tex_name) +ParsingDriver::declare_endogenous(string *name, string *tex_name, string *long_name) { - declare_symbol(name, eEndogenous, tex_name); + declare_symbol(name, eEndogenous, tex_name, long_name); delete name; if (tex_name != NULL) delete tex_name; + if (long_name != NULL) + delete long_name; } void ParsingDriver::declare_exogenous(string *name, string *tex_name) { - declare_symbol(name, eExogenous, tex_name); + declare_symbol(name, eExogenous, tex_name, NULL); delete name; if (tex_name != NULL) delete tex_name; @@ -170,7 +175,7 @@ ParsingDriver::declare_exogenous(string *name, string *tex_name) void ParsingDriver::declare_exogenous_det(string *name, string *tex_name) { - declare_symbol(name, eExogenousDet, tex_name); + declare_symbol(name, eExogenousDet, tex_name, NULL); delete name; if (tex_name != NULL) delete tex_name; @@ -179,7 +184,7 @@ ParsingDriver::declare_exogenous_det(string *name, string *tex_name) void ParsingDriver::declare_parameter(string *name, string *tex_name) { - declare_symbol(name, eParameter, tex_name); + declare_symbol(name, eParameter, tex_name, NULL); delete name; if (tex_name != NULL) delete tex_name; @@ -191,7 +196,7 @@ ParsingDriver::declare_statement_local_variable(string *name) if (mod_file->symbol_table.exists(*name)) error("Symbol " + *name + " cannot be assigned within a statement " + "while being assigned elsewhere in the modfile"); - declare_symbol(name, eStatementDeclaredVariable, NULL); + declare_symbol(name, eStatementDeclaredVariable, NULL, NULL); delete name; } @@ -215,7 +220,7 @@ ParsingDriver::begin_trend() void ParsingDriver::declare_trend_var(bool log_trend, string *name, string *tex_name) { - declare_symbol(name, log_trend ? eLogTrend : eTrend, tex_name); + declare_symbol(name, log_trend ? eLogTrend : eTrend, tex_name, NULL); declared_trend_vars.push_back(mod_file->symbol_table.getID(*name)); delete name; if (tex_name != NULL) @@ -333,17 +338,22 @@ ParsingDriver::add_expression_variable(string *name) } void -ParsingDriver::declare_nonstationary_var(string *name, string *tex_name) +ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, string *long_name) { if (tex_name != NULL) - declare_endogenous(new string(*name), new string(*tex_name)); + if (long_name != NULL) + declare_endogenous(new string(*name), new string(*tex_name), new string(*long_name)); + else + declare_endogenous(new string(*name), new string(*tex_name)); else - declare_endogenous(new string(*name), tex_name); + declare_endogenous(new string(*name)); declared_nonstationary_vars.push_back(mod_file->symbol_table.getID(*name)); mod_file->nonstationary_variables = true; delete name; if (tex_name != NULL) delete tex_name; + if (long_name != NULL) + delete long_name; } void @@ -2295,7 +2305,7 @@ ParsingDriver::external_function_option(const string &name_option, const string { if (opt.empty()) error("An argument must be passed to the 'name' option of the external_function() statement."); - declare_symbol(&opt, eExternalFunction, NULL); + declare_symbol(&opt, eExternalFunction, NULL, NULL); current_external_function_id = mod_file->symbol_table.getID(opt); } else if (name_option == "first_deriv_provided") @@ -2304,7 +2314,7 @@ ParsingDriver::external_function_option(const string &name_option, const string current_external_function_options.firstDerivSymbID = eExtFunSetButNoNameProvided; else { - declare_symbol(&opt, eExternalFunction, NULL); + declare_symbol(&opt, eExternalFunction, NULL, NULL); current_external_function_options.firstDerivSymbID = mod_file->symbol_table.getID(opt); } } @@ -2314,7 +2324,7 @@ ParsingDriver::external_function_option(const string &name_option, const string current_external_function_options.secondDerivSymbID = eExtFunSetButNoNameProvided; else { - declare_symbol(&opt, eExternalFunction, NULL); + declare_symbol(&opt, eExternalFunction, NULL, NULL); current_external_function_options.secondDerivSymbID = mod_file->symbol_table.getID(opt); } } @@ -2438,7 +2448,7 @@ ParsingDriver::add_model_var_or_external_function(string *function_name, bool in if (in_model_block) error("To use an external function (" + *function_name + ") within the model block, you must first declare it via the external_function() statement."); - declare_symbol(function_name, eExternalFunction, NULL); + declare_symbol(function_name, eExternalFunction, NULL, NULL); current_external_function_options.nargs = stack_external_function_args.top().size(); mod_file->external_functions_table.addExternalFunction(mod_file->symbol_table.getID(*function_name), current_external_function_options, in_model_block); diff --git a/ParsingDriver.hh b/ParsingDriver.hh index 8466deb0..db19f2b0 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -91,7 +91,7 @@ private: void check_symbol_is_endogenous_or_exogenous(string *name); //! Helper to add a symbol declaration - void declare_symbol(const string *name, SymbolType type, const string *tex_name); + void declare_symbol(const string *name, SymbolType type, const string *tex_name, const string *long_name); //! Creates option "optim_opt" in OptionsList if it doesn't exist, else add a comma, and adds the option name void optim_options_helper(const string &name); @@ -258,7 +258,7 @@ public: //! Sets the FILENAME for the initial value in initval void initval_file(string *filename); //! Declares an endogenous variable - void declare_endogenous(string *name, string *tex_name = NULL); + void declare_endogenous(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares an exogenous variable void declare_exogenous(string *name, string *tex_name = NULL); //! Declares an exogenous deterministic variable @@ -641,7 +641,7 @@ public: //! Ends declaration of trend variable void end_trend_var(expr_t growth_factor); //! Declares a nonstationary variable with its deflator - void declare_nonstationary_var(string *name, string *tex_name = NULL); + void declare_nonstationary_var(string *name, string *tex_name = NULL, string *long_name = NULL); //! Ends declaration of nonstationary variable void end_nonstationary_var(bool log_deflator, expr_t deflator); //! Add a graph format to the list of formats requested diff --git a/SymbolTable.cc b/SymbolTable.cc index b90b1ce5..039024e5 100644 --- a/SymbolTable.cc +++ b/SymbolTable.cc @@ -39,7 +39,7 @@ SymbolTable::SymbolTable() : frozen(false), size(0) } int -SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name) throw (AlreadyDeclaredException, FrozenException) +SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name, const string &long_name) throw (AlreadyDeclaredException, FrozenException) { if (frozen) throw FrozenException(); @@ -58,10 +58,17 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na type_table.push_back(type); name_table.push_back(name); tex_name_table.push_back(tex_name); + long_name_table.push_back(long_name); return id; } +int +SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name) throw (AlreadyDeclaredException, FrozenException) +{ + return addSymbol(name, type, tex_name, name); +} + int SymbolTable::addSymbol(const string &name, SymbolType type) throw (AlreadyDeclaredException, FrozenException) { @@ -188,10 +195,12 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException) { output << "M_.endo_names = '" << getName(endo_ids[0]) << "';" << endl; output << "M_.endo_names_tex = '" << getTeXName(endo_ids[0]) << "';" << endl; + output << "M_.endo_names_long = '" << getLongName(endo_ids[0]) << "';" << endl; for (int id = 1; id < endo_nbr(); id++) { output << "M_.endo_names = char(M_.endo_names, '" << getName(endo_ids[id]) << "');" << endl - << "M_.endo_names_tex = char(M_.endo_names_tex, '" << getTeXName(endo_ids[id]) << "');" << endl; + << "M_.endo_names_tex = char(M_.endo_names_tex, '" << getTeXName(endo_ids[id]) << "');" << endl + << "M_.endo_names_long = char(M_.endo_names_long, '" << getLongName(endo_ids[id]) << "');" << endl; } } if (param_nbr() > 0) diff --git a/SymbolTable.hh b/SymbolTable.hh index a8a032f5..dfc1e0ae 100644 --- a/SymbolTable.hh +++ b/SymbolTable.hh @@ -87,6 +87,8 @@ private: vector name_table; //! Maps IDs to TeX names vector tex_name_table; + //! Maps IDs to string names of variables + vector long_name_table; //! Maps IDs to types vector type_table; @@ -182,6 +184,9 @@ private: public: //! Add a symbol /*! Returns the symbol ID */ + int addSymbol(const string &name, SymbolType type, const string &tex_name, const string &long_name) throw (AlreadyDeclaredException, FrozenException); + //! Add a symbol without its long name (will be equal to its name) + /*! Returns the symbol ID */ int addSymbol(const string &name, SymbolType type, const string &tex_name) throw (AlreadyDeclaredException, FrozenException); //! Add a symbol without its TeX name (will be equal to its name) /*! Returns the symbol ID */ @@ -242,6 +247,8 @@ public: inline string getName(int id) const throw (UnknownSymbolIDException); //! Get TeX name inline string getTeXName(int id) const throw (UnknownSymbolIDException); + //! Get long name + inline string getLongName(int id) const throw (UnknownSymbolIDException); //! Get type (by ID) inline SymbolType getType(int id) const throw (UnknownSymbolIDException); //! Get type (by name) @@ -318,6 +325,15 @@ SymbolTable::getTeXName(int id) const throw (UnknownSymbolIDException) return tex_name_table[id]; } +inline string +SymbolTable::getLongName(int id) const throw (UnknownSymbolIDException) +{ + if (id < 0 || id >= size) + throw UnknownSymbolIDException(id); + else + return long_name_table[id]; +} + inline SymbolType SymbolTable::getType(int id) const throw (UnknownSymbolIDException) { From 8b34189bc3966d604944b513d298f89f5c3b3b40 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Fri, 15 Nov 2013 10:39:00 +0100 Subject: [PATCH 2/3] preprocessor: support long name for exogenous, #478 --- DynareBison.yy | 12 ++++++++++++ ParsingDriver.cc | 12 ++++++++---- ParsingDriver.hh | 4 ++-- SymbolTable.cc | 8 ++++++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/DynareBison.yy b/DynareBison.yy index a12a7ad0..08052f77 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -390,6 +390,12 @@ varexo_list : varexo_list symbol { driver.declare_exogenous($3, $4); } | symbol TEX_NAME { driver.declare_exogenous($1, $2); } + | varexo_list symbol TEX_NAME named_var + { driver.declare_exogenous($2, $3, $4); } + | varexo_list COMMA symbol TEX_NAME named_var + { driver.declare_exogenous($3, $4, $5); } + | symbol TEX_NAME named_var + { driver.declare_exogenous($1, $2, $3); } ; varexo_det_list : varexo_det_list symbol @@ -404,6 +410,12 @@ varexo_det_list : varexo_det_list symbol { driver.declare_exogenous_det($3, $4); } | symbol TEX_NAME { driver.declare_exogenous_det($1, $2); } + | varexo_det_list symbol TEX_NAME named_var + { driver.declare_exogenous_det($2, $3, $4); } + | varexo_det_list COMMA symbol TEX_NAME named_var + { driver.declare_exogenous_det($3, $4, $5); } + | symbol TEX_NAME named_var + { driver.declare_exogenous_det($1, $2, $3); } ; parameter_list : parameter_list symbol diff --git a/ParsingDriver.cc b/ParsingDriver.cc index 6d389865..79505b31 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -164,21 +164,25 @@ ParsingDriver::declare_endogenous(string *name, string *tex_name, string *long_n } void -ParsingDriver::declare_exogenous(string *name, string *tex_name) +ParsingDriver::declare_exogenous(string *name, string *tex_name, string *long_name) { - declare_symbol(name, eExogenous, tex_name, NULL); + declare_symbol(name, eExogenous, tex_name, long_name); delete name; if (tex_name != NULL) delete tex_name; + if (long_name != NULL) + delete long_name; } void -ParsingDriver::declare_exogenous_det(string *name, string *tex_name) +ParsingDriver::declare_exogenous_det(string *name, string *tex_name, string *long_name) { - declare_symbol(name, eExogenousDet, tex_name, NULL); + declare_symbol(name, eExogenousDet, tex_name, long_name); delete name; if (tex_name != NULL) delete tex_name; + if (long_name != NULL) + delete long_name; } void diff --git a/ParsingDriver.hh b/ParsingDriver.hh index db19f2b0..27d9800b 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -260,9 +260,9 @@ public: //! Declares an endogenous variable void declare_endogenous(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares an exogenous variable - void declare_exogenous(string *name, string *tex_name = NULL); + void declare_exogenous(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares an exogenous deterministic variable - void declare_exogenous_det(string *name, string *tex_name = NULL); + void declare_exogenous_det(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares a parameter void declare_parameter(string *name, string *tex_name = NULL); //! Declares a statement local variable diff --git a/SymbolTable.cc b/SymbolTable.cc index 039024e5..102814a9 100644 --- a/SymbolTable.cc +++ b/SymbolTable.cc @@ -175,20 +175,24 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException) { output << "M_.exo_names = '" << getName(exo_ids[0]) << "';" << endl; output << "M_.exo_names_tex = '" << getTeXName(exo_ids[0]) << "';" << endl; + output << "M_.exo_names_long = '" << getLongName(exo_ids[0]) << "';" << endl; for (int id = 1; id < exo_nbr(); id++) { output << "M_.exo_names = char(M_.exo_names, '" << getName(exo_ids[id]) << "');" << endl - << "M_.exo_names_tex = char(M_.exo_names_tex, '" << getTeXName(exo_ids[id]) << "');" << endl; + << "M_.exo_names_tex = char(M_.exo_names_tex, '" << getTeXName(exo_ids[id]) << "');" << endl + << "M_.exo_names_long = char(M_.exo_names_long, '" << getLongName(exo_ids[id]) << "');" << endl; } } if (exo_det_nbr() > 0) { output << "M_.exo_det_names = '" << getName(exo_det_ids[0]) << "';" << endl; output << "M_.exo_det_names_tex = '" << getTeXName(exo_det_ids[0]) << "';" << endl; + output << "M_.exo_det_names_long = '" << getLongName(exo_det_ids[0]) << "';" << endl; for (int id = 1; id < exo_det_nbr(); id++) { output << "M_.exo_det_names = char(M_.exo_det_names, '" << getName(exo_det_ids[id]) << "');" << endl - << "M_.exo_det_names_tex = char(M_.exo_det_names_tex, '" << getTeXName(exo_det_ids[id]) << "');" << endl; + << "M_.exo_det_names_tex = char(M_.exo_det_names_tex, '" << getTeXName(exo_det_ids[id]) << "');" << endl + << "M_.exo_det_names_long = char(M_.exo_det_names_long, '" << getLongName(exo_det_ids[id]) << "');" << endl; } } if (endo_nbr() > 0) From 14b6cf98fb7b90e4cd12f68ac020d9ac9a1831a8 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Fri, 15 Nov 2013 10:56:48 +0100 Subject: [PATCH 3/3] preprocessor: support long name for parameters, #478 --- DynareBison.yy | 6 ++++++ ParsingDriver.cc | 6 ++++-- ParsingDriver.hh | 2 +- SymbolTable.cc | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/DynareBison.yy b/DynareBison.yy index 08052f77..8753ac38 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -430,6 +430,12 @@ parameter_list : parameter_list symbol { driver.declare_parameter($3, $4); } | symbol TEX_NAME { driver.declare_parameter($1, $2); } + | parameter_list symbol TEX_NAME named_var + { driver.declare_parameter($2, $3, $4); } + | parameter_list COMMA symbol TEX_NAME named_var + { driver.declare_parameter($3, $4, $5); } + | symbol TEX_NAME named_var + { driver.declare_parameter($1, $2, $3); } ; predetermined_variables_list : predetermined_variables_list symbol diff --git a/ParsingDriver.cc b/ParsingDriver.cc index 79505b31..4e0a0e05 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -186,12 +186,14 @@ ParsingDriver::declare_exogenous_det(string *name, string *tex_name, string *lon } void -ParsingDriver::declare_parameter(string *name, string *tex_name) +ParsingDriver::declare_parameter(string *name, string *tex_name, string *long_name) { - declare_symbol(name, eParameter, tex_name, NULL); + declare_symbol(name, eParameter, tex_name, long_name); delete name; if (tex_name != NULL) delete tex_name; + if (long_name != NULL) + delete long_name; } void diff --git a/ParsingDriver.hh b/ParsingDriver.hh index 27d9800b..cb266d45 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -264,7 +264,7 @@ public: //! Declares an exogenous deterministic variable void declare_exogenous_det(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares a parameter - void declare_parameter(string *name, string *tex_name = NULL); + void declare_parameter(string *name, string *tex_name = NULL, string *long_name = NULL); //! Declares a statement local variable void declare_statement_local_variable(string *name); //! Completes a subsample statement diff --git a/SymbolTable.cc b/SymbolTable.cc index 102814a9..ae07a516 100644 --- a/SymbolTable.cc +++ b/SymbolTable.cc @@ -211,10 +211,12 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException) { output << "M_.param_names = '" << getName(param_ids[0]) << "';" << endl; output << "M_.param_names_tex = '" << getTeXName(param_ids[0]) << "';" << endl; + output << "M_.param_names_long = '" << getLongName(param_ids[0]) << "';" << endl; for (int id = 1; id < param_nbr(); id++) { output << "M_.param_names = char(M_.param_names, '" << getName(param_ids[id]) << "');" << endl - << "M_.param_names_tex = char(M_.param_names_tex, '" << getTeXName(param_ids[id]) << "');" << endl; + << "M_.param_names_tex = char(M_.param_names_tex, '" << getTeXName(param_ids[id]) << "');" << endl + << "M_.param_names_long = char(M_.param_names_long, '" << getLongName(param_ids[id]) << "');" << endl; if (getName(param_ids[id]) == "dsge_prior_weight") output << "options_.dsge_var = 1;" << endl;