有限状态机

  1 #pragma once
  2 #include "....dscript	able.h"
  3 #include "....dscript	ableD_resEditListCtrl.h"
  4 #include "..PropertyGridExDrawLotsDlg.h"
  5 #include "..dbase_header.h"
  6 #include <afx.h>
  7 #include "....dscriptdscript_enum_header.h"
  8 #include "....dscriptgNewPbCalcRulecountDeal.h"
  9 
 10 using namespace std;
 11 class Cfyq_expression;
 12 class Cfyq_Name;
 13 class Cfyq_node;
 14 class Cfyq_Var;
 15 class Cfyq_scope;
 16 class Cfyq_const;
 17 class Cfyq_offset;
 18 class Cfyq_jzj;
 19 class Cfyq_opt;
 20 class Cfyq_set;
 21 typedef std::vector<Cfyq_node*>    vec_fyq_Node;
 22 typedef std::vector<Cfyq_Var*>    vec_fyq_Var;
 23 typedef std::vector<Cfyq_const*>    vec_fyq_Const;
 24 typedef std::vector<Cfyq_scope*>    vec_fyq_Scope;
 25 typedef std::vector<Cfyq_opt*>    vec_fyq_opt;
 26 typedef std::vector<Cfyq_set*>    vec_fyq_set;
 27 enum CFyq_NodeKind{FNK_Name, FNK_Param, FNK_Scope, FNK_Const, FNK_Value, FNK_Set, FNK_Define, FNK_Offset,FNK_Node,FNK_Jzj};
 28 
 29 class   Cfyq_Interpreter : public CTableRow
 30 {
 31 
 32 public:
 33     Cfyq_Interpreter();
 34     ~Cfyq_Interpreter();
 35 public:
 36     bool Interpreter(const CString& strFormula);
 37     void backInterpreter(Cfyq_node* startName,CString& backstr);
 38     void pushback(Cfyq_node* startName, CString& backstr);
 39     bool push( char input );
 40     void ChangeNode(Cfyq_node* pState);
 41     void ChangeBackNode(Cfyq_node* pstate);
 42 
 43     bool NextStrIs(const CString& str);
 44     bool NextStrIsIgnoreSpace(const CString& str);
 45     bool LastStrIsIgnoreSpace(const CString& str);
 46     static bool IsTrueChar(char c);
 47     static bool IsChineseChar(char c);
 48     virtual bool toString(CString& txt);
 49     bool CheckName(  CString& title );
 50     bool CheckParam( CString& title );
 51     bool CheckConst( CString& title );
 52 public:
 53     Cfyq_node* GetCurNode(){ return m_pCurNode; }
 54     Cfyq_Name* GetCurName(){ return m_pCurName; }
 55     Cfyq_node* GetCurBackNode();
 56     Cfyq_node* CreateNode(CFyq_NodeKind kind);
 57     vec_fyq_Node& GetvecExpression(){ return m_vecExpression; }
 58 public:
 59     //检查集合
 60     vecSysCodeKindDataInfo m_param_obj;
 61     vecSysCodeKindDataInfo m_name_obj;
 62     vecSysCodeKindDataInfo m_const_obj;
 63 private:
 64     CString m_strFormula;//公式
 65     UINT m_nCurIndex;//当前索引
 66     Cfyq_node* m_pCurNode;//当前状态
 67     Cfyq_Name* m_pCurName;//当前name
 68     Cfyq_node* m_pCurBackNode;//反解析当前状态
 69     vec_fyq_Node m_vecExpression;//State存放集合
 70 };
 71 //节点
 72 class  Cfyq_node : public CTableRow
 73 {
 74     DECLARE_SERIAL_EXTDLL( Cfyq_node )
 75 public:
 76     Cfyq_node();
 77     virtual ~Cfyq_node();
 78 public:
 79     virtual int Accept( Cfyq_Interpreter* pInterpreter, char input );
 80     virtual bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
 81     virtual void NextBackNode(Cfyq_node* startName,CString& str, Cfyq_Interpreter* pInterpreter,bool bLast);
 82     virtual CFyq_NodeKind GetNodeGrade();
 83     virtual void ErrorMsg(CString& str);
 84     void Serialize(CArchive& ar);
 85 public:
 86     CString& GetContent();
 87 public:
 88     vec_fyq_Node m_vecSubNode;
 89     double m_dValue;
 90     CString m_sValue;
 91     CString m_strContent;
 92     bool m_bStateInputChar;
 93 protected:
 94     Cfyq_Interpreter* m_pInterpreter;
 95 };
 96 
 97 //元素
 98 class  Cfyq_element : public Cfyq_node
 99 {
100     DECLARE_SERIAL_EXTDLL( Cfyq_element )
101 public:
102     Cfyq_element();
103     ~Cfyq_element(){};
104 public:
105     bool IsClose();;
106     void SetClose(bool val);
107     int AppendChar( Cfyq_Interpreter* pInterpreter, char input );
108     void Serialize(CArchive& ar);
109 private:
110     bool m_bIsCloseFlag;
111 };
112 
113 //常量
114 class  Cfyq_const : public Cfyq_element
115 {
116     DECLARE_SERIAL_EXTDLL( Cfyq_const )
117 public:
118     Cfyq_const(){}
119     ~Cfyq_const(){}
120 public:
121     int Accept( Cfyq_Interpreter* pInterpreter, char input );
122     bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
123     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
124     virtual CFyq_NodeKind GetNodeGrade() {return FNK_Const;}
125     virtual void ErrorMsg(CString& str);
126     void Serialize(CArchive& ar);
127 };
128 
129 //用户变量 {kjb:正偏离扣减}
130 class  Cfyq_Var : public Cfyq_element
131 {
132     DECLARE_SERIAL_EXTDLL( Cfyq_Var )
133 public:
134     CString m_sEngName;//英文名
135     bool m_bInited;//是否被赋值
136     CString m_sExplain;//中文解释
137     CString m_dValueToStr; //数字字符串
138     int m_nLifePeriod;//生命周期 0是测试阶段 1是代理阶段
139 public:
140     Cfyq_Var();
141     ~Cfyq_Var(){};
142     void SetEngName(CString name);
143     void SetExplain(CString Explain);
144     int Accept( Cfyq_Interpreter* pInterpreter, char input );
145     bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
146 
147     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
148 
149     virtual CFyq_NodeKind GetNodeGrade() {return FNK_Value;}
150 
151     virtual void ErrorMsg(CString& str);
152 
153     void Serialize(CArchive& ar);
154 };
155 
156 //:取值范围
157 class  Cfyq_scope : public Cfyq_element
158 {
159     DECLARE_SERIAL_EXTDLL( Cfyq_scope )
160 public:
161     Cfyq_scope();
162     ~Cfyq_scope();
163 protected:
164     int m_bFlag;//0:- 范围用法;1:,去除用法
165     int  m_MinMax[105][4]; //最大可支持105个范围区间
166     int m_nrow;
167 public:
168 
169     int GetMinCount(int index);
170     int GetMaxCount(int index);
171     int GetMin(int index);
172     int GetMax(int index);
173 
174     void SetRow(int row);
175     int GetRow();
176     bool SetScope();
177     bool ReplaceScope(CString strTemp);
178     bool SetScopeToName(Cfyq_Interpreter* pInterpreter);
179     int GetFlag();
180     void Serialize(CArchive& ar);
181     virtual void ErrorMsg(CString& str);
182 public:
183     int Accept( Cfyq_Interpreter* pInterpreter, char input );
184     bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
185     virtual CFyq_NodeKind GetNodeGrade();
186 };
187 
188 
189 class  Cfyq_Name : public Cfyq_element
190 {
191     DECLARE_SERIAL_EXTDLL( Cfyq_Name )
192 public:
193     Cfyq_Name();
194     ~Cfyq_Name();
195 protected:
196     CString        m_sParam;
197     Cfyq_scope*    m_pScope;
198     Cfyq_jzj*   m_pjzj;
199 public:
200     virtual int Accept( Cfyq_Interpreter* pInterpreter, char input );
201     virtual bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
202     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
203 
204     CString GetParam();
205     void SetParam(CString val);
206     Cfyq_scope* GetScope();
207     void SetScope(Cfyq_scope* val);
208     Cfyq_jzj* Getjzj() const;
209     void Setjzj(Cfyq_jzj* jzj);
210 
211     virtual void ErrorMsg(CString& str);
212 
213     virtual CFyq_NodeKind GetNodeGrade();
214 
215     void Serialize(CArchive& ar);
216 public:
217     int m_bcanSerial;
218     int m_bcanSerialjzj;
219 };
220 
221 class  Cfyq_jzj : public Cfyq_element
222 {
223     DECLARE_SERIAL_DSCRIPT( Cfyq_jzj )
224 public:
225     Cfyq_jzj();
226     ~Cfyq_jzj();
227     int Accept(Cfyq_Interpreter* pInterpreter, char input);
228     bool NextNode(Cfyq_Interpreter* pInterpreter, char  input);
229     virtual CFyq_NodeKind GetNodeGrade();
230     void Serialize(CArchive& ar);
231     bool SetjzjToName(Cfyq_Interpreter* pInterpreter);
232 public:
233     long m_nkind;
234 };
235 
236 //参数
237 class  Cfyq_Param: public Cfyq_element
238 {
239     DECLARE_SERIAL_EXTDLL( Cfyq_Param )
240 public:
241     Cfyq_Param();
242     ~Cfyq_Param(){}
243 public:
244     bool SetParamToName(Cfyq_Interpreter* pInterpreter);
245     virtual int Accept( Cfyq_Interpreter* pInterpreter, char input );
246     virtual bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
247     virtual CFyq_NodeKind GetNodeGrade();
248     virtual void ErrorMsg(CString& str);
249     void Serialize(CArchive& ar);
250 };
251 
252 //操作符
253 class  Cfyq_opt: public Cfyq_node
254 {
255     DECLARE_SERIAL_EXTDLL( Cfyq_opt )
256 public:
257     Cfyq_opt();
258     ~Cfyq_opt();
259 protected:
260     vec_fyq_Node m_nodes; 
261 public:
262     void Serialize(CArchive& ar);
263 };
264 
265 
266 //:定义
267 class  Cfyq_define: public Cfyq_opt
268 {
269     DECLARE_SERIAL_EXTDLL( Cfyq_define )
270 public:
271     Cfyq_define();
272     ~Cfyq_define(){}
273 public:
274     virtual int Accept( Cfyq_Interpreter* pInterpreter, char input );
275     virtual bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
276     virtual CFyq_NodeKind GetNodeGrade();
277     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
278     void Serialize(CArchive& ar);
279 };
280 
281 //=赋值
282 class  Cfyq_set: public Cfyq_opt
283 {
284     DECLARE_SERIAL_EXTDLL( Cfyq_set )
285 public:
286     Cfyq_set();
287     ~Cfyq_set();
288     virtual int Accept( Cfyq_Interpreter* pInterpreter, char input );
289     virtual bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
290     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
291     virtual CFyq_NodeKind GetNodeGrade();
292     void Serialize(CArchive& ar);
293 };
294 
295 
296 //=偏差计算: 左侧为引入的系统变量,右侧为固定的用户参数分别 偏离范围,正偏离扣分,右偏离扣分
297 class  Cfyq_offset: public Cfyq_opt
298 {
299     DECLARE_SERIAL_EXTDLL( Cfyq_offset )
300 public:
301     Cfyq_offset();
302     ~Cfyq_offset(){}
303     Cfyq_Name* m_pName;
304     int m_bcanSerial;
305 public:
306     int Accept( Cfyq_Interpreter* pInterpreter, char input );
307     bool NextNode( Cfyq_Interpreter* pInterpreter, char  input );
308     virtual CFyq_NodeKind GetNodeGrade() {return FNK_Offset;}
309     void Serialize(CArchive& ar);
310     void NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast);
311     void SetFyqName(Cfyq_Name* val);
312     Cfyq_Name* GetFyqName();
313 };
314 
315 /*
316 
317 =  赋值操作
318 +->偏差赋值 分两种形式,+>大于基准价,偏离;->小于基准价,偏离
319 [] 取值范围分两种形式:1、“,”标志去除 例如[1,2]去掉1个最高,2个最低分
320         “-”标志的范围[1,2],例如[0-3]表示0-3分,可简写为[3]
321 ()入口参数
322 
323 */
324 
325 
326 /*表达式 名称 描述了表达式的基本功能界面
327 
328 文法示例:
329 zz(corp)[3]:pf,nomark;  
330 企业资质(暗标)3分  
331 xmbz:ml;                          项目班子成员目录
332 bj(tbbj)[10]=jzj(1,2) -> bj>jzj ? {kja}/{step} : {kjb}/{step};  
333 投标报价满分10,正偏离基准价{step}扣减{kja},负偏离基准价{step}扣减{kjb}
334 
335 */
336 
337 class FLY_DBASE_API  Cfyq_expression : public Cfyq_Name
338 {
339     DECLARE_SERIAL_EXTDLL(Cfyq_expression)
340 public:
341     Cfyq_expression();
342     ~Cfyq_expression();
343     //字符串到对象
344     bool InitExpression(const CString& expression );
345     //对象到字符串
346     void BackExpression();
347     //将基准价范围用文字的形式表现出来
348     virtual bool toString();
349     //目前计算不通过表达式计算
350     virtual void Calc(CString& str);
351 
352     void Serialize(CArchive& ar);
353 
354     //范围相关-------去高去低
355     void FindScope(vec_fyq_Scope& m_vecScope, Cfyq_node* node);
356     vec_fyq_Scope& GetScopeFromTree();
357     double GetScopeFromVec(int Flag, int index, int row);
358     void SetVecVarNode(vecVarNode_ZBFileInfo& vecVarNode) { m_vecVarNode = vecVarNode; }
359     std::vector<std::vector<int>>& GetScopeMinMax();
360     vecCountDeal& GetCountDeal();
361 
362 
363     //变量相关
364     void FindVar(vec_fyq_Var& m_VecVar, Cfyq_node* node);
365     vec_fyq_Var& GetVarFromTree();
366     void AddVar(CString explain, CString doublestr);
367     void AddVar(vec_fyq_Var& m_VecVar, Cfyq_node* node, CString explain, CString doublestr);
368     double GetdVar(int index);
369     void ChangeVecVarFromTree(const CString& strVar, CString str);
370     void ChangeVecVarFromTree(const CString& strVar, double dval);
371 
372     //常量相关
373     bool IsExistConst(const CString& strVar);
374     void FindConst(vec_fyq_Const& m_VecConst,Cfyq_node *node);
375     vec_fyq_Const& GetConstFromTree();
376     //增加常量主要针对k,q,m
377     void AddConst(CString str);
378     void AddConst(vec_fyq_Const& m_vecConst, Cfyq_node* node, CString str);
379 
380     //显示当前的计算方法
381     void AddJzjKind(long kind);
382     void AddJzjKind(Cfyq_node* node,long kind);
383     long GetJzjKind() {    return m_njzjKind;}
384 
385 public:
386     vec_fyq_Var m_vecVar;
387     vec_fyq_Const m_vecConst;
388     vec_fyq_Scope m_vecScope;
389     Cfyq_Interpreter *m_pInterpreter;
390     std::vector<std::vector<int>> vecScope;
391     vecVarNode_ZBFileInfo m_vecVarNode;
392     vecCountDeal m_vecCountDeal;
393     int m_nrow;
394     int m_njzjKind;
395     CString m_strToDB;
396 }; 
   1 #include "StdAfx.h"
   2 #include "fyq_interpreter.h"
   3 #include <afx.h>
   4 
   5 
   6 IMPLEMENT_SERIAL( Cfyq_node, CTableRow, 0)
   7 Cfyq_node::Cfyq_node()
   8 {
   9     m_dValue = 0;        
  10     m_bStateInputChar = false;
  11     m_pInterpreter = NULL;
  12 };
  13 
  14 
  15 Cfyq_node::~Cfyq_node()
  16 {
  17 
  18 }
  19 
  20 //  1、没有必要空格是忽略的
  21 //     2、有必要(字符之间是有必要,符号之间->之间是有必要)
  22 //     3、开闭 ),] 状态 是否闭合 -》  
  23 //  
  24 //     进入字符状态,且未闭合
  25 int Cfyq_node::Accept(Cfyq_Interpreter* pInterpreter, char input)
  26 {
  27     return 0;
  28 }
  29 
  30 bool Cfyq_node::NextNode(Cfyq_Interpreter* pInterpreter, char input)
  31 {
  32     return false;
  33 }
  34 
  35 void Cfyq_node::NextBackNode(Cfyq_node* startName, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
  36 {
  37     return;
  38 }
  39 
  40 CFyq_NodeKind Cfyq_node::GetNodeGrade()
  41 {
  42     return FNK_Node;
  43 }
  44 
  45 void Cfyq_node::ErrorMsg(CString& str)
  46 {
  47     return;
  48 }
  49 
  50 void Cfyq_node::Serialize(CArchive& ar)
  51 {
  52     int rightcode = 1;
  53     if( ar.IsStoring() )
  54     { 
  55         ar << rightcode;
  56         ar << m_dValue;
  57         ar << m_sValue;
  58         ar << m_strContent;
  59         ar << m_vecSubNode;
  60     }
  61     else
  62     {
  63         ar >> rightcode;
  64         ar >> m_dValue;
  65         ar >> m_sValue;
  66         ar >> m_strContent;
  67         ar >> m_vecSubNode;
  68     }
  69 }
  70 
  71 CString& Cfyq_node::GetContent()
  72 {
  73     return m_strContent;
  74 }
  75 
  76 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79 
  80 IMPLEMENT_SERIAL( Cfyq_const, Cfyq_element, 0)
  81 int Cfyq_const::Accept(Cfyq_Interpreter* pInterpreter, char input)
  82 {
  83     if( Cfyq_Interpreter::IsTrueChar( input ) )
  84         return AppendChar(pInterpreter, input);
  85 
  86     switch( input )
  87     {
  88     case ',':
  89     case ';':
  90             return 2;
  91     }
  92 
  93     return 0;
  94 }
  95 
  96 bool Cfyq_const::NextNode(Cfyq_Interpreter* pInterpreter, char input)
  97 {
  98     if(!pInterpreter->CheckConst(m_strContent))
  99         return false;
 100 
 101     switch( input )
 102     {
 103     case ',':
 104         {
 105             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Const));
 106             return true;
 107         }
 108     case ';':
 109         {
 110             return true;
 111         }
 112     default:
 113         return false;
 114     }
 115 }
 116 
 117 
 118 void Cfyq_const::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
 119 {
 120     CString strTemp;
 121     if (bLast)
 122         strTemp.Format("%s", m_strContent);
 123     else
 124         strTemp.Format("%s,", m_strContent);
 125     str += strTemp;
 126     pInterpreter->ChangeBackNode(node);
 127 }
 128 
 129 void Cfyq_const::ErrorMsg(CString& str)
 130 {
 131     CString strTmp = "常量出现错误!
";
 132     str += strTmp;
 133 }
 134 
 135 void Cfyq_const::Serialize(CArchive& ar)
 136 {
 137     Cfyq_node::Serialize(ar);
 138     int rightcode = 1;
 139     if(ar.IsStoring())
 140     {
 141         ar << rightcode;
 142     }
 143     else
 144     {
 145         ar >> rightcode;
 146     }
 147 }
 148 
 149 IMPLEMENT_SERIAL( Cfyq_Var, Cfyq_element, 0)
 150 Cfyq_Var::Cfyq_Var()
 151 {
 152     m_bInited = false;
 153     CString m_sEngName = "";
 154     CString m_sExplain = "";
 155     CString m_dValueToStr = "";
 156     m_nLifePeriod = 0;
 157 }
 158 
 159 
 160 
 161 void Cfyq_Var::SetEngName(CString name)
 162 {
 163     m_sEngName = name;
 164 }
 165 
 166 void Cfyq_Var::SetExplain(CString Explain)
 167 {
 168     m_sExplain = Explain;
 169 }
 170 
 171 int Cfyq_Var::Accept(Cfyq_Interpreter* pInterpreter, char input)
 172 {
 173     if( Cfyq_Interpreter::IsTrueChar( input ) || Cfyq_Interpreter::IsChineseChar( input ) || (':' == input && !IsClose()) )
 174         return AppendChar(pInterpreter, input);
 175 
 176     switch( input )
 177     {
 178     case ')':
 179         SetClose(true);
 180 
 181         
 182         if(m_strContent.Find(":") == -1)
 183         {
 184             SetEngName(m_strContent);
 185             SetExplain("");
 186         }
 187         else
 188         {
 189             CString strleft = m_strContent.Left(m_strContent.Find(":"));
 190             CString strRight = m_strContent.Mid(m_strContent.Find(":")+1,m_strContent.GetLength());
 191             SetEngName(strleft);
 192             SetExplain(strRight);
 193         }
 194         
 195 
 196         {
 197             if(pInterpreter->NextStrIsIgnoreSpace(",$(")||pInterpreter->NextStrIsIgnoreSpace(";")||pInterpreter->NextStrIsIgnoreSpace(":"))
 198                 return 3;
 199             else
 200                 return 0;
 201         }
 202     case ',':
 203         {
 204             if(pInterpreter->NextStrIsIgnoreSpace("$("))
 205                 return 3;
 206             else 
 207                 return 0;
 208         }
 209     case '$':
 210         {
 211             if(pInterpreter->NextStrIsIgnoreSpace("("))
 212                 return 2;
 213             else 
 214                 return 0;
 215         }
 216     case '(':
 217         {
 218             if(pInterpreter->LastStrIsIgnoreSpace("$"))
 219                 return 3;
 220             else
 221                 return 0;
 222         }
 223     case ':':
 224         {
 225             return 2;
 226         }
 227     case ';':
 228         {
 229             return 2;
 230         }
 231     }
 232 
 233     return 0;
 234 }
 235 
 236 bool Cfyq_Var::NextNode(Cfyq_Interpreter* pInterpreter, char input)
 237 {
 238     if(!IsClose())
 239         return false;
 240 
 241     switch( input )
 242     {
 243     case '$':
 244         {
 245             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Value));
 246             return true;
 247         }
 248     case ':':
 249         {
 250             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Define));
 251             return true;
 252         }
 253     case ';':
 254         {
 255             return true;
 256         }
 257     default:
 258         return false;
 259     }
 260 }
 261 
 262 void Cfyq_Var::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
 263 {
 264     CString strTemp;
 265     if (bLast)
 266     {
 267         if (!m_dValueToStr.IsEmpty())
 268             strTemp.Format("$(%s:%s)", m_sExplain, m_dValueToStr);
 269         else
 270             strTemp.Format("$(%s:%s)", m_sExplain, m_sEngName);
 271     }
 272     else
 273     {
 274         if (!m_dValueToStr.IsEmpty())
 275             strTemp.Format("$(%s:%s),", m_sExplain, m_dValueToStr);
 276         else
 277             strTemp.Format("$(%s:%s),", m_sExplain, m_sEngName);
 278     }
 279     str += strTemp;
 280     pInterpreter->ChangeBackNode(node);
 281 }
 282 
 283 void Cfyq_Var::ErrorMsg(CString& str)
 284 {
 285     CString strTmp = "变量出现错误!
";
 286     str += strTmp;
 287 }
 288 
 289 void Cfyq_Var::Serialize(CArchive& ar)
 290 {
 291     Cfyq_node::Serialize(ar);
 292     int rightcode = 1;
 293     if(ar.IsStoring())
 294     {
 295         ar << rightcode;
 296         ar << m_sEngName;
 297         ar << m_sExplain;
 298         ar << m_nLifePeriod;
 299     }
 300     else
 301     {
 302         ar >> rightcode;
 303         ar >> m_sEngName;
 304         ar >> m_sExplain;
 305         ar >> m_nLifePeriod;
 306     }
 307 }
 308 
 309 int Cfyq_scope::GetMinCount(int index)
 310 {
 311     return m_MinMax[index][0];
 312 }
 313 
 314 int Cfyq_scope::GetMaxCount(int index)
 315 {
 316     return m_MinMax[index][1];
 317 }
 318 
 319 int Cfyq_scope::GetMin(int index)
 320 {
 321     return m_MinMax[index][2];
 322 }
 323 
 324 int Cfyq_scope::GetMax(int index)
 325 {
 326     return m_MinMax[index][3];
 327 }
 328 
 329 void Cfyq_scope::SetRow(int row)
 330 {
 331     m_nrow = row;
 332 }
 333 
 334 int Cfyq_scope::GetRow()
 335 {
 336     return m_nrow;
 337 }
 338 
 339 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 340 IMPLEMENT_SERIAL( Cfyq_scope, Cfyq_element, 0)
 341 //解析范围
 342 bool Cfyq_scope::SetScope()
 343 {
 344     CString strLeft,strMid,strRight,strLast;
 345     int nMidIndex;
 346     //上下限
 347     if(m_strContent == m_strContent.SpanIncluding("0123456789.-"))
 348     {
 349         if(m_strContent == m_strContent.SpanIncluding("0123456789."))
 350         {
 351             m_MinMax[0][0] = 0;
 352             m_MinMax[0][1] = atoi(m_strContent);
 353             return true;
 354         }
 355         else
 356         {    
 357             nMidIndex = m_strContent.Find("-");
 358             strLeft =  m_strContent.Left(nMidIndex);
 359             strRight = m_strContent.Mid(nMidIndex + 1,m_strContent.GetLength() -1 );
 360             if(strLeft == strLeft.SpanIncluding("0123456789.")
 361                 && strRight == strRight.SpanIncluding("0123456789."))
 362             {
 363                 m_MinMax[0][0] = atoi(strLeft);
 364                 m_MinMax[0][1] = atoi(strRight);
 365                 m_MinMax[0][2] = 0;
 366                 return true;
 367             }
 368             else
 369             {
 370                 return false;
 371             }
 372         }
 373         m_bFlag = 0;
 374         SetRow(0);
 375     }
 376     //数轴
 377     else
 378     {
 379         if(m_strContent.Find(";") == -1)
 380         {
 381             int nMidIndex = m_strContent.Find(',') == -1;
 382             if(nMidIndex != -1)
 383             {
 384                 SetRow(1);
 385                 if( m_strContent.Find(',') != -1)
 386                 {    
 387                     CString strTmp;
 388                     int ipos = 0;
 389                     while(AfxExtractSubString(strTmp,m_strContent,ipos,','))
 390                     {
 391                         ipos++;
 392                         switch(ipos)
 393                         {
 394                         case 1:
 395                             strLeft = strTmp;
 396                             break;
 397                         case 2:
 398                             strMid = strTmp;
 399                             break;
 400                         case 3:
 401                             strRight = strTmp;
 402                             break;
 403                         case 4:
 404                             strLast = strTmp;
 405                         }
 406                     }
 407                     if(strLeft == strLeft.SpanIncluding("0123456789.")
 408                         && strRight == strRight.SpanIncluding("0123456789.") 
 409                         && strMid == strMid.SpanIncluding("0123456789.")
 410                         && strLast == strLast.SpanIncluding("0123456789."))
 411                     {
 412                         m_MinMax[0][0] = atoi(strLeft);
 413                         m_MinMax[0][1] = atoi(strMid);
 414                         m_MinMax[0][2] = atoi(strRight);
 415                         m_MinMax[0][3] = atoi(strLast);
 416                         return true;
 417                     }
 418                     else
 419                     {
 420                         return false;
 421                     }
 422                 }
 423 
 424             }
 425 
 426             else
 427             {
 428                 return false;
 429             }
 430         }
 431         else
 432         {
 433             int i = 0;
 434             CString strTmp;
 435             while(AfxExtractSubString(strTmp,m_strContent,i,';'))
 436             {
 437                 CString strTmpdot;
 438                 int ipos = 0;
 439                 while(AfxExtractSubString(strTmpdot,strTmp,ipos,','))
 440                 {
 441                     ipos++;
 442                     switch(ipos)
 443                     {
 444                     case 1:
 445                         strLeft = strTmpdot;
 446                         break;
 447                     case 2:
 448                         strMid = strTmpdot;
 449                         break;
 450                     case 3:
 451                         strRight = strTmpdot;
 452                         break;
 453                     case 4:
 454                         strLast = strTmpdot;
 455                         break;
 456                     }
 457                 }
 458                 if (strLeft == strLeft.SpanIncluding("0123456789.")
 459                     && strRight == strRight.SpanIncluding("0123456789.")
 460                     && strMid == strMid.SpanIncluding("0123456789.")
 461                     && strLast == strLast.SpanIncluding("0123456789."))
 462                 {
 463                     m_MinMax[i][0] = atoi(strLeft);
 464                     m_MinMax[i][1] = atoi(strMid);
 465                     m_MinMax[i][2] = atoi(strRight);
 466                     m_MinMax[i][3] = atoi(strLast);
 467                     i++;
 468                     continue;
 469                 }
 470                 else
 471                 {
 472                     return false;
 473                 }
 474             }
 475             SetRow(i);
 476         }
 477         m_bFlag = 1;
 478     }
 479     return true;
 480 }
 481 
 482 bool Cfyq_scope::ReplaceScope(CString strTemp)
 483 {
 484     m_strContent = strTemp;
 485     memset(m_MinMax, -1, sizeof(m_MinMax));
 486     CString strLeft, strMid, strRight, strLast;
 487     int nMidIndex;
 488     //上下限
 489     if (m_strContent == m_strContent.SpanIncluding("0123456789.-"))
 490     {
 491         if (m_strContent == m_strContent.SpanIncluding("0123456789."))
 492         {
 493             m_MinMax[0][0] = 0;
 494             m_MinMax[0][1] = atoi(m_strContent);
 495             return true;
 496         }
 497         else
 498         {
 499             nMidIndex = m_strContent.Find("-");
 500             strLeft = m_strContent.Left(nMidIndex);
 501             strRight = m_strContent.Mid(nMidIndex + 1, m_strContent.GetLength() - 1);
 502             if (strLeft == strLeft.SpanIncluding("0123456789.")
 503                 && strRight == strRight.SpanIncluding("0123456789."))
 504             {
 505                 m_MinMax[0][0] = atoi(strLeft);
 506                 m_MinMax[0][1] = atoi(strRight);
 507                 m_MinMax[0][2] = 0;
 508                 return true;
 509             }
 510             else
 511             {
 512                 return false;
 513             }
 514         }
 515         m_bFlag = 0;
 516         SetRow(0);
 517     }
 518     //数轴
 519     else
 520     {
 521         if (m_strContent.Find(";") == -1)
 522         {
 523             int nMidIndex = m_strContent.Find(',') == -1;
 524             if (nMidIndex != -1)
 525             {
 526                 SetRow(1);
 527                 if (m_strContent.Find(',') != -1)
 528                 {
 529                     CString strTmp;
 530                     int ipos = 0;
 531                     while (AfxExtractSubString(strTmp, m_strContent, ipos, ','))
 532                     {
 533                         ipos++;
 534                         switch (ipos)
 535                         {
 536                         case 1:
 537                             strLeft = strTmp;
 538                             break;
 539                         case 2:
 540                             strMid = strTmp;
 541                             break;
 542                         case 3:
 543                             strRight = strTmp;
 544                             break;
 545                         case 4:
 546                             strLast = strTmp;
 547                         }
 548                     }
 549                     if (strLeft == strLeft.SpanIncluding("0123456789.")
 550                         && strRight == strRight.SpanIncluding("0123456789.")
 551                         && strMid == strMid.SpanIncluding("0123456789.")
 552                         && strLast == strLast.SpanIncluding("0123456789."))
 553                     {
 554                         m_MinMax[0][0] = atoi(strLeft);
 555                         m_MinMax[0][1] = atoi(strMid);
 556                         m_MinMax[0][2] = atoi(strRight);
 557                         m_MinMax[0][3] = atoi(strLast);
 558                         return true;
 559                     }
 560                     else
 561                     {
 562                         return false;
 563                     }
 564                 }
 565 
 566             }
 567 
 568             else
 569             {
 570                 return false;
 571             }
 572         }
 573         else
 574         {
 575             int i = 0;
 576             CString strTmp;
 577             while (AfxExtractSubString(strTmp, m_strContent, i, ';'))
 578             {
 579                 CString strTmpdot;
 580                 int ipos = 0;
 581                 while (AfxExtractSubString(strTmpdot, strTmp, ipos, ','))
 582                 {
 583                     ipos++;
 584                     switch (ipos)
 585                     {
 586                     case 1:
 587                         strLeft = strTmpdot;
 588                         break;
 589                     case 2:
 590                         strMid = strTmpdot;
 591                         break;
 592                     case 3:
 593                         strRight = strTmpdot;
 594                         break;
 595                     case 4:
 596                         strLast = strTmpdot;
 597                         break;
 598                     }
 599                 }
 600                 if (strLeft == strLeft.SpanIncluding("0123456789.")
 601                     && strRight == strRight.SpanIncluding("0123456789.")
 602                     && strMid == strMid.SpanIncluding("0123456789.")
 603                     && strLast == strLast.SpanIncluding("0123456789."))
 604                 {
 605                     m_MinMax[i][0] = atoi(strLeft);
 606                     m_MinMax[i][1] = atoi(strMid);
 607                     m_MinMax[i][2] = atoi(strRight);
 608                     m_MinMax[i][3] = atoi(strLast);
 609                     i++;
 610                     continue;
 611                 }
 612                 else
 613                 {
 614                     return false;
 615                 }
 616             }
 617             SetRow(i);
 618         }
 619         m_bFlag = 1;
 620     }
 621     return true;
 622 }
 623 
 624 bool Cfyq_scope::SetScopeToName(Cfyq_Interpreter* pInterpreter)
 625 {
 626     pInterpreter->GetCurName()->SetScope(this);
 627     return true;
 628 }
 629 
 630 int Cfyq_scope::GetFlag()
 631 {
 632     return m_bFlag;
 633 }
 634 
 635 void Cfyq_scope::Serialize(CArchive& ar)
 636 {
 637     Cfyq_node::Serialize(ar);
 638     int rightcode = 1;
 639     if(ar.IsStoring())
 640     {
 641         ar << rightcode;
 642         ar << m_bFlag;
 643         ar << m_nrow;
 644         if(m_nrow)
 645         for(int i = 0;i < m_nrow;++i)
 646             for(int j = 0;j < 4;++j)
 647         {
 648             ar << m_MinMax[i][j];
 649         }
 650     }
 651     else
 652     {
 653         ar >> rightcode;
 654         ar >> m_bFlag;
 655         ar >> m_nrow;
 656         if (m_nrow)
 657         for (int i = 0; i < m_nrow; ++i)
 658             for (int j = 0; j < 4; ++j)
 659             {
 660                 ar >> m_MinMax[i][j];
 661             }
 662     }
 663     
 664 }
 665 
 666 void Cfyq_scope::ErrorMsg(CString& str)
 667 {
 668     CString strTmp = "范围出现错误!
";
 669     str += strTmp;
 670 }
 671 
 672 int Cfyq_scope::Accept(Cfyq_Interpreter* pInterpreter, char input)
 673 {
 674     if( Cfyq_Interpreter::IsTrueChar( input ) )
 675         return AppendChar(pInterpreter, input);
 676 
 677     switch( input )
 678     {
 679     case '=':
 680     case ':':
 681     case '{':
 682             return 2;
 683     case ']':
 684         {
 685             SetClose(true);
 686 
 687             if(pInterpreter->NextStrIsIgnoreSpace("=")||pInterpreter->NextStrIsIgnoreSpace(":")||pInterpreter->NextStrIsIgnoreSpace("->")
 688             ||pInterpreter->NextStrIsIgnoreSpace("{"))
 689                 return 3;
 690             else
 691                 return 0;
 692         }
 693     case '-':
 694         {
 695             if(pInterpreter->NextStrIs(">"))
 696                 return 2;
 697             m_strContent += input;
 698             return 1;
 699         }
 700     case ',':
 701         {
 702             m_strContent += input;
 703             return 1;
 704         }
 705     case ';':
 706         {
 707             m_strContent += input;
 708             return 1;
 709         }
 710     }
 711 
 712     return 0;
 713 }
 714 
 715 bool Cfyq_scope::NextNode(Cfyq_Interpreter* pInterpreter, char input)
 716 {
 717     if(!IsClose())
 718         return false;
 719     if(!SetScope())
 720         return false;
 721     else
 722         SetScopeToName(pInterpreter);
 723     switch( input )
 724     {
 725     case '=':
 726         {
 727             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Set));
 728             return true;
 729         }
 730     case '-':
 731         {
 732             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Offset));
 733             return true;
 734         }
 735     case ':':
 736         {
 737             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Define));
 738             return true;
 739         }
 740     case '{':
 741         {
 742             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Jzj));
 743             return true;
 744         }
 745     default:
 746         return false;
 747     }
 748 }
 749 
 750 
 751 CFyq_NodeKind Cfyq_scope::GetNodeGrade()
 752 {
 753     return FNK_Scope;
 754 }
 755 
 756 Cfyq_scope::Cfyq_scope()
 757 {
 758     memset(m_MinMax,-1,sizeof(m_MinMax));
 759     m_bFlag = -1; 
 760     m_nrow = 0;
 761 }
 762 
 763 Cfyq_scope::~Cfyq_scope()
 764 {
 765 
 766 }
 767 
 768 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 769 
 770 IMPLEMENT_SERIAL( Cfyq_opt, Cfyq_node, 0)
 771 
 772 void Cfyq_opt::Serialize(CArchive& ar)
 773 {
 774     int rightcode = 1;
 775     if( ar.IsStoring() )
 776     { 
 777         ar << rightcode;
 778     }
 779     else
 780     {
 781         ar >> rightcode;
 782     }
 783 
 784 }
 785 
 786 Cfyq_opt::Cfyq_opt()
 787 {
 788 
 789 }
 790 
 791 Cfyq_opt::~Cfyq_opt()
 792 {
 793 
 794 }
 795 
 796 int Cfyq_offset::Accept(Cfyq_Interpreter* pInterpreter, char input)
 797 {
 798     if(input == ' ')
 799         return 3;
 800     if( Cfyq_Interpreter::IsTrueChar( input ) )
 801         return 0;
 802 
 803     switch( input )
 804     {
 805     case '>':
 806         {
 807             if(pInterpreter->NextStrIsIgnoreSpace("$("))
 808                 return 3;
 809             else
 810                 return 0;
 811         }
 812     case '$':
 813         {
 814             if(pInterpreter->NextStrIsIgnoreSpace("("))
 815                 return 2;
 816             else
 817                 return 0;
 818         }
 819     }
 820 
 821     return 0;
 822 }
 823 
 824 bool Cfyq_offset::NextNode(Cfyq_Interpreter* pInterpreter, char input)
 825 {
 826     switch( input )
 827     {
 828     case '$':
 829         {
 830             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Value));
 831             return true;
 832         }
 833     default:
 834         return false;
 835     }
 836 }
 837 IMPLEMENT_SERIAL( Cfyq_offset, Cfyq_opt, 0)
 838 Cfyq_offset::Cfyq_offset()
 839 {
 840     Cfyq_Name* m_pName = NULL;
 841     int m_bcanSerial = 0;
 842 }
 843 
 844 void Cfyq_offset::Serialize(CArchive& ar)
 845 {
 846     int rightcode = 1;
 847     Cfyq_node::Serialize(ar);
 848     CString tmpStr;
 849     if( ar.IsStoring() )
 850     { 
 851         ar << rightcode;
 852         ar << m_bcanSerial;
 853         if (m_bcanSerial)
 854         {
 855             m_pName->Serialize(ar);
 856         }
 857     }
 858     else
 859     {
 860         ar >> rightcode;
 861         ar >> m_bcanSerial;
 862         if (m_bcanSerial)
 863         {
 864             m_pName = new Cfyq_Name();
 865             m_pName->Serialize(ar);
 866         }
 867     }
 868 }
 869 
 870 void Cfyq_offset::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
 871 {
 872     if (m_pName)
 873     {
 874         m_pName->NextBackNode(node, str, pInterpreter, 1);
 875     }
 876     str += "->";
 877     pInterpreter->ChangeBackNode(node);
 878 }
 879 
 880 void Cfyq_offset::SetFyqName(Cfyq_Name* val)
 881 {
 882     m_pName = val;
 883     m_bcanSerial = 1;
 884 }
 885 
 886 Cfyq_Name* Cfyq_offset::GetFyqName()
 887 {
 888     return m_pName;
 889 }
 890 
 891 void Cfyq_expression::Calc(CString& str)
 892 {
 893 //     GetVarFromTree();
 894 //     double bj = 1010,jzj = 500;
 895 // 
 896 //     double Acost = (bj - jzj ) / jzj;//偏离率
 897 //     if ( bEqual(Acost, 0 ,MinE))
 898 //     {
 899 //         m_dValue = m_pInterpreter->GetScope(1,1);
 900 //         m_sValue.Format( "基准价:%s,无偏离 ,得分:%s" , GetForamtedNumber(m_dValue), GetForamtedNumber(m_dValue) );
 901 //         str = m_sValue;
 902 //         return;
 903 //     }
 904 // 
 905 //     CString sAcost,sbj,sjzj,sbdiv;
 906 //     sbj = GetForamtedNumber(bj),sjzj = GetForamtedNumber(jzj);
 907 //     sAcost.Format(  "(%s-%s)/%s" ,sbj, sjzj,sjzj );
 908 // 
 909 // 
 910 //     double step   = GetdVar(0);
 911 //     step = step / 100;
 912 //     int bdiv      = Keep0Bit( Acost / step );
 913 //     double kj_zpc = GetdVar(1);
 914 //     double kj_fpc = GetdVar(2);
 915 // 
 916 //     if (Acost > 0) 
 917 //     {
 918 //         m_dValue = m_pInterpreter->GetScope(0,1) - bdiv * kj_zpc;
 919 //         m_sValue.Format( "基准价:%s,偏离率:%s 报价得分:%s - %d*%s" , 
 920 //             GetForamtedNumber(jzj), 
 921 //             GetForamtedNumber(Acost), 
 922 //             GetForamtedNumber(m_pInterpreter->GetScope(0,1)), bdiv, GetForamtedNumber(kj_zpc) );
 923 //     }
 924 //     else
 925 //     {
 926 //         m_dValue = m_pInterpreter->GetScope(0,1) + bdiv * kj_zpc;
 927 //         m_sValue.Format( "基准价:%s,偏离率:%s 报价得分:%s + %d*%s" , 
 928 //             GetForamtedNumber(jzj), 
 929 //             GetForamtedNumber(Acost), 
 930 //             GetForamtedNumber(m_pInterpreter->GetScope(0,1)), bdiv, GetForamtedNumber(kj_zpc) );
 931 //     }
 932 // 
 933 // 
 934 //     if ( m_dValue < 0)
 935 //         m_dValue = 0;
 936 //     str = m_sValue;
 937 //     return ;
 938 };
 939 
 940 IMPLEMENT_SERIAL( Cfyq_expression, Cfyq_Name, 0)
 941 Cfyq_expression::Cfyq_expression()
 942 {
 943     m_pInterpreter = new Cfyq_Interpreter();
 944     m_nrow = 0;
 945 
 946     //m_pScoringSystemDefine = NULL;
 947 }
 948 
 949 Cfyq_expression::~Cfyq_expression()
 950 { 
 951     if ( m_pInterpreter )
 952     {
 953         delete m_pInterpreter;
 954         m_pInterpreter = NULL;
 955     }
 956     ClearVecPtr(m_vecVar);
 957 }
 958 
 959 bool Cfyq_expression::InitExpression(const CString& expression )
 960 {
 961     //解析公式
 962 
 963     if(!m_pInterpreter->Interpreter(expression))
 964         return false;        
 965 
 966     //拿到解析到的Vec
 967     vec_fyq_Node& vecExpression = m_pInterpreter->GetvecExpression();
 968 
 969     //获得根节点
 970     Cfyq_Name* FirstName = nullptr;
 971 
 972     Cfyq_node* root = this;
 973 
 974     Cfyq_node* pCurNode = root;
 975     Cfyq_Name* pCurName = nullptr;
 976     for(auto it = vecExpression.begin(); it!=vecExpression.end(); it++)
 977     {
 978         if(!FirstName)
 979         {
 980             FirstName = (Cfyq_Name*)(*it);
 981             this->m_strContent = FirstName->GetContent();
 982             this->m_sParam = FirstName->GetParam();
 983             this->m_pScope = FirstName->GetScope();
 984             continue;
 985         }
 986         if (FNK_Set == (*it)->GetNodeGrade())
 987         {
 988             root->m_vecSubNode.push_back(*it);
 989             pCurNode = *it;
 990         }
 991         else if( FNK_Define == (*it)->GetNodeGrade())
 992         {
 993             root->m_vecSubNode.push_back(*it);
 994             pCurNode = *it;
 995         }
 996         else if( FNK_Offset == (*it)->GetNodeGrade() )
 997         {
 998             pCurNode->m_vecSubNode.push_back(*it);
 999             pCurNode = (*it);
1000             Cfyq_offset* offset = (Cfyq_offset*)(*it);
1001             if(!pCurName)
1002                 return false;
1003             offset->SetFyqName(pCurName);
1004         }
1005         else if( FNK_Const == (*it)->GetNodeGrade() || FNK_Value == (*it)->GetNodeGrade() )
1006         {
1007             pCurNode->m_vecSubNode.push_back(*it);
1008         }
1009         else if( FNK_Name == (*it)->GetNodeGrade() )
1010         {
1011             pCurName =  (Cfyq_Name*)(*it);
1012             m_nrow = pCurName->GetScope()->GetRow();
1013             m_njzjKind = pCurName->Getjzj()->m_nkind;
1014         }
1015     }
1016     return true;
1017 };//初始化
1018 
1019 
1020 
1021 void Cfyq_expression::BackExpression()
1022 {
1023     m_strToDB = "";
1024     m_pInterpreter->backInterpreter(this, m_strToDB);
1025 }
1026 
1027 std::vector<std::vector<int>>& Cfyq_expression::GetScopeMinMax()
1028 {
1029     double dMinCount;
1030     double dMaxCount;
1031     double dMaxNumber;
1032     double dMinNumber;
1033     int k = 0;
1034     int curRow = 0;
1035     GetScopeFromTree();
1036     vecScope.clear();
1037     while(1)
1038     {
1039         dMinCount = GetScopeFromVec(1, 0, curRow);
1040         dMaxCount = GetScopeFromVec(1, 1, curRow);
1041         dMinNumber = GetScopeFromVec(1, 2, curRow);
1042         dMaxNumber = GetScopeFromVec(1, 3, curRow);
1043         if (dMinCount == -1 || dMaxCount == -1)
1044         {
1045             break;
1046         }
1047         vector<int> vec;
1048         vec.push_back(dMinCount);
1049         vec.push_back(dMaxCount);
1050         vec.push_back(dMaxNumber);
1051         vec.push_back(dMinNumber);
1052         vecScope.push_back(vec);
1053         curRow++;
1054     }
1055     return vecScope;
1056 }
1057 
1058 
1059 bool Cfyq_expression::toString()
1060 {
1061     GetVarFromTree();
1062     GetScopeFromTree();
1063     if(m_vecVar.empty())
1064     {
1065         m_sValue = "";
1066         return false;
1067     }
1068     double nStep = GetdVar(0);
1069     double nKja = GetdVar(1);
1070     double nKjb = GetdVar(2);
1071     double dMinCount;
1072     double dMaxCount;
1073     double dMaxNumber;
1074     double dMinNumber;
1075     CString txt1,txt2,txt3;
1076     CString str;
1077 
1078     int curRow = 0;
1079     if((dMaxCount = GetScopeFromVec(1,1,curRow++)) > -1)
1080     {
1081         str.Format("若有效标书小于等于%.0lf家,则不去掉最高最低价。
", dMaxCount);
1082         txt1 += str;
1083     }
1084     while(curRow < m_nrow)
1085     {
1086         dMinCount = GetScopeFromVec(1, 0, curRow);
1087         dMaxCount = GetScopeFromVec(1, 1, curRow);
1088         dMinNumber = GetScopeFromVec(1, 2, curRow);
1089         dMaxNumber = GetScopeFromVec(1, 3, curRow);
1090         if (curRow == m_nrow - 1)
1091         {
1092             str.Format("若有效标书大于等于%.0lf家,则去掉%.0lf个最高价和%.0lf个最低价。
", dMinCount, dMinNumber, dMaxNumber);
1093             txt1 += str;
1094             break;
1095         }
1096         curRow++;
1097         str.Format("若有效标书大于等于%.0lf家,小于%.0lf家,则去掉%.0lf个最高价和%.0lf个最低价。
", dMinCount,
1098             dMaxCount,dMaxNumber,dMinNumber);
1099         txt1 += str;
1100     }
1101     if( nKjb > 0 )
1102     {
1103         txt2.Format("每低于 %.2lf%扣 %.2lf 分(不足 %.2lf%按 %.2lf%计)。 
",nStep,nKjb,nStep,nStep);
1104     }
1105     else
1106     {
1107         nKjb = 0 - nKjb;
1108         txt2.Format("每低于 %.2lf%加 %.2lf 分(不足 %.2lf%按 %.2lf%计)。 
",nStep,nKjb,nStep,nStep);
1109     }
1110 
1111 
1112     if(nKja > 0 )
1113     {
1114         txt3.Format("每高于 %.2lf%扣 %.2lf 分(不足 %.2lf%按 %.2lf%计)。 
",nStep,nKja,nStep,nStep);
1115     }
1116     else
1117     {
1118         nKja = 0 - nKja;
1119         txt3.Format("每高于 %.2lf%加 %.2lf 分(不足 %.2lf%按 %.2lf%计)。 
",nStep,nKja,nStep,nStep);
1120     }
1121     m_sValue = txt1 + txt2 + txt3;
1122     return true;
1123 }
1124 
1125 
1126 void Cfyq_expression::FindVar(vec_fyq_Var& m_VecVar,Cfyq_node *node)
1127 {
1128     if(node->GetNodeGrade() == FNK_Value)
1129     {
1130         if(std::find(m_VecVar.begin(), m_VecVar.end(), node) == m_VecVar.end())
1131             m_VecVar.push_back((Cfyq_Var*)node);
1132         return ;
1133     }
1134     for(int i  = 0;i < node->m_vecSubNode.size();++i)
1135     {
1136         FindVar(m_VecVar,node->m_vecSubNode[i]);
1137     }
1138 }
1139 
1140 vec_fyq_Var& Cfyq_expression::GetVarFromTree()
1141 {
1142     //ClearVecPtr(m_vecVar);
1143     FindVar(m_vecVar,this);
1144     return m_vecVar;
1145 }
1146 
1147 void Cfyq_expression::FindConst(vec_fyq_Const& m_VecConst,Cfyq_node *node)
1148 {
1149     if(node->GetNodeGrade() == FNK_Const)
1150     {
1151         if(std::find(m_vecConst.begin(), m_vecConst.end(), node) == m_vecConst.end())
1152             m_vecConst.push_back((Cfyq_const*)node);
1153         return ;
1154     }
1155     for(int i  = 0;i < node->m_vecSubNode.size();++i)
1156     {
1157         FindConst(m_vecConst,node->m_vecSubNode[i]);
1158     }
1159 }
1160 
1161 vec_fyq_Const& Cfyq_expression::GetConstFromTree()
1162 {
1163     FindConst(m_vecConst,this);
1164     return m_vecConst;
1165 }
1166 
1167 
1168 void Cfyq_expression::Serialize(CArchive& ar)
1169 {
1170     int rightcode = 1;
1171     Cfyq_node::Serialize(ar);
1172     if( ar.IsStoring() )
1173     { 
1174         ar << rightcode;
1175         ar << m_vecVar;
1176         ar << m_nrow;
1177     }
1178     else
1179     {
1180         ar >> rightcode;
1181         ar >> m_vecVar;
1182         ar >> m_nrow;
1183     }        
1184 }
1185 
1186 double Cfyq_expression::GetdVar(int index)
1187 {
1188     for(int i = 0;i < m_vecVar.size();++i)
1189     {
1190         if(i == index)
1191         {
1192             return m_vecVar[i]->m_dValue;
1193         }
1194     }
1195     return -1;
1196 }
1197 void Cfyq_expression::ChangeVecVarFromTree(const CString& strVar,double dval)
1198 {
1199     if (m_vecVar.empty())
1200     {
1201         GetVarFromTree();
1202     }
1203     auto it = find_if(m_vecVar.begin(), m_vecVar.end(), [strVar](const Cfyq_Var* var)
1204     {
1205         return var->m_sEngName.CompareNoCase(strVar) == 0;
1206     });
1207     if(it != m_vecVar.end())
1208     {
1209         CString strTemp;
1210         strTemp.Format("%lf", dval);
1211         (*it)->m_dValueToStr = strTemp;
1212         (*it)->m_dValue = dval;
1213     }
1214 }
1215 
1216 void Cfyq_expression::ChangeVecVarFromTree(const CString& strVar, CString str)
1217 {
1218     if (m_vecVar.empty())
1219     {
1220         GetVarFromTree();
1221     }
1222     auto it = find_if(m_vecVar.begin(), m_vecVar.end(), [strVar](const Cfyq_Var* var)
1223     {
1224         return var->m_sEngName.CompareNoCase(strVar) == 0;
1225     });
1226     if (it != m_vecVar.end())
1227     {
1228         (*it)->m_dValueToStr = str;
1229     }
1230 }
1231 
1232 void Cfyq_expression::FindScope(vec_fyq_Scope& m_vecScope, Cfyq_node* node)
1233 {
1234     if (node->GetNodeGrade() == FNK_Offset)
1235     {
1236         if (find(m_vecScope.begin(), m_vecScope.end(), ((Cfyq_offset*)node)->GetFyqName()->GetScope())
1237             == m_vecScope.end())
1238             m_vecScope.push_back(((Cfyq_offset*)node)->GetFyqName()->GetScope());
1239         return;
1240     }
1241     for_each(node->m_vecSubNode.begin(), node->m_vecSubNode.end(), [&](Cfyq_node* refer) {
1242         FindScope(m_vecScope, refer);
1243     });
1244 //     for each(Cfyq_node * tempnode in node->m_vecSubNode)
1245 //     {
1246 //         FindScope(m_vecScope, tempnode);
1247 //     }
1248 //     for (int i = 0; i < node->m_vecSubNode.size(); ++i)
1249 //     {
1250 //         FindScope(m_vecScope, node->m_vecSubNode[i]);
1251 //     }
1252 }
1253 
1254 vec_fyq_Scope& Cfyq_expression::GetScopeFromTree()
1255 {
1256     FindScope(m_vecScope, this);
1257     return m_vecScope;
1258 }
1259 
1260 double Cfyq_expression::GetScopeFromVec(int Flag, int index, int row)
1261 {
1262     for (auto it = m_vecScope.begin(); it != m_vecScope.end(); it++)
1263     {
1264         if ((*it) != NULL && Flag == ((Cfyq_scope*)(*it))->GetFlag())
1265         {
1266             switch (index)
1267             {
1268             case 0:
1269                 return ((Cfyq_scope*)(*it))->GetMinCount(row);
1270                 break;
1271             case 1:
1272                 return ((Cfyq_scope*)(*it))->GetMaxCount(row);
1273                 break;
1274             case 2:
1275                 return  ((Cfyq_scope*)(*it))->GetMin(row);
1276                 break;
1277             case 3:
1278                 return  ((Cfyq_scope*)(*it))->GetMax(row);
1279                 break;
1280             }
1281         }
1282     }
1283     return -1;
1284 }
1285 
1286 void Cfyq_expression::AddVar(vec_fyq_Var& m_VecVar, Cfyq_node* node, CString explain, CString doublestr)
1287 {
1288     if (node->GetNodeGrade() == FNK_Offset)
1289     {
1290         Cfyq_Var* var = new Cfyq_Var();
1291         var->m_sExplain = explain;
1292         var->m_dValueToStr = doublestr;
1293         var->m_strContent = explain + ":" + doublestr;
1294         auto vec = ((Cfyq_offset*)(node))->m_vecSubNode;
1295         auto it1 = find_if(vec.begin(), vec.end(), [var](Cfyq_node* node)
1296         {
1297             return var->m_strContent.CompareNoCase(node->m_strContent) == 0;
1298         });
1299         if (it1 == vec.end())
1300         {
1301             var->m_nLifePeriod = 1;
1302             ((Cfyq_offset*)(node))->m_vecSubNode.push_back(var);
1303         }
1304 
1305         auto it2 = find_if(m_VecVar.begin(), m_VecVar.end(), [var](Cfyq_node* node)
1306         {
1307             return var->m_strContent.CompareNoCase(node->m_strContent) == 0;
1308         });
1309         if (it2 == m_VecVar.end())
1310         {
1311             m_VecVar.push_back(var);
1312         }
1313         return;
1314     }
1315     for (int i = 0; i < node->m_vecSubNode.size(); ++i)
1316     {
1317         AddVar(m_VecVar, node->m_vecSubNode[i], explain, doublestr);
1318     }
1319 }
1320 
1321 void Cfyq_expression::AddVar(CString explain, CString doublestr)
1322 {
1323     GetVarFromTree();
1324     AddVar(m_vecVar, this, explain, doublestr);
1325 }
1326 
1327 vecCountDeal& Cfyq_expression::GetCountDeal()
1328 {
1329     m_vecCountDeal.clear();
1330     int dMinCount;
1331     int dMaxCount;
1332     int dMaxNumber;
1333     int dMinNumber;
1334     int curRow = 0;
1335     GetScopeFromTree();
1336     int start = 0;
1337     while (curRow < m_nrow)
1338     {
1339         dMinCount = GetScopeFromVec(1, 0, curRow);
1340         dMaxCount = GetScopeFromVec(1, 1, curRow);
1341         dMinNumber= GetScopeFromVec(1, 2, curRow);
1342         dMaxNumber= GetScopeFromVec(1, 3, curRow);
1343         CCountDeal deal(dMinCount, dMaxCount, dMinNumber, dMaxNumber);
1344         m_vecCountDeal.push_back(deal);
1345         curRow++;
1346     }
1347     return m_vecCountDeal;
1348 }
1349 
1350 void Cfyq_expression::AddJzjKind(Cfyq_node* node, long kind)
1351 {
1352     if (node->GetNodeGrade() == FNK_Offset)
1353     {
1354         CString str;
1355         str.Format("%d", kind);
1356         ((Cfyq_offset*)node)->GetFyqName()->Getjzj()->m_strContent = str;
1357         ((Cfyq_offset*)node)->GetFyqName()->Getjzj()->m_nkind = kind;
1358         return;
1359     }
1360     for (int i = 0; i < node->m_vecSubNode.size(); ++i)
1361     {
1362         AddJzjKind(node->m_vecSubNode[i], kind);
1363     }
1364 }
1365 
1366 void Cfyq_expression::AddJzjKind(long kind)
1367 {
1368     AddJzjKind(this, kind);
1369 }
1370 
1371 void Cfyq_expression::AddConst(vec_fyq_Const& m_vecConst, Cfyq_node* node, CString str)
1372 {
1373 
1374     if (node->GetNodeGrade() == FNK_Define)
1375     {
1376         Cfyq_const* pconst = new Cfyq_const();
1377         pconst->m_strContent = str;
1378         auto vec = ((Cfyq_offset*)(node))->m_vecSubNode;
1379         auto it1 = find_if(vec.begin(), vec.end(), [pconst](Cfyq_node* node)
1380         {
1381             return pconst->m_strContent.CompareNoCase(node->m_strContent) == 0;
1382         });
1383         if (it1 == vec.end())
1384         {
1385             ((Cfyq_offset*)(node))->m_vecSubNode.push_back(pconst);
1386         }
1387 
1388         auto it2 = find_if(m_vecConst.begin(), m_vecConst.end(), [pconst](Cfyq_node* node)
1389         {
1390             return pconst->m_strContent.CompareNoCase(node->m_strContent) == 0;
1391         });
1392         if (it2 == m_vecConst.end())
1393         {
1394             m_vecConst.push_back(pconst);
1395         }
1396         return;
1397     }
1398     for (int i = 0; i < node->m_vecSubNode.size(); ++i)
1399     {
1400         AddConst(m_vecConst, node->m_vecSubNode[i], str);
1401     }
1402 }
1403 
1404 void Cfyq_expression::AddConst(CString str)
1405 {
1406     GetConstFromTree();
1407     AddConst(m_vecConst, this, str);
1408     if (m_vecConst.empty())
1409     {
1410 
1411     }
1412 }
1413 
1414 bool Cfyq_expression::IsExistConst(const CString& strVar)
1415 {
1416     GetConstFromTree();
1417     auto it = find_if(m_vecConst.begin(), m_vecConst.end(), [strVar](Cfyq_const* pconst)
1418     {
1419         return strVar.CompareNoCase(pconst->m_strContent) == 0;
1420     });
1421     if(it == m_vecConst.end())
1422         return false;
1423     return true;
1424 }
1425 
1426 Cfyq_Interpreter::Cfyq_Interpreter( )
1427 {
1428     m_nCurIndex = 0;
1429     m_pCurNode = CreateNode(FNK_Name);
1430     m_pCurName = (Cfyq_Name*)m_pCurNode;
1431     m_vecExpression.push_back(GetCurNode());
1432     m_strFormula = "";
1433 
1434     m_name_obj.push_back( new CSysCodeKindDataInfo(  1, 1,"pdf", "pdf",0 ) );
1435     m_name_obj.push_back( new CSysCodeKindDataInfo(  2, 1,"rtf", "rtf",0 ) );
1436 
1437     //第二个参数为0不可复制
1438     m_name_obj.push_back( new CSysCodeKindDataInfo( 11, 0,"zz",     "资质/资格",0 ) );
1439     m_name_obj.push_back( new CSysCodeKindDataInfo( 12, 0,"yj",     "业绩",0 ) );
1440     m_name_obj.push_back( new CSysCodeKindDataInfo( 13, 0,"db",     "答辩",0 ) );
1441     m_name_obj.push_back( new CSysCodeKindDataInfo( 14, 0,"bj",     "报价得分",0 ) );
1442     m_name_obj.push_back( new CSysCodeKindDataInfo( 15, 0,"jzj", "基准价",0 ) );
1443     m_name_obj.push_back( new CSysCodeKindDataInfo( 16, 0,"hjqk", "获奖情况",0 ) );
1444     m_name_obj.push_back( new CSysCodeKindDataInfo( 17, 0,"tbxx", "投标信息",0 ) );
1445     m_name_obj.push_back( new CSysCodeKindDataInfo( 18, 0,"cgmx", "采购明细",0 ) );
1446     m_name_obj.push_back( new CSysCodeKindDataInfo( 19, 0,"khscore", "获奖情况",0 ) );
1447 
1448     m_param_obj.push_back( new CSysCodeKindDataInfo( 1, 1,"tbbj", "投标报价",0 ) );
1449     m_param_obj.push_back( new CSysCodeKindDataInfo( 2, 1,"csbj", "措施费用",0 ) );
1450     m_param_obj.push_back( new CSysCodeKindDataInfo( 3, 1,"qtbj", "其他费用",0 ) );
1451     m_param_obj.push_back( new CSysCodeKindDataInfo( 4, 1,"qd", "清单",0 ) );
1452     m_param_obj.push_back( new CSysCodeKindDataInfo( 5, 1,"kzj" , "控制价",0 ) );
1453 
1454     m_param_obj.push_back( new CSysCodeKindDataInfo( 11, 2,"corp", "单位",    0 ) );
1455     m_param_obj.push_back( new CSysCodeKindDataInfo( 12, 2,"emp" , "人员",    0 ) );
1456     m_param_obj.push_back( new CSysCodeKindDataInfo( 13, 2,"fzr" , "负责人",0 ) );
1457 
1458     m_param_obj.push_back( new CSysCodeKindDataInfo( 21, 3,"pf", "打分" ,0 ) );
1459     m_param_obj.push_back( new CSysCodeKindDataInfo( 22, 3,"hg" , "合格",0 ) );
1460     m_param_obj.push_back( new CSysCodeKindDataInfo( 23, 3,"pfml" , "打分+目录",0 ) );
1461     m_param_obj.push_back( new CSysCodeKindDataInfo( 24, 3,"hgml" , "合格+目录",0 ) );
1462 
1463 
1464     //const
1465     //m_const_obj.push_back( new CSysCodeKindDataInfo( 1, 0,"NoCopy" , "不可复制",0 ) );
1466     m_const_obj.push_back( new CSysCodeKindDataInfo( 1, 0,"OnlyOne" , "重复性检查",0 ) );
1467     m_const_obj.push_back( new CSysCodeKindDataInfo( 1, 0,"CheckQDZFile" , "检查QDZ是否存在",0 ) );
1468     m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "ParamChange", "参数是否可以修改", 0));
1469     m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "CalMethod", "计算方法", 0));
1470     m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "MaxMin", "去高去低", 0));
1471     m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "mb", "明标", 0));
1472     m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "ab", "暗标", 0));
1473     //m_const_obj.push_back(new CSysCodeKindDataInfo(1, 0, "Can", "去高去低", 0));
1474 };
1475 
1476 Cfyq_Interpreter::~Cfyq_Interpreter()
1477 {
1478     ClearVecPtr( m_name_obj  );
1479     ClearVecPtr( m_param_obj );
1480     ClearVecPtr( m_const_obj );
1481 };
1482 
1483 bool Cfyq_Interpreter::CheckName(  CString& title )
1484 {
1485     for( UINT i=0; i< m_name_obj.size(); i++ )
1486     {
1487         if( 0 == title.CompareNoCase( m_name_obj[i]->GetCode() ) )
1488         {
1489             return true;
1490         }
1491     }
1492     return false;
1493 };
1494 
1495 bool Cfyq_Interpreter::CheckParam( CString& title )
1496 {
1497     for( UINT i=0; i< m_param_obj.size(); i++ )
1498     {
1499         if( 0 == title.CompareNoCase( m_param_obj[i]->GetCode() ) )
1500         {
1501             return true;
1502         }
1503     }
1504     return false;    
1505 };
1506 
1507 bool Cfyq_Interpreter::CheckConst(CString& title)
1508 {
1509     for( UINT i=0; i< m_const_obj.size(); i++ )
1510     {
1511         if( 0 == title.CompareNoCase( m_const_obj[i]->GetCode() ) )
1512         {
1513             return true;
1514         }
1515     }
1516     return false;    
1517 }
1518 
1519 bool Cfyq_Interpreter::Interpreter(const CString& strFormula)
1520 {
1521     ClearVecPtr(m_vecExpression);
1522     m_strFormula = strFormula;
1523 
1524     m_nCurIndex = 0;
1525     m_pCurNode = CreateNode(FNK_Name);
1526     m_pCurName = (Cfyq_Name*)m_pCurNode;
1527     
1528     m_vecExpression.push_back(GetCurNode());
1529 
1530 
1531 
1532     if ( m_strFormula.IsEmpty())
1533         return false;
1534 
1535     m_strFormula.Trim();
1536     if(m_strFormula[m_strFormula.GetLength() - 1] != ';')
1537     {
1538         AfxMessageBox("表达式没有结束符!");
1539         return false;
1540     }
1541 
1542     for( m_nCurIndex=0; m_nCurIndex < m_strFormula.GetLength(); m_nCurIndex++  )
1543     {
1544         if( !push( m_strFormula[m_nCurIndex] ) )
1545         {
1546             CString strErrorMsg;
1547             strErrorMsg.Format("Error Index:%d ",m_nCurIndex);
1548             m_pCurNode->ErrorMsg(strErrorMsg);
1549             AfxMessageBox(strErrorMsg);
1550             return false;
1551         }
1552     };
1553 
1554     return true;
1555 }
1556 
1557 void Cfyq_Interpreter::backInterpreter(Cfyq_node* startName, CString& backstr)
1558 {
1559     startName->NextBackNode(startName, backstr, this, 0);
1560     pushback(startName, backstr);
1561     backstr += ";";
1562 }
1563 
1564 void Cfyq_Interpreter::pushback(Cfyq_node* startName, CString& backstr)
1565 {
1566     int len = startName->m_vecSubNode.size();
1567     if (!len)
1568     {
1569         return;
1570     }
1571     for (int i = 0; i < startName->m_vecSubNode.size(); ++i)
1572     {
1573         if (i == startName->m_vecSubNode.size() - 1)
1574             startName->m_vecSubNode[i]->NextBackNode(startName->m_vecSubNode[i], backstr, this, 1);
1575         else
1576             startName->m_vecSubNode[i]->NextBackNode(startName->m_vecSubNode[i], backstr, this, 0);
1577         pushback(startName->m_vecSubNode[i], backstr);
1578     }
1579 }
1580 
1581 bool Cfyq_Interpreter::push(char input)
1582 {
1583     Cfyq_node* pCurNode = GetCurNode();
1584     if( NULL == pCurNode)
1585         return false;
1586 
1587     switch( pCurNode->Accept( this, input ) )
1588     {
1589     case 1://可以接受
1590         return true;
1591     case 2://可以跳转
1592         return pCurNode->NextNode( this, input );
1593     case 3://忽略
1594         return true;
1595     default:
1596         return false;
1597     }
1598 }
1599 
1600 void Cfyq_Interpreter::ChangeNode(Cfyq_node* pNode)
1601 {
1602     m_vecExpression.push_back(pNode);
1603 
1604     if( FNK_Name == pNode->GetNodeGrade() )
1605         m_pCurName = (Cfyq_Name*)pNode;
1606 
1607     m_pCurNode = pNode;
1608 }
1609 
1610 void Cfyq_Interpreter::ChangeBackNode(Cfyq_node* pstate)
1611 {
1612     m_pCurBackNode = pstate;
1613 }
1614 
1615 bool Cfyq_Interpreter::IsTrueChar(char c)
1616 {
1617     if(('a'<=c && 'z'>=c) || 
1618         ('0'<=c && '9'>=c) ||
1619         ('A'<=c && 'Z'>=c) ||
1620         c == ' ' || c == '.')
1621     {
1622         return true;
1623     }
1624     return false;
1625 }
1626 
1627 bool Cfyq_Interpreter::IsChineseChar(char c)
1628 {
1629     if( c >= 0x80 || c<0 )
1630         return true;
1631 
1632     return false;
1633 }
1634 
1635 bool Cfyq_Interpreter::toString(CString& txt)
1636 {
1637 
1638     return true;
1639 }
1640 
1641 
1642 bool Cfyq_Interpreter::NextStrIs(const CString& str)
1643 {
1644     if(m_nCurIndex + 1 == m_strFormula.Find(str,m_nCurIndex))
1645         return true;
1646 
1647     return false;
1648 }
1649 
1650 bool Cfyq_Interpreter::NextStrIsIgnoreSpace(const CString& str)
1651 {
1652     if(0 == str.GetLength())
1653         return true;
1654     int n = 0;
1655     for(int index = m_nCurIndex+1; index<m_strFormula.GetLength(); index++)
1656     {
1657         if(m_strFormula.GetAt(index)==' ')
1658             continue;
1659         if(m_strFormula.GetAt(index)!=str.GetAt(n++))
1660             return false;
1661         if(n >= str.GetLength())
1662             return true;
1663     }
1664     return false;
1665 }
1666 
1667 bool Cfyq_Interpreter::LastStrIsIgnoreSpace(const CString& str)
1668 {
1669     if(0 == str.GetLength())
1670         return true;
1671     int n = str.GetLength()-1;
1672     for(int index = m_nCurIndex-1; index >= 0; index--)
1673     {
1674         if(m_strFormula.GetAt(index)==' ')
1675             continue;
1676         if(m_strFormula.GetAt(index)!=str.GetAt(n--))
1677             return false;
1678         if(n <= -1 )
1679             return true;
1680     }
1681     return false;
1682 }
1683 
1684 Cfyq_node* Cfyq_Interpreter::GetCurBackNode()
1685 {
1686     return m_pCurBackNode;
1687 }
1688 
1689 Cfyq_node* Cfyq_Interpreter::CreateNode(CFyq_NodeKind kind)
1690 {
1691     switch(kind)
1692     {
1693     case FNK_Name:
1694         return new Cfyq_Name();
1695     case FNK_Param:
1696         return new Cfyq_Param();
1697     case FNK_Scope:
1698         return new Cfyq_scope();
1699     case FNK_Const:
1700         return new Cfyq_const();
1701     case FNK_Value:
1702         return new Cfyq_Var();
1703     case FNK_Set:
1704         return new Cfyq_set();
1705     case FNK_Define:
1706         return new Cfyq_define();
1707     case FNK_Offset:
1708         return new Cfyq_offset();
1709     case FNK_Jzj:
1710         return new Cfyq_jzj();
1711     default:
1712         break;
1713     }
1714     return nullptr;
1715 }
1716 
1717 IMPLEMENT_SERIAL( Cfyq_Name, Cfyq_element, 0)
1718 
1719 int Cfyq_Name::Accept(Cfyq_Interpreter* pInterpreter, char input)
1720 {
1721     if( Cfyq_Interpreter::IsTrueChar( input ) )
1722         return AppendChar(pInterpreter, input);
1723 
1724     switch( input )
1725     {
1726     case ':':
1727     case '(':
1728     case '[':
1729     case '=':
1730         {
1731             return 2;
1732         }
1733     case '-':
1734         {
1735             if(pInterpreter->NextStrIs(">"))
1736                 return 2;
1737             else
1738                 return 0;
1739         }
1740     }
1741 
1742     return 0;
1743 }
1744 
1745 bool Cfyq_Name::NextNode(Cfyq_Interpreter* pInterpreter, char input)
1746 {
1747     if(!pInterpreter->CheckName(m_strContent))
1748     {
1749         return false;
1750     }
1751     switch( input )
1752     {
1753     case ':':
1754         {
1755             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Define));
1756             return true;
1757         }
1758     case '(':
1759         {
1760             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Param));
1761             return true;
1762         }
1763     case '[':
1764         {
1765             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Scope));
1766             return true;
1767         }
1768     case '=':
1769         {
1770             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Set));
1771             return true;
1772         }
1773     case '-':
1774         {
1775             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Offset));
1776             return true;
1777         }
1778     default:
1779         return false;
1780     }
1781     return false;
1782 }
1783 
1784 CString Cfyq_Name::GetParam()
1785 {
1786     return m_sParam;
1787 }
1788 
1789 void Cfyq_Name::SetParam(CString val)
1790 {
1791     m_sParam = val;
1792 }
1793 
1794 Cfyq_scope* Cfyq_Name::GetScope()
1795 {
1796     return m_pScope;
1797 }
1798 
1799 Cfyq_Name::Cfyq_Name()
1800 {
1801     m_bcanSerial = 0;
1802     m_bcanSerialjzj = 0;
1803     m_pScope = NULL;
1804     m_pjzj = NULL;
1805     m_sParam = "";
1806 }
1807 
1808 Cfyq_Name::~Cfyq_Name()
1809 {
1810 
1811 }
1812 
1813 void Cfyq_Name::SetScope(Cfyq_scope* val)
1814 {
1815     m_pScope = val;
1816     m_bcanSerial = 1;
1817 }
1818 
1819 void Cfyq_Name::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
1820 {
1821     CString strTemp;
1822     str += m_strContent;
1823     if (!m_sParam.IsEmpty())
1824     {
1825         strTemp.Format("(%s)", m_sParam);
1826         str += strTemp;
1827     }
1828     if (m_pScope)
1829     {
1830         strTemp.Format("[%s]", m_pScope->m_strContent);
1831         str += strTemp;
1832     }
1833     if (m_pjzj)
1834     {
1835         strTemp.Format("{%s}", m_pjzj->m_strContent);
1836         str += strTemp;
1837     }
1838     pInterpreter->ChangeBackNode(node);
1839 }
1840 
1841 Cfyq_jzj* Cfyq_Name::Getjzj() const
1842 {
1843     return m_pjzj;
1844 }
1845 
1846 void Cfyq_Name::Setjzj(Cfyq_jzj* jzj)
1847 {
1848     m_bcanSerialjzj = 1;
1849     m_pjzj = jzj;
1850 }
1851 
1852 void Cfyq_Name::ErrorMsg(CString& str)
1853 {
1854     CString strTmp = "名字出现错误!
";
1855     str += strTmp;
1856 }
1857 
1858 CFyq_NodeKind Cfyq_Name::GetNodeGrade()
1859 {
1860     return FNK_Name;
1861 }
1862 
1863 void Cfyq_Name::Serialize(CArchive& ar)
1864 {
1865     Cfyq_node::Serialize(ar);
1866     
1867     int rightcode = 1;
1868     if(ar.IsStoring())
1869     {
1870         ar << rightcode;
1871         ar << m_sParam;
1872         ar << m_bcanSerial;
1873         if(m_bcanSerial)
1874             m_pScope->Serialize(ar);
1875     }
1876     else 
1877     {
1878         ar >> rightcode;
1879         ar >> m_sParam;
1880         ar >> m_bcanSerial;
1881         if(m_bcanSerial)
1882         {
1883             m_pScope = new Cfyq_scope();
1884             m_pScope->Serialize(ar);
1885         }
1886     }
1887 }
1888 
1889 IMPLEMENT_SERIAL( Cfyq_Param, Cfyq_element, 0)
1890 
1891 bool Cfyq_Param::SetParamToName(Cfyq_Interpreter* pInterpreter)
1892 {
1893     pInterpreter->GetCurName()->SetParam(m_strContent);
1894     return true;
1895 }
1896 
1897 int Cfyq_Param::Accept(Cfyq_Interpreter* pInterpreter, char input)
1898 {
1899     if( Cfyq_Interpreter::IsTrueChar( input ) )
1900         return AppendChar(pInterpreter, input);
1901 
1902     switch( input )
1903     {
1904     case '[':
1905         {
1906             return 2;        
1907         }
1908     case '=':
1909         {
1910             return 2;
1911         }
1912     case ')':
1913         {
1914             SetClose(true);//闭合
1915             if(pInterpreter->NextStrIsIgnoreSpace("[")||pInterpreter->NextStrIsIgnoreSpace("="))
1916                 return 3;
1917             else 
1918                 return 0;    
1919         }
1920     }
1921 
1922     return 0;
1923 }
1924 
1925 bool Cfyq_Param::NextNode(Cfyq_Interpreter* pInterpreter, char input)
1926 {
1927     if(!IsClose())
1928         return false;
1929     if(pInterpreter->CheckParam(m_strContent))
1930         SetParamToName(pInterpreter);
1931     else
1932         return false;
1933 
1934     switch( input )
1935     {
1936     case '[':
1937         {
1938             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Scope));
1939             return true;
1940         }
1941     case '=':
1942         {
1943             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Set));
1944             return true;
1945         }
1946     default:
1947         return false;
1948     }
1949     return false;
1950 }
1951 
1952 CFyq_NodeKind Cfyq_Param::GetNodeGrade()
1953 {
1954     return FNK_Param;
1955 }
1956 
1957 void Cfyq_Param::ErrorMsg(CString& str)
1958 {
1959     CString strTmp = "参数出现错误!
";
1960     str += strTmp;
1961 }
1962 
1963 Cfyq_Param::Cfyq_Param()
1964 {
1965 
1966 }
1967 
1968 void Cfyq_Param::Serialize(CArchive& ar)
1969 {
1970     Cfyq_node::Serialize(ar);
1971     int rightcode = 1;
1972     if(ar.IsStoring())
1973     {
1974         ar << rightcode;
1975     }
1976     else 
1977     {
1978         ar >> rightcode;
1979     }
1980 }
1981 
1982 IMPLEMENT_SERIAL( Cfyq_set, Cfyq_opt, 0)
1983 
1984 int Cfyq_set::Accept(Cfyq_Interpreter* pInterpreter, char input)
1985 {
1986     if(input == ' ')
1987         return 3;
1988     if( Cfyq_Interpreter::IsTrueChar( input ) )
1989         return 2;
1990 
1991     return 0;
1992 }
1993 
1994 bool Cfyq_set::NextNode(Cfyq_Interpreter* pInterpreter, char input)
1995 {
1996     pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Name));
1997     pInterpreter->GetCurNode()->m_strContent.AppendChar(input);
1998     pInterpreter->GetCurNode()->m_bStateInputChar = true;
1999     return true;
2000 }
2001 
2002 
2003 void Cfyq_set::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
2004 {
2005     str += "=";
2006     pInterpreter->ChangeBackNode(node);
2007 }
2008 
2009 CFyq_NodeKind Cfyq_set::GetNodeGrade()
2010 {
2011     return FNK_Set;
2012 }
2013 
2014 Cfyq_set::Cfyq_set()
2015 {
2016 
2017 }
2018 
2019 Cfyq_set::~Cfyq_set()
2020 {
2021 
2022 }
2023 
2024 void Cfyq_set::Serialize(CArchive& ar)
2025 {
2026     int rightcode = 1;
2027     Cfyq_node::Serialize(ar);
2028     if( ar.IsStoring() )
2029     { 
2030         ar << rightcode;
2031     }
2032     else
2033     {
2034         ar >> rightcode;
2035     }
2036 }
2037 
2038 IMPLEMENT_SERIAL( Cfyq_define, Cfyq_opt, 0)
2039 
2040 int Cfyq_define::Accept(Cfyq_Interpreter* pInterpreter, char input)
2041 {
2042     if(input == ' ')
2043         return 3;
2044     if( Cfyq_Interpreter::IsTrueChar( input ) )
2045         return 2;
2046 
2047     return 0;
2048 }
2049 
2050 bool Cfyq_define::NextNode(Cfyq_Interpreter* pInterpreter, char input)
2051 {
2052     pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Const));
2053     pInterpreter->GetCurNode()->m_strContent.AppendChar(input);
2054     pInterpreter->GetCurNode()->m_bStateInputChar = true;
2055     return true;
2056 }
2057 
2058 CFyq_NodeKind Cfyq_define::GetNodeGrade()
2059 {
2060     return FNK_Define;
2061 }
2062 
2063 void Cfyq_define::NextBackNode(Cfyq_node* node, CString& str, Cfyq_Interpreter* pInterpreter, bool bLast)
2064 {
2065     str += ":";
2066     pInterpreter->ChangeBackNode(node);
2067 }
2068 
2069 Cfyq_define::Cfyq_define()
2070 {
2071 
2072 }
2073 
2074 
2075 void Cfyq_define::Serialize(CArchive& ar)
2076 {
2077     int rightcode = 1;
2078     Cfyq_node::Serialize(ar);
2079     if( ar.IsStoring() )
2080     { 
2081         ar << rightcode;
2082     }
2083     else
2084     {
2085         ar >> rightcode;
2086     }
2087 }
2088 
2089 IMPLEMENT_SERIAL( Cfyq_element, Cfyq_node, 0)
2090 Cfyq_element::Cfyq_element() : m_bIsCloseFlag(false)
2091 {
2092 
2093 }
2094 
2095 bool Cfyq_element::IsClose()
2096 {
2097     return m_bIsCloseFlag;
2098 }
2099 
2100 void Cfyq_element::SetClose(bool val)
2101 {
2102     m_bIsCloseFlag = val;
2103 }
2104 
2105 int Cfyq_element::AppendChar(Cfyq_Interpreter* pInterpreter, char input)
2106 {
2107     //进入字符状态
2108     if(m_bStateInputChar)
2109     {
2110         if(input==' ')
2111             m_bStateInputChar = false;
2112         else
2113         {
2114             m_strContent += input;
2115             return 1;
2116         }
2117     }
2118     //非字符状态
2119     else
2120     {
2121         if(input != ' ')
2122         {
2123             if(m_strContent.GetLength() == 0)
2124             {
2125                 m_bStateInputChar = true;
2126                 m_strContent += input;
2127                 return 1;
2128             }
2129             else
2130                 return 0;
2131         }
2132     }
2133     return 3;
2134 }
2135 
2136 void Cfyq_element::Serialize(CArchive& ar)
2137 {
2138     int rightcode = 1;
2139     if(ar.IsStoring())
2140     {
2141         ar << rightcode;
2142     }
2143     else
2144     {
2145         ar >> rightcode;
2146     }
2147 }
2148 IMPLEMENT_SERIAL( Cfyq_jzj, Cfyq_element, 0)
2149 
2150 
2151 Cfyq_jzj::Cfyq_jzj()
2152 {
2153     m_nkind = -1;
2154     m_strContent = "";
2155 }
2156 
2157 Cfyq_jzj::~Cfyq_jzj()
2158 {
2159 
2160 }
2161 
2162 void Cfyq_jzj::Serialize(CArchive& ar)
2163 {
2164     Cfyq_node::Serialize( ar );
2165     int rightcode = 1; 
2166     if( ar.IsStoring() )
2167     {
2168         ar << rightcode;
2169     }
2170     else
2171     {
2172         ar >> rightcode;
2173     }
2174 }
2175 
2176 bool Cfyq_jzj::SetjzjToName(Cfyq_Interpreter* pInterpreter)
2177 {
2178     pInterpreter->GetCurName()->Setjzj(this);
2179     return true;
2180 }
2181 
2182 int Cfyq_jzj::Accept(Cfyq_Interpreter* pInterpreter, char input)
2183 {
2184     if( Cfyq_Interpreter::IsTrueChar( input ) )
2185         return AppendChar(pInterpreter, input);
2186     switch( input )
2187     {
2188     case '}':
2189         {
2190             SetClose(true);
2191             if(pInterpreter->NextStrIsIgnoreSpace("->"))
2192                 return 3;
2193             else
2194                 return 0;
2195         }
2196     case '-':
2197         {
2198             if(pInterpreter->NextStrIs(">"))
2199                 return 2;
2200             m_strContent += input;
2201             return 1;
2202         }
2203     }
2204 
2205     return 0;
2206 }
2207 
2208 bool Cfyq_jzj::NextNode(Cfyq_Interpreter* pInterpreter, char input)
2209 {
2210     if(!IsClose())
2211         return false;
2212     else
2213         SetjzjToName(pInterpreter);
2214     switch( input )
2215     {
2216     case '-':
2217         {
2218             pInterpreter->ChangeNode(pInterpreter->CreateNode(FNK_Offset));
2219             return true;
2220         }
2221     default:
2222         return false;
2223     }
2224 }
2225 
2226 CFyq_NodeKind Cfyq_jzj::GetNodeGrade()
2227 {
2228     return FNK_Jzj;
2229 }
原文地址:https://www.cnblogs.com/Jawen/p/12079755.html