scriptengine.cpp
来自「一个支持中文的类C语言编译器」· C++ 代码 · 共 1,952 行 · 第 1/5 页
CPP
1,952 行
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!=$SIGN){
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;//sign
}
if(!LookUpVar(TDim.WdVlue.SignOrString,pArray_CVarDef,size_Array,i_array,opd))//若操作成功,返回下标(i_array)、变量信息(opd)
{
MessageBox(NULL,"变量未定义","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
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;
}
if(TDim.WdTp!=$DOT){//.
this->m_waWrdAnly.BackWord();
identT=$VARIANT;
return true;//说明是一般变量
}
//否则,判断是否为 变量.属性
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;
}
if(TDim.WdTp!=$SIGN){//sign 属性
MessageBox(NULL,"要求是变量的属性值","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(!LookUpProperty(/*属性名*/TDim.WdVlue.SignOrString,
/*属性表入口*/array_prop,
/*属性id*/id_property,
/*属性数据类型*/varT))
{
MessageBox(NULL,"找不到变量的该属性","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
identT=$PROPERPTY;//属性
return true;
}
ReturnType CScriptEngine::Function(COpData &opd)
{
// COpData opd;
PTSTR ptStr=this->m_waWrdAnly.m_ptStr;//记录初始位置,便于退回
int piPointer=this->m_waWrdAnly.m_piPointer;//记录初始位置,便于退回
int first_fun=0;//指示函数名位置
int end_fun=0;
////TRACE("_____________________:%s",this->m_waWrdAnly.m_ptStr);
CTwoDim TDim;
CTwoDim funTD;//暂存信息
CArgInfo argInfo;//参数信息
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 ERRINPROCESS;
}
if(TDim.WdTp!=$SIGN){//sign
/* 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();}*/
this->m_waWrdAnly.BackWord();
return NOTTHISKIND;
}//要求为函数名或变量名
first_fun=this->m_waWrdAnly.m_pPtWd.piFst_word;
end_fun=this->m_waWrdAnly.m_pPtWd.piLst_word;
strcpy(funTD.WdVlue.SignOrString,TDim.WdVlue.SignOrString);//存函数名
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 ERRINPROCESS;
}
if(TDim.WdTp!=$LPAR){//(
/* 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();}*/
this->m_waWrdAnly.m_ptStr=ptStr;//恢复指针位置
this->m_waWrdAnly.m_piPointer=piPointer;//恢复指针位置
return NOTTHISKIND;
}//要求为(
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 ERRINPROCESS;
}
if(TDim.WdTp==$RPAR){//) 不带参数
if(this->LookUpFunList(funTD,argInfo,opd)){//opd返回函数输出信息
return SUCCESSFUL;
}
else{
return ERRINPROCESS;
}
}
else{
this->m_waWrdAnly.BackWord();
}
//带参数
if(!this->Expression(argInfo.arg[0]))return ERRINPROCESS;
argInfo.nCount++;
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 ERRINPROCESS;
}
while(TDim.WdTp==$COMMA&&argInfo.nCount<ARG_COUNT){
if(!this->Expression(argInfo.arg[++argInfo.nCount-1]))return ERRINPROCESS;
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 ERRINPROCESS;
}
}
if(TDim.WdTp!=$RPAR){//)
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 ERRINPROCESS;//要求为)
}
if(!this->LookUpFunList(funTD,argInfo,opd)){
MessageBox(NULL,"没有这种函数","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(first_fun,end_fun+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return ERRINPROCESS;//没有这种函数
}
if(opd.VarTp==$INVALID) return ERRINPROCESS;
return SUCCESSFUL;
}
bool CScriptEngine::Factor(COpData &opd)
{ ////TRACE("_____________________:%s",this->m_waWrdAnly.m_ptStr);
ReturnType returnT;//判断是否函数
CTwoDim TDim;
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==$FCONST){//实型常量
opd.VarTp=$REAL;
opd.VarVlue.dbconst=TDim.WdVlue.dbconst;
return true;
}
if(TDim.WdTp==$ICONST){//整型常量
opd.VarTp=$INT;
opd.VarVlue.intconst=TDim.WdVlue.intconst;
return true;
}
if(TDim.WdTp==$SCONST){//字符串常量
opd.VarTp=$STRING;
strcpy(opd.VarVlue.SignOrString,TDim.WdVlue.SignOrString);
return true;
}
if(TDim.WdTp==$LPAR){//(表达式)
if(!this->Expression(opd)) 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;
}
if(TDim.WdTp!=$RPAR){
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;
}
return true;
}
if(TDim.WdTp!=$SIGN){
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();
//函数或ident_R
returnT=this->Function(opd);
switch(returnT)
{
case SUCCESSFUL:
if(opd.VarTp==$INVALID) return false;
return true;
case NOTTHISKIND:
ASSERT(array_var);//确保变量表入口指针有效
if(!this->Ident_R(array_var,opd)) return false;
return true;
case ERRINPROCESS:
default:
return false;
}
}
bool CScriptEngine::Expression(COpData &opd)
{
CTwoDim TDim;
COpData opdata;//
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;
}
switch(TDim.WdTp)
{
case $PLUS:
if(!this->Item(opd)) return false;
break;
case $MINUS:
if(!this->Item(opd)) return false;
opd=0-opd;
break;
case $ILLEGALWORD:
/* 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;*/
default:
this->m_waWrdAnly.BackWord();
if(!this->Item(opd)) return false;
break;
}
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;
}
while(TDim.WdTp==$PLUS||TDim.WdTp==$MINUS){
if(!this->Item(opdata)) return false;
switch(TDim.WdTp)
{
case $PLUS:
opd=opd+opdata;
break;
case $MINUS:
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::LookUpFunList(CTwoDim funTD, CArgInfo &argInfo, COpData &opd)
{
//funTD贮存函数名
//argInfo贮存参数信息,包括参数个数及贮存在操作数数组中的各个参数(型,值)
//opd用以返回查询函数后返回的结果
for(int i=0;i<SIZE_TB_FUNC;i++){//注意,添加或删除函数时,注意更新SIZE_TB_FUNC
if(!strcmp(funTD.WdVlue.SignOrString,this->Table_FunctionName[i].TDim.WdVlue.SignOrString)){
funTD.WdTp=this->Table_FunctionName[i].TDim.WdTp;//根据函数名字符串信息填充函数的枚举类型信息,以方便处理(后续判断无需再用'switch()case;'比较函数名,只要比较枚举类型即可)
break;
}
}
if(i>=SIZE_TB_FUNC){//不存在该函数
// MessageBox(NULL,"函数名错误","发现错误",MB_OK|MB_ICONHAND);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?