v4 parser: use lexicographic order of MToken(s) in DataTree::mIndexOfTokens

git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@1056 ac1d8469-bf42-47a9-8791-bf33cf982152
time-shift
sebastien 2006-11-09 23:32:12 +00:00
parent 4930f0669b
commit 8f48a7fed1
3 changed files with 24 additions and 19 deletions

View File

@ -8,10 +8,7 @@
#include <string>
#include <vector>
#include <map>
//#include <ext/hash_map>
using namespace std;
//using __gnu_cxx::hash;
//using __gnu_cxx::hash_map;
#include <time.h>
//------------------------------------------------------------------------------
@ -40,26 +37,26 @@ DataTree::DataTree()
Zero->reference_count.resize(current_order+1,2);
Zero->idx = 0;
mModelTree.push_back(Zero);
mIndexOfTokens[Zero->Key()]=Zero;
mIndexOfTokens[*Zero]=Zero;
One->op_name = "";
One->reference_count.resize(current_order+1,1);
One->idx = 1;
mModelTree.push_back(One);
mIndexOfTokens[One->Key()]=One;
mIndexOfTokens[*One]=One;
MinusOne->op_name = operator_table.str(UMINUS);
MinusOne->reference_count.resize(current_order+1,1);
MinusOne->idx = 2;
mModelTree.push_back(MinusOne);
mIndexOfTokens[MinusOne->Key()]=MinusOne;
mIndexOfTokens[*MinusOne]=MinusOne;
// Pushing "0=0" into mModelTree
ZeroEqZero->op_name = operator_table.str(EQUAL);
ZeroEqZero->reference_count.resize(current_order+1,1);
ZeroEqZero->idx = 3;
mModelTree.push_back(ZeroEqZero);
mIndexOfTokens[ZeroEqZero->Key()]=ZeroEqZero;
mIndexOfTokens[*ZeroEqZero]=ZeroEqZero;
BeginModel = mModelTree.end();
BeginModel--;

View File

@ -13,7 +13,6 @@
#include <stack>
#include <sstream>
#include <fstream>
//#include <ext/hash_map>
#include <map>
#include <stdio.h>
//------------------------------------------------------------------------------
@ -24,7 +23,7 @@
#include "VariableTable.hh"
//------------------------------------------------------------------------------
typedef std::map<std::string,NodeID, std::less<std::string> > TreeMap;
typedef std::map<MToken, NodeID, MTokenLess> TreeMap;
typedef std::list<NodeID> TreeList;
typedef TreeList::iterator TreeIterator;
/*!
@ -149,7 +148,7 @@ inline NodeID DataTree::PushToken(NodeID iArg1,int iOpCode, NodeID iArg2, Type i
lToken->cost += iArg2->cost;
IncrementReferenceCount(iArg2);
}
mIndexOfTokens[lToken->Key()]=lToken;
mIndexOfTokens[*lToken] = lToken;
/*
std::cout << "ID = " << ID << " / " << mIndexOfTokens.size()-1<< " - " << getIDOfToken(lToken2) << " " <<
@ -180,9 +179,7 @@ inline void DataTree::IncrementReferenceCount(NodeID token)
//------------------------------------------------------------------------------
inline NodeID DataTree::getIDOfToken(const MToken &iToken)
{
TreeMap::iterator iter;
iter = mIndexOfTokens.find(iToken.Key());
TreeMap::iterator iter = mIndexOfTokens.find(iToken);
if (iter != mIndexOfTokens.end())
return iter->second;
else

View File

@ -68,16 +68,27 @@ public :
}
/*! Destructor */
~MToken() { }
};
/*! Computes the hash key */
inline std::string Key() const
/*!
\struct MTokenLess
\brief Class which defines a lexicographic order over MToken, used in std::map
*/
struct MTokenLess
{
bool operator()(const MToken &n1, const MToken &n2) const
{
char key[100];
snprintf(key, 100, "%p %p %d %d", id1, id2, type1, op_code);
// std::cout << key << std::endl;
return std::string(key);
if (n1.id1 != n2.id1)
return(n1.id1 < n2.id1);
else if (n1.id2 != n2.id2)
return(n1.id2 < n2.id2);
else if (n1.type1 != n2.type1)
return(n1.type1 < n2.type1);
else
return(n1.op_code < n2.op_code);
}
};
//------------------------------------------------------------------------------
/*!
\struct MetaToken