scriptengine.cpp
来自「一个支持中文的类C语言编译器」· C++ 代码 · 共 1,952 行 · 第 1/5 页
CPP
1,952 行
return false;
}
if(!(argInfo==this->Table_FunctionName[i].argInfo)){
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
//根据查得的函数名进行处理
switch(funTD.WdTp)//
{
case $ABS: //abs
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$INT;
opd.VarVlue.intconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $ACOS://acos
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)acos(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $ASIN://asin
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)asin(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=asin(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $ATAN: //atan
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)atan(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=atan(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $COS: //cos
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)cos(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=cos(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $EXP: //exp
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)exp(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=exp(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $SIN: //sin
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)sin(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=sin(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $SQRT: //sqrt
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)sqrt(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=sqrt(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $TAN: //tan
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)tan(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=tan(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $POW: //pow(x,y)
switch(argInfo.arg[argInfo.nCount-2].VarTp)
{
case $INT:
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.intconst,argInfo.arg[argInfo.nCount-2].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.intconst,argInfo.arg[argInfo.nCount-2].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
case $REAL:
switch(argInfo.arg[argInfo.nCount-1].VarTp)
{
case $INT:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.dbconst,argInfo.arg[argInfo.nCount-2].VarVlue.intconst);
break;
case $REAL:
opd.VarTp=$REAL;
opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.dbconst,argInfo.arg[argInfo.nCount-2].VarVlue.dbconst);
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
break;
/********************GetBits(data,end,beg)************************************/
case $GETBITS://GetBits(data,end,beg)
//检查参数类型
for(i=0;i<3;i++)
{
if(argInfo.arg[i].VarTp!=$INT)
{
MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
return false;
}
}
opd.VarTp=$INT;
opd.VarVlue.intconst=GetBits(argInfo.arg[0].VarVlue.intconst,argInfo.arg[1].VarVlue.intconst,argInfo.arg[2].VarVlue.intconst);
break;
/******************OpenPicture(string)****************************************/
case $OPENPICTURE:
if(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic)!=""){
if(this->m_bIsInRunEnvir)
AfxGetApp()->OpenDocumentFile(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic));
}
break;
/******************ClosePicture(string)***********************************************/
case $CLOSEPICTURE:
if(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic)!=""){
if(this->m_bIsInRunEnvir)
CloseDocumentFile(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic));
}//全局函数CloseDocumentFile在张国辉处定义,在头文件中作了引用外部函数的声明
break;
/******************PlayWaveFile(string,int flag)********************************************************************/
//string: 要播放的声音文件路径名
//flag-标志:0-停止播放声音;1-同步播放声音;2-异步播放声音;3-重复播放声音直到下次调用PlaySound()函数为止;4-蜂鸣器报警
case $PLAYWAVEFILE:
if (argInfo.arg[1].VarVlue.intconst<0||argInfo.arg[1].VarVlue.intconst>4) { //参数不合法
MessageBox(NULL,"该函数第2个参数取值不正确(0~4)","发现错误",MB_OK|MB_ICONHAND);
return false;
}
if (m_bIsInRunEnvir) { //只有在运行环境,才真正执行该动作
DWORD fdwSound=SND_NODEFAULT|SND_FILENAME; //声音文件的播放模式
switch(argInfo.arg[1].VarVlue.intconst) {
case 0://停止播放声音
fdwSound|=SND_PURGE;
break;
case 1://同步播放声音
fdwSound|=SND_SYNC;
break;
case 2:
fdwSound|=SND_ASYNC;
break;
case 3:
fdwSound|=SND_LOOP|SND_ASYNC;
break;
case 4:
fdwSound=SND_FILENAME|SND_LOOP|SND_ASYNC;
argInfo.arg[0].VarVlue.SignOrString[0]='n';
argInfo.arg[0].VarVlue.SignOrString[1]='u';
argInfo.arg[0].VarVlue.SignOrString[2]='l';
argInfo.arg[0].VarVlue.SignOrString[3]='l';
argInfo.arg[0].VarVlue.SignOrString[4]='\0';//强制播放的声音文件名为空
break;
default:
break;
}
if(argInfo.arg[0].VarVlue.SignOrString[0]=='\0')
PlaySound(NULL,NULL,fdwSound);
else
PlaySound(argInfo.arg[0].VarVlue.SignOrString,NULL,fdwSound);
}
break;
case $EXIT:
if (m_bIsInRunEnvir)
{
if( ::MessageBox( AfxGetApp()->m_pMainWnd->m_hWnd, "确实要退出吗?", "提示", MB_YESNO|MB_ICONINFORMATION|MB_DEFBUTTON2 ) == IDNO )
return true;
//先退出登录
LogOut();
//exit(argInfo.arg[0].VarVlue.intconst);
BOOL bForSwi = ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_bForSwi;
BOOL bForCAD = ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_bForCAD;
// if(bForSwi)
CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS, FALSE);
// if(bForCAD)
CTaskKeyMgr::Disable(CTaskKeyMgr::TASKMGR,FALSE);
PostMessage(NULL,WM_QUIT,0,0);
}
break;
case $LOGIN:
if (m_bIsInRunEnvir) {
Login();
}
break;
case $LOGOUT:
if (m_bIsInRunEnvir) {
LogOut();
}
break;
case $USERCONFIG:
if (m_bIsInRunEnvir) {
UserConfig();
}
break;
default:
opd.VarTp=$INVALID;
MessageBox(NULL,"目前尚不支持该函数!","错误",MB_OK|MB_ICONHAND);
return false;
}
/**/
return true;
}
bool CScriptEngine::Item(COpData &opd)
{
COpData opdata;
CTwoDim TDim;
if(!this->Factor(opd)) return false;
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
while(TDim.WdTp==$STAR||TDim.WdTp==$DIVIDE){
if(!this->Factor(opdata)) return false;
switch(TDim.WdTp)
{
case $STAR:
opd=opd*opdata;
break;
case $DIVIDE:
opd=opd/opdata;
break;
default:
return false;
}
TDim.InitTD();
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
}
this->m_waWrdAnly.BackWord();
if(opd.VarTp==$INVALID){
return false;
}
return true;
}
bool CScriptEngine::Condition(bool &blResult)
{
BOOL temp_result;//暂存三态结果
PTSTR ptStr=this->m_waWrdAnly.m_ptStr;//记录初始位置,便于退回
int piPointer=this->m_waWrdAnly.m_piPointer;//记录初始位置,便于退回
CTwoDim TDim;
COpData exp1,exp2;
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(TDim.WdTp==$LPAR){//(
if(!DBCondition(blResult)){//识别不成功,再试探 表达式?表达式 型
this->m_waWrdAnly.m_ptStr=ptStr;
this->m_waWrdAnly.m_piPointer=piPointer;
goto L_EXP;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?