44#include < functional>
55using namespace std ;
66
7- enum nodeType{Basic, Num,String,Variable,Pro,Fun};
7+ enum nodeType{Num,String,Variable,Pro,Fun};
88
99class BasicNode // 不可直接创建对象
1010{
1111protected:
1212 bool isRet=false ;
1313public:
14- virtual int getType (){ return Basic;}
14+ virtual int getType ();
1515 virtual void addNode (BasicNode* node) {this ->sonNode .push_back (node);} // 使用该方法添加成员可查错
1616 virtual BasicNode* eval ();
17+ virtual ~BasicNode ();
1718
1819 void setRet () {this ->isRet =true ;} // 不可eval节点设置ret无效
1920 bool getRet () {return this ->isRet ;}
@@ -30,7 +31,7 @@ class NumNode : public BasicNode
3031public:
3132 virtual int getType () {return Num;}
3233 virtual void addNode (BasicNode *node) {throw string (" NumNode no sonNode" );}
33- virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(this );}
34+ virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(new NumNode (num));} // 字面量在计算后将会析构,这里要new新的
3435 NumNode (double num) {this ->num =num;}
3536
3637 double getNum () {return this ->num ;}
@@ -44,7 +45,7 @@ class StringNode : public BasicNode
4445public:
4546 virtual int getType () {return String;}
4647 virtual void addNode (BasicNode *node) {throw string (" String no sonNode" );}
47- virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(this );}
48+ virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(new StringNode (str));} // 同上
4849 StringNode (string str) {this ->str =str;}
4950
5051 string getStr () {return this ->str ;}
@@ -59,7 +60,7 @@ class VariableNode : public BasicNode
5960public:
6061 virtual int getType () {return Variable;}
6162 virtual void addNode (BasicNode* node) {throw string (" VariableNode no sonNode" );}
62- virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(this );}
63+ virtual BasicNode* eval () {return dynamic_cast <BasicNode*>(this );} // 变量在scope销毁时释放,所以可以返回自身
6364
6465 bool isEmpty () {return this ->isempty ;}
6566 void setVal (BasicNode val);
@@ -94,6 +95,7 @@ class Function
9495 Function (int parnum,ProNode* pronode=nullptr ,bool VLP=false ):parnum(parnum),pronode(pronode),VLP(VLP){} // 普通函数(有函数体)
9596 Function (int parnum,canBE canBEfun,BE BEfun,bool VLP=false ):
9697 parnum (parnum),canBEfun(canBEfun),BEfun(BEfun),VLP(VLP),iscanBE(true ){} // 调用到函数接口
98+ ~Function () {delete pronode;}
9799
98100 ProNode* getPronode () {return this ->pronode ;}
99101 int getParnum () {return this ->parnum ;}
@@ -105,7 +107,7 @@ class Function
105107class FunNode : public BasicNode
106108{
107109protected:
108- Function* funEntity;
110+ Function* funEntity; // 所有权在scope,不在这里析构
109111public:
110112 virtual int getType () {return Fun;}
111113 virtual void addNode (BasicNode* node);
0 commit comments