From 8b899ad8067285295d7ee8a4aaf1bf4fa2890ca7 Mon Sep 17 00:00:00 2001 From: sebastien <sebastien@ac1d8469-bf42-47a9-8791-bf33cf982152> Date: Mon, 13 Oct 2008 16:44:20 +0000 Subject: [PATCH] trunk preprocessor: * forbid lead/lag on model local variables (constructed with pound sign) * forbid unknown function names in model block * code simplication git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2147 ac1d8469-bf42-47a9-8791-bf33cf982152 --- ExprNode.cc | 7 +++++++ ParsingDriver.cc | 33 +++++++++++---------------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/ExprNode.cc b/ExprNode.cc index 0f540c0c..964dd653 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 a6afab0a..341b9b30 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); -- GitLab