diff --git a/ExprNode.cc b/ExprNode.cc index 0f540c0c9415c044058d4e577bb915cb68c2f060..964dd6534be1005421fcbebbf3c23c14069c3052 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -182,6 +182,13 @@ VariableNode::VariableNode(DataTree &datatree_arg, int symb_id_arg, Type type_ar else var_id = -1; + // It makes sense to allow a lead/lag on parameters: during steady state calibration, endogenous and parameters can be swapped + if ((type == eModelLocalVariable || type == eModFileLocalVariable || type == eUnknownFunction) && lag != 0) + { + cerr << "Attempt to construct a VariableNode for local variable or unknown function with non-zero lead/lag" << endl; + exit(-1); + } + // Fill in non_null_derivatives switch(type) { diff --git a/ParsingDriver.cc b/ParsingDriver.cc index a6afab0a86215b54a860f6b12ffacedeb1e33234..341b9b303bd3c50da18e101d83fbabdb9a78e300 100644 --- a/ParsingDriver.cc +++ b/ParsingDriver.cc @@ -155,22 +155,7 @@ ParsingDriver::add_constant(string *constant) NodeID ParsingDriver::add_model_variable(string *name) { - check_symbol_existence(*name); - NodeID id = model_tree->AddVariable(*name); - - Type type = mod_file->symbol_table.getType(*name); - - if (type == eModFileLocalVariable) - error("Variable " + *name + " not allowed inside model declaration. Its scope is only outside model."); - - if ((type == eEndogenous) && (model_tree->mode == eSparseDLLMode || model_tree->mode == eSparseMode)) - { - int ID = mod_file->symbol_table.getID(*name); - model_tree->block_triangular.fill_IM(model_tree->equation_number(), ID, 0); - } - - delete name; - return id; + return add_model_variable(name, new string("0")); } NodeID @@ -183,12 +168,16 @@ ParsingDriver::add_model_variable(string *name, string *olag) if (type == eModFileLocalVariable) error("Variable " + *name + " not allowed inside model declaration. Its scope is only outside model."); - if ((type == eExogenous) && lag != 0) - { - ostringstream ost; - ost << "Exogenous variable " << *name << " has lag " << lag; - warning(ost.str()); - } + if (type == eUnknownFunction) + error("Symbol " + *name + " is a function name unknown to Dynare. It cannot be used inside model."); + + if (type == eExogenous && lag != 0) + warning("Exogenous variable " + *name + " has lead/lag " + *olag); + + if (type == eModelLocalVariable && lag != 0) + error("Model local variable " + *name + " cannot be given a lead or a lag."); + + // It makes sense to allow a lead/lag on parameters: during steady state calibration, endogenous and parameters can be swapped NodeID id = model_tree->AddVariable(*name, lag);