2006-11-05 00:31:17 +01:00
|
|
|
/*! \file
|
|
|
|
\version 1.0
|
|
|
|
\date 04/09/2004
|
|
|
|
\par This file implements the SymbolTable class methodes.
|
|
|
|
*/
|
2006-11-28 12:56:02 +01:00
|
|
|
|
2006-11-05 00:31:17 +01:00
|
|
|
#include <iostream>
|
|
|
|
#include <algorithm>
|
2006-11-28 12:56:02 +01:00
|
|
|
#include <sstream>
|
|
|
|
|
2006-11-05 00:31:17 +01:00
|
|
|
#include "SymbolTable.hh"
|
|
|
|
#include "Interface.hh"
|
|
|
|
using namespace std;
|
2006-11-28 12:56:02 +01:00
|
|
|
|
2006-12-18 12:29:10 +01:00
|
|
|
SymbolTable::SymbolTable() : endo_nbr(0), exo_nbr(0), exo_det_nbr(0), parameter_nbr(0),
|
2007-04-30 14:09:05 +02:00
|
|
|
model_local_variable_nbr(0), modfile_local_variable_nbr(0),
|
|
|
|
recur_nbr(0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
name_table.resize(20);
|
|
|
|
tex_name_table.resize(20);
|
|
|
|
}
|
|
|
|
|
|
|
|
int SymbolTable::AddSymbol(string name,Type type, string tex_name)
|
|
|
|
{
|
|
|
|
symboltable[name].type = type;
|
|
|
|
symboltable[name].referenced = eNotReferenced;
|
|
|
|
name_table[(int) type].push_back(name);
|
|
|
|
tex_name_table[(int) type].push_back(tex_name);
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case eExogenous:
|
2006-12-18 12:29:10 +01:00
|
|
|
symboltable[name].id = exo_nbr;
|
|
|
|
return exo_nbr++;
|
2006-11-05 00:31:17 +01:00
|
|
|
case eExogenousDet:
|
2006-12-18 12:29:10 +01:00
|
|
|
symboltable[name].id = exo_det_nbr;
|
|
|
|
return exo_det_nbr++;
|
2006-11-05 00:31:17 +01:00
|
|
|
case eEndogenous:
|
2006-12-18 12:29:10 +01:00
|
|
|
symboltable[name].id = endo_nbr;
|
|
|
|
return endo_nbr++;
|
2006-11-05 00:31:17 +01:00
|
|
|
case eParameter:
|
2006-12-18 12:29:10 +01:00
|
|
|
symboltable[name].id = parameter_nbr;
|
|
|
|
return parameter_nbr++;
|
2006-11-05 00:31:17 +01:00
|
|
|
case eRecursiveVariable:
|
2006-12-18 12:29:10 +01:00
|
|
|
symboltable[name].id = recur_nbr;
|
|
|
|
return recur_nbr++;
|
2007-04-30 14:09:05 +02:00
|
|
|
case eModelLocalVariable:
|
|
|
|
symboltable[name].id = model_local_variable_nbr;
|
|
|
|
return model_local_variable_nbr++;
|
|
|
|
case eModFileLocalVariable:
|
|
|
|
symboltable[name].id = modfile_local_variable_nbr;
|
|
|
|
return modfile_local_variable_nbr++;
|
2006-11-05 00:31:17 +01:00
|
|
|
}
|
2007-04-30 14:09:05 +02:00
|
|
|
// should never happen
|
|
|
|
return -1;
|
2006-11-05 00:31:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int SymbolTable::AddSymbolDeclar(string name,Type type, string tex_name)
|
|
|
|
{
|
|
|
|
//Testing if the symbol exist in the map
|
|
|
|
if ( !Exist(name) )
|
|
|
|
{
|
|
|
|
//The symbol dosn't exist, adding it
|
|
|
|
return AddSymbol(name,type, tex_name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//The symbol exists, testing its type
|
|
|
|
if (symboltable[name].type == type)
|
|
|
|
{
|
|
|
|
cout << "Warning : symbol " << name << " declared more than once.\n";
|
|
|
|
return getID(name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
string msg = "symbol " + name + " declared more than once with different types.";
|
|
|
|
(* error) (msg.c_str());
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void SymbolTable::AddSymbolRange(string name,int nbr,Type type, string tex_name)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void SymbolTable::ResetType(string name,Type new_type)
|
|
|
|
{
|
|
|
|
symboltable[name].type = new_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SymbolTable::SetReferenced(string name)
|
|
|
|
{
|
|
|
|
symboltable[name].referenced = eReferenced;
|
|
|
|
}
|
|
|
|
|
2006-11-28 12:56:02 +01:00
|
|
|
Reference SymbolTable::isReferenced(const std::string &name) const
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
2006-11-28 12:56:02 +01:00
|
|
|
symboltable_const_iterator iter = symboltable.find(name);
|
|
|
|
return iter->second.referenced;
|
2006-11-05 00:31:17 +01:00
|
|
|
}
|
|
|
|
|
2006-12-12 12:54:30 +01:00
|
|
|
void
|
2007-01-09 20:00:05 +01:00
|
|
|
SymbolTable::writeOutput(ostream &output) const
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
2006-12-18 12:29:10 +01:00
|
|
|
if (exo_nbr > 0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.exo_names = '" << getNameByID(eExogenous, 0) << "';\n";
|
|
|
|
output << "M_.exo_names_tex = '" << getTexNameByID(eExogenous, 0) << "';\n";
|
2006-12-18 12:29:10 +01:00
|
|
|
for (int id = 1; id < exo_nbr; id++)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.exo_names = " + interfaces::strvcat("M_.exo_names","'"+getNameByID(eExogenous, id)+"'") + ";\n";
|
|
|
|
output << "M_.exo_names_tex = " + interfaces::strvcat("M_.exo_names_tex","'"+getTexNameByID(eExogenous, id)+"'") + ";\n";
|
|
|
|
}
|
|
|
|
}
|
2006-12-18 12:29:10 +01:00
|
|
|
if (exo_det_nbr > 0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "lgxdet_ = '" << getNameByID(eExogenousDet, 0) << "';\n";
|
|
|
|
output << "lgxdet_tex_ = '" << getTexNameByID(eExogenousDet, 0) << "';\n";
|
2006-12-18 12:29:10 +01:00
|
|
|
for (int id = 1; id < exo_det_nbr; id++)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "lgxdet_ = " + interfaces::strvcat("lgxdet_","'"+getNameByID(eExogenousDet, id)+"'") + ";\n";
|
|
|
|
output << "lgxdet_tex_ = " + interfaces::strvcat("lgxdet_tex_","'"+getTexNameByID(eExogenousDet, id)+"'") + ";\n";
|
|
|
|
}
|
|
|
|
}
|
2006-12-18 12:29:10 +01:00
|
|
|
if (endo_nbr > 0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.endo_names = '" << getNameByID(eEndogenous, 0) << "';\n";
|
|
|
|
output << "M_.endo_names_tex = '" << getTexNameByID(eEndogenous, 0) << "';\n";
|
2006-12-18 12:29:10 +01:00
|
|
|
for (int id = 1; id < endo_nbr; id++)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.endo_names = " + interfaces::strvcat("M_.endo_names","'"+getNameByID(eEndogenous, id)+"'") + ";\n";
|
|
|
|
output << "M_.endo_names_tex = " + interfaces::strvcat("M_.endo_names_tex","'"+getTexNameByID(eEndogenous, id)+"'") + ";\n";
|
|
|
|
}
|
|
|
|
}
|
2006-12-18 12:29:10 +01:00
|
|
|
if (recur_nbr > 0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.recur_names = '" << getNameByID(eRecursiveVariable, 0) << "';\n";
|
|
|
|
output << "M_.recur_names_tex = '" << getTexNameByID(eRecursiveVariable, 0) << "';\n";
|
2006-12-18 12:29:10 +01:00
|
|
|
for (int id = 1; id < recur_nbr; id++)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.recur_names = " + interfaces::strvcat("M_.recur_names","'"+getNameByID(eRecursiveVariable, id)+"'") + ";\n";
|
|
|
|
output << "M_.recur_names_tex = " + interfaces::strvcat("M_.recur_names_tex","'"+getTexNameByID(eRecursiveVariable, id)+"'") + ";\n";
|
|
|
|
}
|
|
|
|
}
|
2006-12-18 12:29:10 +01:00
|
|
|
if (parameter_nbr > 0)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.param_names = '" << getNameByID(eParameter, 0) << "';\n";
|
|
|
|
output << "M_.param_names_tex = '" << getTexNameByID(eParameter, 0) << "';\n";
|
2006-12-18 12:29:10 +01:00
|
|
|
for (int id = 1; id < parameter_nbr; id++)
|
2006-11-05 00:31:17 +01:00
|
|
|
{
|
|
|
|
output << "M_.param_names = " + interfaces::strvcat("M_.param_names","'"+getNameByID(eParameter, id)+"'") + ";\n";
|
|
|
|
output << "M_.param_names_tex = " + interfaces::strvcat("M_.param_names_tex","'"+getTexNameByID(eParameter, id)+"'") + ";\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-18 12:29:10 +01:00
|
|
|
output << "M_.exo_det_nbr = " << exo_det_nbr << ";\n";
|
|
|
|
output << "M_.exo_nbr = " << exo_nbr << ";\n";
|
|
|
|
output << "M_.Sigma_e = zeros(" << exo_nbr
|
|
|
|
<< ", " << exo_nbr << ");\n";
|
|
|
|
output << "M_.endo_nbr = " << endo_nbr << ";\n";
|
|
|
|
output << "M_.recur_nbr = " << recur_nbr << ";\n";
|
|
|
|
output << "M_.param_nbr = " << parameter_nbr << ";\n";
|
2006-11-05 00:31:17 +01:00
|
|
|
}
|