diff --git a/DynareBison.yy b/DynareBison.yy index 880b670d..a1fcd056 100644 --- a/DynareBison.yy +++ b/DynareBison.yy @@ -53,7 +53,6 @@ class ParsingDriver; vector *vector_string_val; vector *vector_int_val; pair *string_pair_val; - vector *> *vector_string_pair_val; PriorDistributions prior_distributions_val; }; @@ -183,8 +182,7 @@ class ParsingDriver; %type vec_value_1 vec_value signed_inf signed_number_w_inf %type range vec_value_w_inf vec_value_1_w_inf %type integer_range signed_integer_range sub_sampling_options list_sub_sampling_option -%type named_var_elem -%type named_var named_var_1 +%type named_var %type change_type_arg %type change_type_var_list subsamples_eq_opt prior_eq_opt options_eq_opt calibration_range %type vec_int_elem vec_int_1 vec_int vec_int_number @@ -377,36 +375,11 @@ predetermined_variables : PREDETERMINED_VARIABLES predetermined_variables_list ' parameters : PARAMETERS parameter_list ';'; -named_var_elem : symbol EQUAL QUOTED_STRING - { - pair *pr = new pair($1, $3); - $$ = pr; - } - -named_var_1 : '(' named_var_elem - { - $$ = new vector *>(); - $$->push_back($2); - } - | '(' COMMA named_var_elem - { - $$ = new vector *>(); - $$->push_back($3); - } - | named_var_1 named_var_elem - { - $1->push_back($2); - $$ = $1; - } - | named_var_1 COMMA named_var_elem - { - $1->push_back($3); - $$ = $1; - } - ; - -named_var : named_var_1 ')' { $$ = $1; } - | named_var_1 COMMA ')' { $$ = $1; } +named_var : '(' symbol EQUAL QUOTED_STRING ')' + { + pair *pr = new pair($2, $4); + $$ = pr; + } ; var_list : var_list symbol diff --git a/ParsingDriver.cc b/ParsingDriver.cc index 3ca5a401..6456f522 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -132,7 +132,7 @@ ParsingDriver::warning(const string &m) } void -ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name, const vector *> *partition_value) +ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name, const pair *partition_value) { try { @@ -156,7 +156,7 @@ ParsingDriver::declare_symbol(const string *name, SymbolType type, const string } void -ParsingDriver::declare_endogenous(string *name, string *tex_name, vector *> *partition_value) +ParsingDriver::declare_endogenous(string *name, string *tex_name, pair *partition_value) { declare_symbol(name, eEndogenous, tex_name, partition_value); delete name; @@ -164,19 +164,14 @@ ParsingDriver::declare_endogenous(string *name, string *tex_name, vector *>::iterator it = partition_value->begin(); - it != partition_value->end(); ++it) - { - delete (*it)->first; - delete (*it)->second; - delete (*it); - } + delete partition_value->first; + delete partition_value->second; delete partition_value; } } void -ParsingDriver::declare_exogenous(string *name, string *tex_name, vector *> *partition_value) +ParsingDriver::declare_exogenous(string *name, string *tex_name, pair *partition_value) { declare_symbol(name, eExogenous, tex_name, partition_value); delete name; @@ -184,19 +179,14 @@ ParsingDriver::declare_exogenous(string *name, string *tex_name, vector *>::iterator it = partition_value->begin(); - it != partition_value->end(); ++it) - { - delete (*it)->first; - delete (*it)->second; - delete (*it); - } + delete partition_value->first; + delete partition_value->second; delete partition_value; } } void -ParsingDriver::declare_exogenous_det(string *name, string *tex_name, vector *> *partition_value) +ParsingDriver::declare_exogenous_det(string *name, string *tex_name, pair *partition_value) { declare_symbol(name, eExogenousDet, tex_name, partition_value); delete name; @@ -204,19 +194,14 @@ ParsingDriver::declare_exogenous_det(string *name, string *tex_name, vector *>::iterator it = partition_value->begin(); - it != partition_value->end(); ++it) - { - delete (*it)->first; - delete (*it)->second; - delete (*it); - } + delete partition_value->first; + delete partition_value->second; delete partition_value; } } void -ParsingDriver::declare_parameter(string *name, string *tex_name, vector *> *partition_value) +ParsingDriver::declare_parameter(string *name, string *tex_name, pair *partition_value) { declare_symbol(name, eParameter, tex_name, partition_value); delete name; @@ -224,13 +209,8 @@ ParsingDriver::declare_parameter(string *name, string *tex_name, vector *>::iterator it = partition_value->begin(); - it != partition_value->end(); ++it) - { - delete (*it)->first; - delete (*it)->second; - delete (*it); - } + delete partition_value->first; + delete partition_value->second; delete partition_value; } } @@ -391,7 +371,7 @@ ParsingDriver::add_expression_variable(string *name) } void -ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, vector *> *partition_value) +ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, pair *partition_value) { if (tex_name == NULL && partition_value == NULL) declare_endogenous(new string(*name)); diff --git a/ParsingDriver.hh b/ParsingDriver.hh index 34a312d4..398c2a22 100644 --- a/ParsingDriver.hh +++ b/ParsingDriver.hh @@ -94,7 +94,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, const vector *> *partition_value); + void declare_symbol(const string *name, SymbolType type, const string *tex_name, const pair *partition_value); //! 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); @@ -277,13 +277,13 @@ 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, vector *> *partition_value = NULL); + void declare_endogenous(string *name, string *tex_name = NULL, pair *partition_value = NULL); //! Declares an exogenous variable - void declare_exogenous(string *name, string *tex_name = NULL, vector *> *partition_value = NULL); + void declare_exogenous(string *name, string *tex_name = NULL, pair *partition_value = NULL); //! Declares an exogenous deterministic variable - void declare_exogenous_det(string *name, string *tex_name = NULL, vector *> *partition_value = NULL); + void declare_exogenous_det(string *name, string *tex_name = NULL, pair *partition_value = NULL); //! Declares a parameter - void declare_parameter(string *name, string *tex_name = NULL, vector *> *partition_value = NULL); + void declare_parameter(string *name, string *tex_name = NULL, pair *partition_value = NULL); //! Declares a statement local variable void declare_statement_local_variable(string *name); //! Completes a subsample statement @@ -692,7 +692,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, vector *> *partition_value = NULL); + void declare_nonstationary_var(string *name, string *tex_name = NULL, pair *partition_value = 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 17b63e95..d957a44b 100644 --- a/SymbolTable.cc +++ b/SymbolTable.cc @@ -42,7 +42,7 @@ SymbolTable::SymbolTable() : frozen(false), size(0) } int -SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name, const vector *> *partition_value) throw (AlreadyDeclaredException, FrozenException) +SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name, const pair *partition_value) throw (AlreadyDeclaredException, FrozenException) { if (frozen) throw FrozenException(); @@ -67,15 +67,11 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na } } - string final_long_name = name; - bool non_long_name_partition_exists = false; - if (partition_value) - for (vector *>::const_iterator it = partition_value->begin(); - it != partition_value->end(); it++) - if (*((*it)->first) == "long_name") - final_long_name = *((*it)->second); - else - non_long_name_partition_exists = true; + string final_long_name; + if (partition_value == NULL || *(partition_value->first) != "long_name") + final_long_name = name; + else + final_long_name = *(partition_value->second); int id = size++; @@ -84,14 +80,9 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na name_table.push_back(name); tex_name_table.push_back(final_tex_name); long_name_table.push_back(final_long_name); - if (non_long_name_partition_exists) - { - map pmv; - for (vector *>::const_iterator it = partition_value->begin(); - it != partition_value->end(); it++) - pmv[*((*it)->first)] = *((*it)->second); - partition_value_map[id] = pmv; - } + if (partition_value && *(partition_value->first) != "long_name") + partition_value_map[id] = pair(new string(partition_value->first->c_str()), + new string(partition_value->second->c_str())); return id; } @@ -183,21 +174,21 @@ SymbolTable::getID(SymbolType type, int tsid) const throw (UnknownTypeSpecificID } } -map > -SymbolTable::getPartitionsForType(enum SymbolType st) const throw (UnknownSymbolIDException) +bool +SymbolTable::isFirstOfPartitionForType(int id) const throw (UnknownSymbolIDException) { - map > partitions; - for (map >::const_iterator it = partition_value_map.begin(); + if (id < 0 || id >= size || !hasPartition(id)) + throw UnknownSymbolIDException(id); + + string partition_name = getPartition(id); + SymbolType st = getType(id); + for (map >::const_iterator it = partition_value_map.begin(); it != partition_value_map.end(); it++) - if (getType(it->first) == st) - for (map::const_iterator it1 = it->second.begin(); - it1 != it->second.end(); it1++) - { - if (partitions.find(it1->first) == partitions.end()) - partitions[it1->first] = map (); - partitions[it1->first][it->first] = it1->second; - } - return partitions; + if (st == getType(it->first) && + it->first < id && + partition_name == *(it->second.first)) + return false; + return true; } void @@ -211,29 +202,23 @@ 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; + if (hasPartition(exo_ids[0])) + output << "M_.exo_" << getPartition(exo_ids[0]) << " = '" + << getPartitionValue(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_long = char(M_.exo_names_long, '" << getLongName(exo_ids[id]) << "');" << endl; - - - map > partitions = getPartitionsForType(eExogenous); - for (map >::const_iterator it = partitions.begin(); - it != partitions.end(); it++) - if (it->first != "long_name") - { - map::const_iterator it1; - output << "M_.exo_partitions." << it->first << " = { "; - for (int id = 0; id < exo_nbr(); id++) - { - output << "'"; - it1 = it->second.find(exo_ids[id]); - if (it1 != it->second.end()) - output << it1->second; - output << "' "; - } - output << "};" << endl; - } + { + 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_long = char(M_.exo_names_long, '" << getLongName(exo_ids[id]) << "');" << endl; + if (hasPartition(exo_ids[id])) + if (isFirstOfPartitionForType(exo_ids[id])) + output << "M_.exo_" << getPartition(exo_ids[id]) << " = '" + << getPartitionValue(exo_ids[id]) << "';" << endl; + else + output << "M_.exo_" << getPartition(exo_ids[id]) << " = " + << "char(M_.exo_" << getPartition(exo_ids[id]) << ", '" + << getPartitionValue(exo_ids[id]) << "');" << endl; + } } if (exo_det_nbr() > 0) @@ -241,29 +226,23 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException) 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; + if (hasPartition(exo_det_ids[0])) + output << "M_.exo_det_" << getPartition(exo_det_ids[0]) << " = '" + << getPartitionValue(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_long = char(M_.exo_det_names_long, '" << getLongName(exo_det_ids[id]) << "');" << endl; - - output << "M_.exo_det_partitions = struct();" << endl; - map > partitions = getPartitionsForType(eExogenousDet); - for (map >::const_iterator it = partitions.begin(); - it != partitions.end(); it++) - if (it->first != "long_name") - { - map::const_iterator it1; - output << "M_.exo_det_partitions." << it->first << " = { "; - for (int id = 0; id < exo_det_nbr(); id++) - { - output << "'"; - it1 = it->second.find(exo_det_ids[id]); - if (it1 != it->second.end()) - output << it1->second; - output << "' "; - } - output << "};" << endl; - } + { + 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_long = char(M_.exo_det_names_long, '" << getLongName(exo_det_ids[id]) << "');" << endl; + if (hasPartition(exo_det_ids[id])) + if (isFirstOfPartitionForType(exo_det_ids[id])) + output << "M_.exo_det_" << getPartition(exo_det_ids[id]) << " = '" + << getPartitionValue(exo_det_ids[id]) << "';" << endl; + else + output << "M_.exo_det_" << getPartition(exo_det_ids[id]) << " = " + << "char(M_.exo_det_" << getPartition(exo_det_ids[id]) << ", '" + << getPartitionValue(exo_det_ids[id]) << "');" << endl; + } } if (endo_nbr() > 0) @@ -271,29 +250,24 @@ 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_long = char(M_.endo_names_long, '" << getLongName(endo_ids[id]) << "');" << endl; + if (hasPartition(endo_ids[0])) + output << "M_.endo_" << getPartition(endo_ids[0]) << " = '" + << getPartitionValue(endo_ids[0]) << "';" << endl; - output << "M_.endo_partitions = struct();" << endl; - map > partitions = getPartitionsForType(eEndogenous); - for (map >::const_iterator it = partitions.begin(); - it != partitions.end(); it++) - if (it->first != "long_name") - { - map::const_iterator it1; - output << "M_.endo_partitions." << it->first << " = { "; - for (int id = 0; id < endo_nbr(); id++) - { - output << "'"; - it1 = it->second.find(endo_ids[id]); - if (it1 != it->second.end()) - output << it1->second; - output << "' "; - } - output << "};" << 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_long = char(M_.endo_names_long, '" << getLongName(endo_ids[id]) << "');" << endl; + if (hasPartition(endo_ids[id])) + if (isFirstOfPartitionForType(endo_ids[id])) + output << "M_.endo_" << getPartition(endo_ids[id]) << " = '" + << getPartitionValue(endo_ids[id]) << "';" << endl; + else + output << "M_.endo_" << getPartition(endo_ids[id]) << " = " + << "char(M_.endo_" << getPartition(endo_ids[id]) << ", '" + << getPartitionValue(endo_ids[id]) << "');" << endl; + } } if (param_nbr() > 0) @@ -301,6 +275,10 @@ 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; + if (hasPartition(param_ids[0])) + output << "M_.param_" << getPartition(param_ids[0]) << " = '" + << getPartitionValue(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 @@ -309,26 +287,16 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException) if (getName(param_ids[id]) == "dsge_prior_weight") output << "options_.dsge_var = 1;" << endl; - } - output << "M_.param_partitions = struct();" << endl; - map > partitions = getPartitionsForType(eParameter); - for (map >::const_iterator it = partitions.begin(); - it != partitions.end(); it++) - if (it->first != "long_name") - { - map::const_iterator it1; - output << "M_.param_partitions." << it->first << " = { "; - for (int id = 0; id < param_nbr(); id++) - { - output << "'"; - it1 = it->second.find(param_ids[id]); - if (it1 != it->second.end()) - output << it1->second; - output << "' "; - } - output << "};" << endl; - } + if (hasPartition(param_ids[id])) + if (isFirstOfPartitionForType(param_ids[id])) + output << "M_.param_" << getPartition(param_ids[id]) << " = '" + << getPartitionValue(param_ids[id]) << "';" << endl; + else + output << "M_.param_" << getPartition(param_ids[id]) << " = " + << "char(M_.param_" << getPartition(param_ids[id]) << ", '" + << getPartitionValue(param_ids[id]) << "');" << endl; + } } output << "M_.exo_det_nbr = " << exo_det_nbr() << ";" << endl diff --git a/SymbolTable.hh b/SymbolTable.hh index c99dd462..4f623dfd 100644 --- a/SymbolTable.hh +++ b/SymbolTable.hh @@ -97,7 +97,7 @@ private: //! Maps IDs to string names of variables vector long_name_table; //! Maps IDs to a pair containing the partition and the partition value - map > partition_value_map; + map > partition_value_map; //! Maps IDs to types vector type_table; @@ -196,7 +196,7 @@ private: public: //! Add a symbol /*! Returns the symbol ID */ - int addSymbol(const string &name, SymbolType type, const string &tex_name, const vector *> *partition_value) throw (AlreadyDeclaredException, FrozenException); + int addSymbol(const string &name, SymbolType type, const string &tex_name, const pair *partition_value) throw (AlreadyDeclaredException, FrozenException); //! Add a symbol without its TeX name (will be equal to its name) /*! Returns the symbol ID */ int addSymbol(const string &name, SymbolType type) throw (AlreadyDeclaredException, FrozenException); @@ -260,10 +260,14 @@ public: inline string getTeXName(int id) const throw (UnknownSymbolIDException); //! Get long name inline string getLongName(int id) const throw (UnknownSymbolIDException); + //! Has partition + inline bool hasPartition(int id) const throw (UnknownSymbolIDException); //! Returns true if the partition name is the first encountered for the type of variable represented by id bool isFirstOfPartitionForType(int id) const throw (UnknownSymbolIDException); - //! Returns a list of partitions and symbols that belong to that partition - map > getPartitionsForType(enum SymbolType st) const throw (UnknownSymbolIDException); + //! Get partition + inline string getPartition(int id) const throw (UnknownSymbolIDException); + //! Get partition value + inline string getPartitionValue(int id) const throw (UnknownSymbolIDException); //! Get type (by ID) inline SymbolType getType(int id) const throw (UnknownSymbolIDException); //! Get type (by name) @@ -361,6 +365,33 @@ SymbolTable::getLongName(int id) const throw (UnknownSymbolIDException) return long_name_table[id]; } +inline bool +SymbolTable::hasPartition(int id) const throw (UnknownSymbolIDException) +{ + if (id < 0 || id >= size) + throw UnknownSymbolIDException(id); + else + return partition_value_map.find(id) != partition_value_map.end(); +} + +inline string +SymbolTable::getPartition(int id) const throw (UnknownSymbolIDException) +{ + if (id < 0 || id >= size || !hasPartition(id)) + throw UnknownSymbolIDException(id); + else + return *(partition_value_map.at(id).first); +} + +inline string +SymbolTable::getPartitionValue(int id) const throw (UnknownSymbolIDException) +{ + if (id < 0 || id >= size || !hasPartition(id)) + throw UnknownSymbolIDException(id); + else + return *(partition_value_map.at(id).second); +} + inline SymbolType SymbolTable::getType(int id) const throw (UnknownSymbolIDException) {