00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
#ifndef libmath_matcher_h
00024
#define libmath_matcher_h
00025
00026
#include <map>
00027
#include <list>
00028
#include <memory>
00029
#include <string>
00030
00031
namespace math {
00032
00033
template<
class T>
00034
class TMatchRegistry {
00035
public:
00036 TMatchRegistry();
00037 TMatchRegistry(
const TMatchRegistry<T>&);
00038
00040
void define(
const std::string& AId,
const TNode<T> *ANode);
00042
bool defined(
const std::string& AId)
const;
00044
const TNode<T> *get(
const std::string& AId)
const;
00045
00047
void mark(
const TNode<T> *ANode);
00048
00050
bool contains(
const TNode<T> *ANode)
const;
00051
00052
private:
00053
typedef std::map<std::string, const TNode<T> *> TAnyMap;
00054
typedef std::list<const TNode<T> *> TNodeList;
00055
00056 TAnyMap FAnyMap;
00057 TNodeList FNodeList;
00058 };
00059
00061
00062
00063
template <
class T>
00064
class TMatch {
00065
public:
00066
virtual ~TMatch() {}
00067
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const = 0;
00068 };
00069
00070
template <
class T>
00071
class TNumMatch :
public TMatch<T> {
00072
public:
00073 TNumMatch(
const T& ANum);
00074
00075
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00076
00077
private:
00078 T FNumber;
00079 };
00080
00081
template <
class T>
00082
class TAnyMatch :
public TMatch<T> {
00083
public:
00084 TAnyMatch(
const std::string& AId);
00085
00086
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00087
00088
private:
00089 std::string FIdent;
00090 };
00091
00094
template <
class T>
00095 class T2Match :
public TMatch<T> {
00096
protected:
00097
T2Match(TMatch<T> *ALeft, TMatch<T> *ARight);
00098 ~
T2Match();
00099
00100
00101
00102
typedef std::list<TMatch<T> *> TList;
00103
00104 TList FPatterns;
00105 };
00106
00107
template <
class T>
00108
class TPlusMatch :
public T2Match<T> {
00109
public:
00110 TPlusMatch(TMatch<T> *ALeft, TMatch<T> *ARight, ...);
00111
00112
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00113 };
00114
00115
template <
class T>
00116
class TMulMatch :
public T2Match<T> {
00117
public:
00118 TMulMatch(TMatch<T> *ALeft, TMatch<T> *ARight, ...);
00119
00120
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00121 };
00122
00123
template <
class T>
00124
class TNegMatch :
public TMatch<T> {
00125
public:
00126 TNegMatch(TMatch<T> *ANode);
00127
00128
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00129
00130
private:
00131 std::auto_ptr<TMatch<T> > FNode;
00132 };
00133
00134
template <
class T>
00135
class TDivMatch :
public TMatch<T> {
00136
public:
00137 TDivMatch(TMatch<T> *ALeft, TMatch<T> *ARight);
00138
00139
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00140
00141
private:
00142 std::auto_ptr<TMatch<T> > FLeft;
00143 std::auto_ptr<TMatch<T> > FRight;
00144 };
00145
00146
template <
class T>
00147
class TPowMatch :
public TMatch<T> {
00148
public:
00149 TPowMatch(TMatch<T> *ABase, TMatch<T> *AExp);
00150
00151
virtual bool match(
const TNode<T> *AExpr, TMatchRegistry<T> *AReg)
const;
00152
00153
private:
00154 std::auto_ptr<TMatch<T> > FBase;
00155 std::auto_ptr<TMatch<T> > FExp;
00156 };
00157
00175
template<
class T>
00176 class TMatcher :
public TNodeVisitor<T> {
00177
public:
00178
typedef std::map<std::string, TNode<T> > TResult;
00179
00183
static bool matchExact(
const TMatch<T> *AMatch,
const TNode<T> *AExpr,
00184 TMatchRegistry<T> *AReg = 0);
00185
00190
static bool match(
const TMatch<T> *AMatch,
const TNode<T> *AExpr,
00191 TMatchRegistry<T> *AReg = 0);
00192
00196
static unsigned match(
const std::string& AMatch,
const TNode<T> *AExpr,
00197 TResult& AResult);
00198
00199
private:
00200
TMatcher(
const TMatch<T> *AMatch,
const TNode<T> *ANode,
00201 TMatchRegistry<T> *AReg = 0);
00202
00203
private:
00204
const TMatch<T> *FMatch;
00205
const TNode<T> *FExpr;
00206
00207
private:
00208
virtual void visit(
TNumberNode<T> *);
00209
virtual void visit(
TSymbolNode<T> *);
00210
virtual void visit(
TParamNode<T> *);
00211
00212
virtual void visit(
TPlusNode<T> *);
00213
virtual void visit(
TNegNode<T> *);
00214
00215
virtual void visit(
TMulNode<T> *);
00216
virtual void visit(
TDivNode<T> *);
00217
00218
virtual void visit(
TPowNode<T> *);
00219
virtual void visit(
TSqrtNode<T> *);
00220
00221
virtual void visit(
TSinNode<T> *);
00222
virtual void visit(
TCosNode<T> *);
00223
virtual void visit(
TTanNode<T> *);
00224
virtual void visit(
TLnNode<T> *);
00225
00226
virtual void visit(
TFuncNode<T> *);
00227
virtual void visit(
TIfNode<T> *);
00228
00229
virtual void visit(
TEquNode<T> *);
00230
virtual void visit(TUnEquNode<T> *);
00231
virtual void visit(TGreaterNode<T> *);
00232
virtual void visit(TLessNode<T> *);
00233
virtual void visit(TGreaterEquNode<T> *);
00234
virtual void visit(TLessEquNode<T> *);
00235 };
00236
00237 }
00238
00239
#include <math++/matcher.tcc>
00240
00241
#endif