preprocessor: allow arbitrary partitioning of variables (removes long_name keyword)
parent
e342858d04
commit
f0ff0d911b
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -52,6 +52,7 @@ class ParsingDriver;
|
|||
SymbolType symbol_type_val;
|
||||
vector<string *> *vector_string_val;
|
||||
vector<int> *vector_int_val;
|
||||
pair<string *, string *> *string_pair_val;
|
||||
PriorDistributions prior_distributions_val;
|
||||
};
|
||||
|
||||
|
@ -127,7 +128,7 @@ class ParsingDriver;
|
|||
%token UNIFORM_PDF UNIT_ROOT_VARS USE_DLL USEAUTOCORR GSA_SAMPLE_FILE USE_UNIVARIATE_FILTERS_IF_SINGULARITY_IS_DETECTED
|
||||
%token VALUES VAR VAREXO VAREXO_DET VAROBS PREDETERMINED_VARIABLES
|
||||
%token WRITE_LATEX_DYNAMIC_MODEL WRITE_LATEX_STATIC_MODEL WRITE_LATEX_ORIGINAL_MODEL
|
||||
%token XLS_SHEET XLS_RANGE LONG_NAME LMMCP OCCBIN BANDPASS_FILTER
|
||||
%token XLS_SHEET XLS_RANGE LMMCP OCCBIN BANDPASS_FILTER
|
||||
%left COMMA
|
||||
%left EQUAL_EQUAL EXCLAMATION_EQUAL
|
||||
%left LESS GREATER LESS_EQUAL GREATER_EQUAL
|
||||
|
@ -178,8 +179,9 @@ class ParsingDriver;
|
|||
%type <string_val> non_negative_number signed_number signed_integer date_str
|
||||
%type <string_val> filename symbol vec_of_vec_value vec_value_list date_expr
|
||||
%type <string_val> vec_value_1 vec_value signed_inf signed_number_w_inf
|
||||
%type <string_val> range vec_value_w_inf vec_value_1_w_inf named_var
|
||||
%type <string_val> range vec_value_w_inf vec_value_1_w_inf
|
||||
%type <string_val> integer_range signed_integer_range
|
||||
%type <string_pair_val> named_var
|
||||
%type <symbol_type_val> change_type_arg
|
||||
%type <vector_string_val> change_type_var_list subsamples_eq_opt prior_eq_opt options_eq_opt calibration_range
|
||||
%type <vector_int_val> vec_int_elem vec_int_1 vec_int vec_int_number
|
||||
|
@ -370,8 +372,11 @@ predetermined_variables : PREDETERMINED_VARIABLES predetermined_variables_list '
|
|||
|
||||
parameters : PARAMETERS parameter_list ';';
|
||||
|
||||
named_var : '(' LONG_NAME EQUAL QUOTED_STRING ')'
|
||||
{ $$ = $4; }
|
||||
named_var : '(' symbol EQUAL QUOTED_STRING ')'
|
||||
{
|
||||
pair<string *, string *> *pr = new pair<string *, string *>($2, $4);
|
||||
$$ = pr;
|
||||
}
|
||||
;
|
||||
|
||||
var_list : var_list symbol
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -572,7 +572,6 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
|
|||
<DYNARE_STATEMENT>analytic_derivation {return token::ANALYTIC_DERIVATION;}
|
||||
<DYNARE_STATEMENT>solver_periods {return token::SOLVER_PERIODS;}
|
||||
<DYNARE_STATEMENT>endogenous_prior {return token::ENDOGENOUS_PRIOR;}
|
||||
<DYNARE_STATEMENT>long_name {return token::LONG_NAME;}
|
||||
<DYNARE_STATEMENT>consider_all_endogenous {return token::CONSIDER_ALL_ENDOGENOUS;}
|
||||
<DYNARE_STATEMENT>consider_only_observed {return token::CONSIDER_ONLY_OBSERVED;}
|
||||
<DYNARE_STATEMENT>infile {return token::INFILE;}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -131,19 +131,19 @@ ParsingDriver::warning(const string &m)
|
|||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name, const string *long_name)
|
||||
ParsingDriver::declare_symbol(const string *name, SymbolType type, const string *tex_name, const pair<string *, string *> *partition_value)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (tex_name == NULL && long_name == NULL)
|
||||
if (tex_name == NULL && partition_value == NULL)
|
||||
mod_file->symbol_table.addSymbol(*name, type);
|
||||
else
|
||||
if (tex_name == NULL)
|
||||
mod_file->symbol_table.addSymbol(*name, type, "", *long_name);
|
||||
else if (long_name == NULL)
|
||||
mod_file->symbol_table.addSymbol(*name, type, *tex_name, "");
|
||||
mod_file->symbol_table.addSymbol(*name, type, "", partition_value);
|
||||
else if (partition_value == NULL)
|
||||
mod_file->symbol_table.addSymbol(*name, type, *tex_name, NULL);
|
||||
else
|
||||
mod_file->symbol_table.addSymbol(*name, type, *tex_name, *long_name);
|
||||
mod_file->symbol_table.addSymbol(*name, type, *tex_name, partition_value);
|
||||
}
|
||||
catch (SymbolTable::AlreadyDeclaredException &e)
|
||||
{
|
||||
|
@ -155,47 +155,63 @@ ParsingDriver::declare_symbol(const string *name, SymbolType type, const string
|
|||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_endogenous(string *name, string *tex_name, string *long_name)
|
||||
ParsingDriver::declare_endogenous(string *name, string *tex_name, pair<string *, string *> *partition_value)
|
||||
{
|
||||
declare_symbol(name, eEndogenous, tex_name, long_name);
|
||||
declare_symbol(name, eEndogenous, tex_name, partition_value);
|
||||
delete name;
|
||||
if (tex_name != NULL)
|
||||
delete tex_name;
|
||||
if (long_name != NULL)
|
||||
delete long_name;
|
||||
if (partition_value != NULL)
|
||||
{
|
||||
delete partition_value->first;
|
||||
delete partition_value->second;
|
||||
delete partition_value;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_exogenous(string *name, string *tex_name, string *long_name)
|
||||
ParsingDriver::declare_exogenous(string *name, string *tex_name, pair<string *, string *> *partition_value)
|
||||
{
|
||||
declare_symbol(name, eExogenous, tex_name, long_name);
|
||||
declare_symbol(name, eExogenous, tex_name, partition_value);
|
||||
delete name;
|
||||
if (tex_name != NULL)
|
||||
delete tex_name;
|
||||
if (long_name != NULL)
|
||||
delete long_name;
|
||||
if (partition_value != NULL)
|
||||
{
|
||||
delete partition_value->first;
|
||||
delete partition_value->second;
|
||||
delete partition_value;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_exogenous_det(string *name, string *tex_name, string *long_name)
|
||||
ParsingDriver::declare_exogenous_det(string *name, string *tex_name, pair<string *, string *> *partition_value)
|
||||
{
|
||||
declare_symbol(name, eExogenousDet, tex_name, long_name);
|
||||
declare_symbol(name, eExogenousDet, tex_name, partition_value);
|
||||
delete name;
|
||||
if (tex_name != NULL)
|
||||
delete tex_name;
|
||||
if (long_name != NULL)
|
||||
delete long_name;
|
||||
if (partition_value != NULL)
|
||||
{
|
||||
delete partition_value->first;
|
||||
delete partition_value->second;
|
||||
delete partition_value;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_parameter(string *name, string *tex_name, string *long_name)
|
||||
ParsingDriver::declare_parameter(string *name, string *tex_name, pair<string *, string *> *partition_value)
|
||||
{
|
||||
declare_symbol(name, eParameter, tex_name, long_name);
|
||||
declare_symbol(name, eParameter, tex_name, partition_value);
|
||||
delete name;
|
||||
if (tex_name != NULL)
|
||||
delete tex_name;
|
||||
if (long_name != NULL)
|
||||
delete long_name;
|
||||
if (partition_value != NULL)
|
||||
{
|
||||
delete partition_value->first;
|
||||
delete partition_value->second;
|
||||
delete partition_value;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -356,25 +372,29 @@ ParsingDriver::add_expression_variable(string *name)
|
|||
}
|
||||
|
||||
void
|
||||
ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, string *long_name)
|
||||
ParsingDriver::declare_nonstationary_var(string *name, string *tex_name, pair<string *, string *> *partition_value)
|
||||
{
|
||||
if (tex_name == NULL && long_name == NULL)
|
||||
if (tex_name == NULL && partition_value == 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), NULL, new pair<string *, string *>(*partition_value));
|
||||
else if (partition_value == NULL)
|
||||
declare_endogenous(new string(*name), new string(*tex_name));
|
||||
else
|
||||
declare_endogenous(new string(*name), new string(*tex_name), new string(*long_name));
|
||||
declare_endogenous(new string(*name), new string(*tex_name), new pair<string *, string *>(*partition_value));
|
||||
|
||||
declared_nonstationary_vars.push_back(mod_file->symbol_table.getID(*name));
|
||||
mod_file->nonstationary_variables = true;
|
||||
delete name;
|
||||
if (tex_name != NULL)
|
||||
delete tex_name;
|
||||
if (long_name != NULL)
|
||||
delete long_name;
|
||||
if (partition_value != NULL)
|
||||
{
|
||||
delete partition_value->first;
|
||||
delete partition_value->second;
|
||||
delete partition_value;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -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 string *long_name);
|
||||
void declare_symbol(const string *name, SymbolType type, const string *tex_name, const pair<string *, string *> *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);
|
||||
|
@ -268,13 +268,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, string *long_name = NULL);
|
||||
void declare_endogenous(string *name, string *tex_name = NULL, pair<string *, string *> *partition_value = NULL);
|
||||
//! Declares an exogenous variable
|
||||
void declare_exogenous(string *name, string *tex_name = NULL, string *long_name = NULL);
|
||||
void declare_exogenous(string *name, string *tex_name = NULL, pair<string *, string *> *partition_value = NULL);
|
||||
//! Declares an exogenous deterministic variable
|
||||
void declare_exogenous_det(string *name, string *tex_name = NULL, string *long_name = NULL);
|
||||
void declare_exogenous_det(string *name, string *tex_name = NULL, pair<string *, string *> *partition_value = NULL);
|
||||
//! Declares a parameter
|
||||
void declare_parameter(string *name, string *tex_name = NULL, string *long_name = NULL);
|
||||
void declare_parameter(string *name, string *tex_name = NULL, pair<string *, string *> *partition_value = NULL);
|
||||
//! Declares a statement local variable
|
||||
void declare_statement_local_variable(string *name);
|
||||
//! Completes a subsample statement
|
||||
|
@ -679,7 +679,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, string *long_name = NULL);
|
||||
void declare_nonstationary_var(string *name, string *tex_name = NULL, pair<string *, string *> *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
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -42,7 +42,7 @@ SymbolTable::SymbolTable() : frozen(false), size(0)
|
|||
}
|
||||
|
||||
int
|
||||
SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name, const string &long_name) throw (AlreadyDeclaredException, FrozenException)
|
||||
SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_name, const pair<string * , string *> *partition_value) throw (AlreadyDeclaredException, FrozenException)
|
||||
{
|
||||
if (frozen)
|
||||
throw FrozenException();
|
||||
|
@ -67,9 +67,11 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na
|
|||
}
|
||||
}
|
||||
|
||||
string final_long_name = long_name;
|
||||
if (final_long_name.empty())
|
||||
final_long_name = name;
|
||||
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++;
|
||||
|
||||
|
@ -78,14 +80,16 @@ 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 (partition_value && *(partition_value->first) != "long_name")
|
||||
partition_value_map[id] = pair<string *, string *>(new string(partition_value->first->c_str()),
|
||||
new string(partition_value->second->c_str()));
|
||||
return id;
|
||||
}
|
||||
|
||||
int
|
||||
SymbolTable::addSymbol(const string &name, SymbolType type) throw (AlreadyDeclaredException, FrozenException)
|
||||
{
|
||||
return addSymbol(name, type, "", "");
|
||||
return addSymbol(name, type, "", NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -170,6 +174,23 @@ SymbolTable::getID(SymbolType type, int tsid) const throw (UnknownTypeSpecificID
|
|||
}
|
||||
}
|
||||
|
||||
bool
|
||||
SymbolTable::isFirstOfPartitionForType(int id) const throw (UnknownSymbolIDException)
|
||||
{
|
||||
if (id < 0 || id >= size || !hasPartition(id))
|
||||
throw UnknownSymbolIDException(id);
|
||||
|
||||
string partition_name = getPartition(id);
|
||||
SymbolType st = getType(id);
|
||||
for (map<int, pair<string *, string * > >::const_iterator it = partition_value_map.begin();
|
||||
it != partition_value_map.end(); it++)
|
||||
if (st == getType(it->first) &&
|
||||
it->first < id &&
|
||||
partition_name == *(it->second.first))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException)
|
||||
{
|
||||
|
@ -181,42 +202,83 @@ 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;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
if (hasPartition(endo_ids[0]))
|
||||
output << "M_.endo_" << getPartition(endo_ids[0]) << " = '"
|
||||
<< getPartitionValue(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[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)
|
||||
{
|
||||
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
|
||||
|
@ -225,6 +287,15 @@ SymbolTable::writeOutput(ostream &output) const throw (NotYetFrozenException)
|
|||
|
||||
if (getName(param_ids[id]) == "dsge_prior_weight")
|
||||
output << "options_.dsge_var = 1;" << 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2015 Dynare Team
|
||||
* Copyright (C) 2003-2016 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -96,6 +96,8 @@ private:
|
|||
vector<string> tex_name_table;
|
||||
//! Maps IDs to string names of variables
|
||||
vector<string> long_name_table;
|
||||
//! Maps IDs to a pair containing the partition and the partition value
|
||||
map<int, pair<string *, string * > > partition_value_map;
|
||||
//! Maps IDs to types
|
||||
vector<SymbolType> type_table;
|
||||
|
||||
|
@ -191,7 +193,7 @@ private:
|
|||
public:
|
||||
//! Add a symbol
|
||||
/*! Returns the symbol ID */
|
||||
int addSymbol(const string &name, SymbolType type, const string &tex_name, const string &long_name) throw (AlreadyDeclaredException, FrozenException);
|
||||
int addSymbol(const string &name, SymbolType type, const string &tex_name, const pair<string *, string *> *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);
|
||||
|
@ -253,6 +255,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);
|
||||
//! 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)
|
||||
|
@ -348,6 +358,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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue