C/C++对Lu系统内置动态对象进行运算符重载(二)

2014-11-24 07:38:57 · 作者: · 浏览: 4
else if(pLu0 && xx->BType==luDynData_lu) { pLu=(luLu *)NewSysObj(luDynData_lu,pLu0->Len+1,0); if(!pLu) return a; for(i=0,j=0;i Len;i++,j++) pLu->Lu[j]=pLu0->Lu[i]; pLu->Lu[j]=xx[1]; } else if(pLu1 && (xx+1)->BType==luDynData_lu) { pLu=(luLu *)NewSysObj(luDynData_lu,pLu1->Len+1,0); if(!pLu) return a; for(i=0,j=1;i Len;i++,j++) pLu->Lu[j]=pLu1->Lu[i]; pLu->Lu[0]=xx[0]; } else { return a; } a.BType=luDynData_lu; a.VType=key_luu; a.x=0; *(luVOID *)&(a.x)=(luVOID)pLu; FunReObj(vFor); return a; } //输出luu的信息,通过重载函数o间接调用 LuData _stdcall lu_oLuu(luINT mm,LuData *xx,void *vFor) { static wchar_t ErrName[]=L"luu o"; luLu *pLu; luMessage pMessage; luVOID k=0; LuData a; a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=0; pMessage=(luMessage)SearchKey((char *)&k,sizeof(luVOID),luPubKey_User); if(!pMessage) return a; pLu=(luLu *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_lu); if(!pLu) //不可识别的lu对象 { SetRunErr(1,ErrName,1,0,vFor); return a; } pMessage(L"luu{... ...} "); a.x=13; return a; } LuData _stdcall OpLock_luu(luINT m,LuData *Para,void *vFor,int theOperator) //luu的运算符重载函数 { LuData a; switch(theOperator) { case 0: //重载运算符+ return lu_addLuu(m,Para,vFor); case 44: //重载函数len Para->VType=luDynData_lu; a=ExeOperator(m,Para,vFor,theOperator,luDynData_lu); //直接调用基本类型luDynData_lu的len函数 Para->VType=key_luu; return a; case 46: //重载函数new a=ExeOperator(m,Para,vFor,theOperator,luDynData_lu); //直接调用基本类型luDynData_lu的new函数 if(a.VType==luDynData_lu) a.VType=key_luu; //设置扩展类型为自定义的key_luu类型 return a; case 47: //重载函数oset case 48: //重载函数oget Para->VType=luDynData_lu; a=ExeOperator(m,Para,vFor,theOperator,luDynData_lu); //直接调用基本类型luDynData_lu的oset或oget函数 Para->VType=key_luu; return a; case 49: //重载函数o return lu_oLuu(m,Para,vFor); default: SetRunErr(1,L"luu 无法识别的运算符!",theOperator,0,vFor); break; } a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0; return a; } void main(void) { void *hFor; //存放表达式句柄,即脚本函数句柄 luINT nPara; //存放表达式的自变量个数 LuData *pPara; //存放输入自变量的数组指针 luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置 int ErrCode; //错误代码 LuData Val; //Lu基本数据类型 void *v=NULL; //为了避免编译器报错,初始化为NULL luVOID k=0; //32位平台上luVOID被定义为__int32;64位平台上luVOID被定义为__int64;k必须赋值为0 wchar_t ForStr[]=L"main(:a,i)= a=luu[22, \"abc\",3.5], o[a], i=-1,while{++i


运行结果:

luu{... ...} 22 abc 3.5

4 函数说明

本例用到了Lu的10个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom、计算表达式的函数LuCal、加锁键函数LockKey、注册C/C++函数的函数SetFunction、申请系统内置动态对象函数NewSysObj、插入键值的函数InsertKey、查找键值的函数SearchKey、按指定类型执行运算符重载函数ExeOperator。从这里查看这些函数的说明:Lu编程指南。

5 难点分析

在对Lu系统内置动态对象进行运算符重载时,需要:(1)用LockKey加锁一个键(本例为key_luu),但不需要向Lu系统注册任何键值;(2)删除键值的函数(本例为Del_luu)定义为空函数;(3)定义运算符重载函数(本例为OpLock_luu)。

值得一提的是,使用申请系统内置动态对象函数NewSysObj很方便,不仅高效,而且返回的对象已注册到了Lu键树中,不需要自己再进行注册。使用按指定类型执行运算符重载函数ExeOperator也很方便,免去了自己的编码之苦。

(1)如果修改代码中的字符串表达式为(注意C/C++字符串中转义字符 \" 的使用,下同):

main(:a,i)= a=new[luu,3 : 22, "abc",3.5], o[a], i=-1,while{++i

可得到如下结果:

luu{... ...} 22 abc 3.5

(2)如果修改代码中的字符串表达式为:

main(:a,i)= a=luu[22, "abc",3.5], a=55+a+"asd", o[a], i=-1,while{++i

可得到如下结果:

luu{... ...} 55 22 abc 3.5 asd

6 其他

你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。


版权所有 Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2014年01月05日