diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 3640edc61e290f48ccf7aa1082280ca247bc50b7..ea7d82e0df43c75e37ed60b73158388d6e6f13f4 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -331,6 +331,12 @@ nonstationary_var_list : nonstationary_var_list symbol { driver.declare_nonstationary_var($3); } | symbol { driver.declare_nonstationary_var($1); } + | nonstationary_var_list symbol named_var + { driver.declare_nonstationary_var($2, NULL, $3); } + | nonstationary_var_list COMMA symbol named_var + { driver.declare_nonstationary_var($3, NULL, $4); } + | symbol named_var + { driver.declare_nonstationary_var($1, NULL, $2); } | nonstationary_var_list symbol TEX_NAME { driver.declare_nonstationary_var($2, $3); } | nonstationary_var_list COMMA symbol TEX_NAME @@ -363,6 +369,12 @@ var_list : var_list symbol { driver.declare_endogenous($3); } | symbol { driver.declare_endogenous($1); } + | var_list symbol named_var + { driver.declare_endogenous($2, NULL, $3); } + | var_list COMMA symbol named_var + { driver.declare_endogenous($3, NULL, $4); } + | symbol named_var + { driver.declare_endogenous($1, NULL, $2); } | var_list symbol TEX_NAME { driver.declare_endogenous($2, $3); } | var_list COMMA symbol TEX_NAME @@ -383,6 +395,12 @@ varexo_list : varexo_list symbol { driver.declare_exogenous($3); } | symbol { driver.declare_exogenous($1); } + | varexo_list symbol named_var + { driver.declare_exogenous($2, NULL, $3); } + | varexo_list COMMA symbol named_var + { driver.declare_exogenous($3, NULL, $4); } + | symbol named_var + { driver.declare_exogenous($1, NULL, $2); } | varexo_list symbol TEX_NAME { driver.declare_exogenous($2, $3); } | varexo_list COMMA symbol TEX_NAME @@ -403,6 +421,12 @@ varexo_det_list : varexo_det_list symbol { driver.declare_exogenous_det($3); } | symbol { driver.declare_exogenous_det($1); } + | varexo_det_list symbol named_var + { driver.declare_exogenous_det($2, NULL, $3); } + | varexo_det_list COMMA symbol named_var + { driver.declare_exogenous_det($3, NULL, $4); } + | symbol named_var + { driver.declare_exogenous_det($1, NULL, $2); } | varexo_det_list symbol TEX_NAME { driver.declare_exogenous_det($2, $3); } | varexo_det_list COMMA symbol TEX_NAME @@ -423,6 +447,12 @@ parameter_list : parameter_list symbol { driver.declare_parameter($3); } | symbol { driver.declare_parameter($1); } + | parameter_list symbol named_var + { driver.declare_parameter($2, NULL, $3); } + | parameter_list COMMA symbol named_var + { driver.declare_parameter($3, NULL, $4); } + | symbol named_var + { driver.declare_parameter($1, NULL, $2); } | parameter_list symbol TEX_NAME { driver.declare_parameter($2, $3); } | parameter_list COMMA symbol TEX_NAME diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index 11e41faa1412dccac84a31199d1ba63b3b031ee9..e551078bae00a1b1eecdcd65041693f3ce7863d5 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -138,7 +138,9 @@ ParsingDriver::declare_symbol(const string *name, SymbolType type, const string if (tex_name == NULL && long_name == NULL) mod_file->symbol_table.addSymbol(*name, type); else - if (long_name == NULL) + if (tex_name == NULL) + mod_file->symbol_table.createTexNameAndAddSymbolWithLongName(*name, type, *long_name); + else 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); @@ -350,13 +352,16 @@ ParsingDriver::add_expression_variable(string *name) void ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, string *long_name) { - if (tex_name != NULL) - 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 + if (tex_name == NULL && long_name == NULL) declare_endogenous(new string(*name)); + else + if (tex_name == NULL) + declare_endogenous(new string(*name), NULL, new string(*long_name)); + else if (long_name == NULL) + declare_endogenous(new string(*name), new string(*tex_name)); + else + declare_endogenous(new string(*name), new string(*tex_name), new string(*long_name)); + declared_nonstationary_vars.push_back(mod_file->symbol_table.getID(*name)); mod_file->nonstationary_variables = true; delete name; diff --git a/preprocessor/SymbolTable.cc b/preprocessor/SymbolTable.cc index ae07a5165b4f8ab3b3e3a236b9d571d65c4c505c..d9404d713862bdbc1719858e244f1d3e7a60f527 100644 --- a/preprocessor/SymbolTable.cc +++ b/preprocessor/SymbolTable.cc @@ -71,16 +71,30 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na int SymbolTable::addSymbol(const string &name, SymbolType type) throw (AlreadyDeclaredException, FrozenException) +{ + string tex_name; + return addSymbol(name, type, construct_tex_name(name, tex_name)); +} + +int +SymbolTable::createTexNameAndAddSymbolWithLongName(const string &name, SymbolType type, const string &long_name) throw (AlreadyDeclaredException, FrozenException) +{ + string tex_name; + return addSymbol(name, type, construct_tex_name(name, tex_name), long_name); +} + +string & +SymbolTable::construct_tex_name(const string &name, string &tex_name) { // Construct "tex_name" by prepending an antislash to all underscores in "name" - string tex_name = name; + tex_name = name; size_t pos = 0; while ((pos = tex_name.find('_', pos)) != string::npos) { tex_name.insert(pos, "\\"); pos += 2; } - return addSymbol(name, type, tex_name); + return tex_name; } void diff --git a/preprocessor/SymbolTable.hh b/preprocessor/SymbolTable.hh index dfc1e0aec22f7148c65ec5392bab4978926ea789..e078f267a432195ad3da5fedd829dfd4786ba4ab 100644 --- a/preprocessor/SymbolTable.hh +++ b/preprocessor/SymbolTable.hh @@ -191,6 +191,12 @@ public: //! 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); + //! Tmp addSymbol function that creates a tex_name and declares a symbol + //! when the name and long_name are passed + /*! Returns the symbol ID */ + int createTexNameAndAddSymbolWithLongName(const string &name, SymbolType type, const string &long_name) throw (AlreadyDeclaredException, FrozenException); + //! Create a tex_name based on the variable name + string &construct_tex_name(const string &name, string &tex_name); //! Adds an auxiliary variable for endogenous with lead >= 2 /*! \param[in] index Used to construct the variable name