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-bf33cf982152time-shift
parent
4930f0669b
commit
8f48a7fed1
|
@ -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--;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue