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 <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
//#include <ext/hash_map>
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
//using __gnu_cxx::hash;
|
|
||||||
//using __gnu_cxx::hash_map;
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -40,26 +37,26 @@ DataTree::DataTree()
|
||||||
Zero->reference_count.resize(current_order+1,2);
|
Zero->reference_count.resize(current_order+1,2);
|
||||||
Zero->idx = 0;
|
Zero->idx = 0;
|
||||||
mModelTree.push_back(Zero);
|
mModelTree.push_back(Zero);
|
||||||
mIndexOfTokens[Zero->Key()]=Zero;
|
mIndexOfTokens[*Zero]=Zero;
|
||||||
|
|
||||||
One->op_name = "";
|
One->op_name = "";
|
||||||
One->reference_count.resize(current_order+1,1);
|
One->reference_count.resize(current_order+1,1);
|
||||||
One->idx = 1;
|
One->idx = 1;
|
||||||
mModelTree.push_back(One);
|
mModelTree.push_back(One);
|
||||||
mIndexOfTokens[One->Key()]=One;
|
mIndexOfTokens[*One]=One;
|
||||||
|
|
||||||
MinusOne->op_name = operator_table.str(UMINUS);
|
MinusOne->op_name = operator_table.str(UMINUS);
|
||||||
MinusOne->reference_count.resize(current_order+1,1);
|
MinusOne->reference_count.resize(current_order+1,1);
|
||||||
MinusOne->idx = 2;
|
MinusOne->idx = 2;
|
||||||
mModelTree.push_back(MinusOne);
|
mModelTree.push_back(MinusOne);
|
||||||
mIndexOfTokens[MinusOne->Key()]=MinusOne;
|
mIndexOfTokens[*MinusOne]=MinusOne;
|
||||||
|
|
||||||
// Pushing "0=0" into mModelTree
|
// Pushing "0=0" into mModelTree
|
||||||
ZeroEqZero->op_name = operator_table.str(EQUAL);
|
ZeroEqZero->op_name = operator_table.str(EQUAL);
|
||||||
ZeroEqZero->reference_count.resize(current_order+1,1);
|
ZeroEqZero->reference_count.resize(current_order+1,1);
|
||||||
ZeroEqZero->idx = 3;
|
ZeroEqZero->idx = 3;
|
||||||
mModelTree.push_back(ZeroEqZero);
|
mModelTree.push_back(ZeroEqZero);
|
||||||
mIndexOfTokens[ZeroEqZero->Key()]=ZeroEqZero;
|
mIndexOfTokens[*ZeroEqZero]=ZeroEqZero;
|
||||||
|
|
||||||
BeginModel = mModelTree.end();
|
BeginModel = mModelTree.end();
|
||||||
BeginModel--;
|
BeginModel--;
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
//#include <ext/hash_map>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -24,7 +23,7 @@
|
||||||
#include "VariableTable.hh"
|
#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 std::list<NodeID> TreeList;
|
||||||
typedef TreeList::iterator TreeIterator;
|
typedef TreeList::iterator TreeIterator;
|
||||||
/*!
|
/*!
|
||||||
|
@ -149,7 +148,7 @@ inline NodeID DataTree::PushToken(NodeID iArg1,int iOpCode, NodeID iArg2, Type i
|
||||||
lToken->cost += iArg2->cost;
|
lToken->cost += iArg2->cost;
|
||||||
IncrementReferenceCount(iArg2);
|
IncrementReferenceCount(iArg2);
|
||||||
}
|
}
|
||||||
mIndexOfTokens[lToken->Key()]=lToken;
|
mIndexOfTokens[*lToken] = lToken;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
std::cout << "ID = " << ID << " / " << mIndexOfTokens.size()-1<< " - " << getIDOfToken(lToken2) << " " <<
|
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)
|
inline NodeID DataTree::getIDOfToken(const MToken &iToken)
|
||||||
{
|
{
|
||||||
TreeMap::iterator iter;
|
TreeMap::iterator iter = mIndexOfTokens.find(iToken);
|
||||||
|
|
||||||
iter = mIndexOfTokens.find(iToken.Key());
|
|
||||||
if (iter != mIndexOfTokens.end())
|
if (iter != mIndexOfTokens.end())
|
||||||
return iter->second;
|
return iter->second;
|
||||||
else
|
else
|
||||||
|
|
|
@ -68,16 +68,27 @@ public :
|
||||||
}
|
}
|
||||||
/*! Destructor */
|
/*! Destructor */
|
||||||
~MToken() { }
|
~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];
|
if (n1.id1 != n2.id1)
|
||||||
snprintf(key, 100, "%p %p %d %d", id1, id2, type1, op_code);
|
return(n1.id1 < n2.id1);
|
||||||
// std::cout << key << std::endl;
|
else if (n1.id2 != n2.id2)
|
||||||
return std::string(key);
|
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
|
\struct MetaToken
|
||||||
|
|
Loading…
Reference in New Issue