📄 exptoken.cpp
字号:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "ExpToken.h"
EToken::EToken()
{
strcpy(ETokenLeft,"");
ETokenOp_1=' ';
ETokenRN_1=0;
ETokenRN_2=0;
ETokenR_Op_1='+';
strcpy(ETokenR_1,"");
strcpy(ETokenR_2,"");
strcpy(ETokenEnd,"");
ETokenKind=0;
}/*
EToken::EToken(const EToken& P)
{
strcpy(ETokenLeft,P.ETokenLeft);
ETokenOp_1=P.ETokenOp_1;
ETokenRN_1=P.ETokenRN_1;
ETokenRN_2=P.ETokenRN_2;
ETokenR_Op_1=ETokenR_Op_1;
ETokenKind=P.ETokenKind;
strcpy(ETokenR_1,P.ETokenR_1);
strcpy(ETokenR_2,P.ETokenR_2);
strcpy(ETokenEnd,P.ETokenEnd);
}*///拷构不可乱添
void EToken::IniEToken()
{
EToken();
}
ETokenMan::ETokenMan()
{
CToken_Index=0;
}
ETokenMan::~ETokenMan()
{}
int ETokenMan::GenExpToken(CTokens *T,EToken *PEToken)
{
// void CTokens::GetToken(CToken* pToken,int index)
//{
// *pToken=TokenV[index];
//}
CToken ET;
CToken* EToken_Node=&ET;
int len1=T->GetTokenNum();
T->GetToken(EToken_Node,CToken_Index);
if(strcmp(EToken_Node->CTokenName,"program")==0)
{
strcpy(PEToken->ETokenLeft,"program");
strcpy(PEToken->ETokenEnd,"#");
CToken_Index++;
PEToken->ETokenKind=1;
ExpStack.push_back(*PEToken);
return 1;//#program
}
if(strcmp(EToken_Node->CTokenName,"var")==0)
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==':')
{
strcpy(PEToken->ETokenLeft,"var");
strcpy(PEToken->ETokenEnd,":");
CToken_Index++;
PEToken->ETokenKind=2;
ExpStack.push_back(*PEToken);
return 2;//#var #:
}
return 0;
}
if(strcmp(EToken_Node->CTokenName,"end")==0 )//&& CToken_Index<len1
{
strcpy(PEToken->ETokenLeft,"end");
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=8;
ExpStack.push_back(*PEToken);
return 8;//end
}
else
{
if(EToken_Node->CTokenChar !=';')
{
strcpy(PEToken->ETokenLeft,EToken_Node->CTokenName);//注意编辑器中的Tab容易被当成左部.
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenOp_1=EToken_Node->CTokenChar;//read operator token
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenkind==4)
{
PEToken->ETokenRN_1=EToken_Node->CTokenValue;
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=3;
ExpStack.push_back(*PEToken);
return 3;//x1=3;
}
if(EToken_Node->CTokenkind==1)
{
PEToken->ETokenR_Op_1=EToken_Node->CTokenChar;
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenkind==4)
{
PEToken->ETokenRN_2=EToken_Node->CTokenValue;
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=4;
ExpStack.push_back(*PEToken);
return 4;//x1=3+3;
}
}
if(EToken_Node->CTokenkind==3)
{
strcpy(PEToken->ETokenR_2,EToken_Node->CTokenName);
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=9;
ExpStack.push_back(*PEToken);
return 9;//x1=2+x3;
}
}
}
}
if(EToken_Node->CTokenkind==3)
{
strcpy(PEToken->ETokenR_1,EToken_Node->CTokenName);
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=5;
ExpStack.push_back(*PEToken);
return 5;//x1=x2;
}
PEToken->ETokenR_Op_1=EToken_Node->CTokenChar;
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenkind==4)
{
PEToken->ETokenRN_2=EToken_Node->CTokenValue;
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=6;
ExpStack.push_back(*PEToken);
return 6;//x1=x2+3;
}
}
else
{
strcpy(PEToken->ETokenR_2,EToken_Node->CTokenName);
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
if(EToken_Node->CTokenChar==';')
{
CToken_Index++;
T->GetToken(EToken_Node,CToken_Index);
PEToken->ETokenKind=7;
ExpStack.push_back(*PEToken);
return 7;//x1=x2+x3;
}
}
}
}
}
return 0;
}
int ETokenMan::GetExp(CTokens* TT)
{
//int ETokenMan::GenExpToken(EToken *PEToken,ETokenMap *PETokenM)
EToken Tm;
EToken* TmpEToken=&Tm;
//TmpEToken->IniEToken();
//CTokens TT;
int len=TT->GetTokenNum();
int i=CToken_Index;
int j=0;
while(i<len+1)
{
j=GenExpToken(TT,TmpEToken);
switch(j)
{
case 1:
{
cout<<TmpEToken->ETokenLeft<<" ";
cout<<endl;
// ExpStack.push_back(*TmpEToken);
break;
}
case 2:
{
cout<<TmpEToken->ETokenLeft<<" ";
cout<<endl;
// ExpStack.push_back(*TmpEToken);
break;
}
case 3:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenRN_1<<" ";
cout<<endl;
break;
}
case 4:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenRN_1<<" ";
cout<<TmpEToken->ETokenR_Op_1<<" ";
cout<<TmpEToken->ETokenRN_2<<" ";
cout<<endl;
break;
}
case 5:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenR_1<<" ";
cout<<endl;
break;
}
case 6:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenR_1<<" ";
cout<<TmpEToken->ETokenR_Op_1<<" ";
cout<<TmpEToken->ETokenRN_2<<" ";
cout<<endl;
break;
}
case 7:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenR_1<<" ";
cout<<TmpEToken->ETokenR_Op_1<<" ";
cout<<TmpEToken->ETokenR_2<<" ";
cout<<endl;
break;
}
case 8:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<endl;
break;
}
case 9:
{
// ExpStack.push_back(*TmpEToken);
cout<<TmpEToken->ETokenLeft<<" ";
cout<<TmpEToken->ETokenOp_1<<" ";
cout<<TmpEToken->ETokenRN_1<<" ";
cout<<TmpEToken->ETokenR_Op_1<<" ";
cout<<TmpEToken->ETokenR_2<<" ";
cout<<endl;
break;
}
}
i=CToken_Index;
}
return 1;
}
int ETokenMan::GetExpNum()
{
int lenExp=0;
lenExp=ExpStack.size();
return lenExp;
}
//----------------------------------------------------------
CVarToken::CVarToken()
{
strcpy(VarName,"");
VarValue=0;
}
int CVarMan::GenVarStack(CTokens* T)
{//void GetToken(CToken* pToken,int index);int GetTokenNum();
CToken TmpV;
CVarToken TmpVar;
int lenV=0;
int i=0;
lenV=T->GetTokenNum();
while(i<lenV)
{
T->GetToken(&TmpV,i);
if(TmpV.CTokenkind==3)
{
strcpy(TmpVar.VarName,TmpV.CTokenName);
VarStack.push_back(TmpVar);
}
i++;
}
return 1;
}
int CVarMan::CleanStack()
{
int j=0;
int t=0;
while(j<VarStack.size())
{
int k=j;
t=j+1;
while(t<VarStack.size()&&strlen(VarStack[k].VarName)!=0)
{
int tt=9;
char str[10]="";
char str1[10]="";
strcpy(str,VarStack[t].VarName);
strcpy(str1,VarStack[k].VarName);
tt=strcmp(str1,str);
if(tt==0)
{
if(strlen(VarStack[t].VarName)!=0)
{
strcpy(VarStack[t].VarName,"");
VarStack[k].VarValue=0;
}
}
t++;
}
j++;
}
return 1;
}
int CVarMan::QueryVstack(char* VarN)
{
int i_V=3;
int Var_Index=0;
int lenVS1=VarStack.size();
while(Var_Index<lenVS1)
{
i_V=strcmp(VarN,((VarStack[Var_Index]).VarName));
if(i_V==0)
{
return ((VarStack[Var_Index]).VarValue);
}
Var_Index++;
}
return 0;
}
int CVarMan::PutInValue(char* VarN,double* VarVal)
{
int i_V1=3;
int lenVS=VarStack.size();
for(int i=0;i<lenVS;i++)
{
char str[10]="";
strcpy(str,((VarStack[i]).VarName));
i_V1=strcmp(VarN,str);
if(i_V1==0)
{
VarStack[i].VarValue=*VarVal;
}
}
return 1;
}
int CVarMan::GetVarStackLgth()
{
int LenG=0;
LenG=VarStack.size();
return LenG;
}
int CVarMan::PrintVarS()
{
int lenVST=0;
lenVST=VarStack.size();
for(int i=0;i<lenVST;i++)
{
if(strlen(VarStack[i].VarName)!=0)
{
cout<<"(";
cout<<VarStack[i].VarName<<" ";
cout<<VarStack[i].VarValue;
cout<<")";
cout<<endl;
}
}
return 1;
}
double CVarMan::ExpOpMan( char* op,char* PCVar,double P2,double P3)
{
double P1=0;
if((*op)=='+')
{
(P1)=P2+P3;
}
if((*op)=='-')
{
(P1)=(P2)-(P3);
}
if((*op)=='*')
{
(P1)=(P2)*(P3);
}
if((*op)=='/')
{
(P1)=(P2)/(P3);
}
if((*op)=='=')
{
(P1)=(P2);
}
PutInValue(PCVar,&P1);
return 0;
}
int CVarMan::ManAExp(EToken* TE)
{
double* Tmp_P1=0;
int j=0;
j=TE->ETokenKind;
switch(j)
{
case 1: //#program
{
break;
}
case 2: //#var
{
break;
}
case 8: //end
{
break;
}
case 3: //x1=3
{
ExpOpMan(&TE->ETokenOp_1,TE->ETokenLeft,(double)TE->ETokenRN_1,0);
break;
}
case 4://x1=3+3;
{
//char Name[10]="";&TE->ETokenR_Op_1
ExpOpMan(&(TE->ETokenR_Op_1),TE->ETokenLeft,(double)TE->ETokenRN_1,(double)TE->ETokenRN_2);
//ExpOpMan(TE->ETokenOp_1,TE->ETokenLeft,(double)TE->ETokenRN_1,(double)TE->ETokenRN_2);
break;
}
case 5://x1=x2;
{
double tmp=QueryVstack(TE->ETokenR_1);
ExpOpMan(&TE->ETokenOp_1,TE->ETokenLeft,tmp,0);
break;
}
case 6://x1=x2+3;
{
double tmp1=QueryVstack(TE->ETokenR_1);
ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,tmp1,TE->ETokenRN_2);
break;
}
case 7://x1=x2+x3;
{
double tmp2=QueryVstack(TE->ETokenR_1);
double tmp3=QueryVstack(TE->ETokenR_2);
ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,tmp2,tmp3);
break;
}
case 9://x1=2+x3;
{
double tmp4=QueryVstack(TE->ETokenR_2);
ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,TE->ETokenRN_1,tmp4);
break;
}
default:
return 0;
}
return 1;
}
int CVarMan::GenFinalES(ETokenMan* TEM )
{
EToken TMP;
int EXP_INDex=0;
int len_VS=0;
len_VS=VarStack.size();
CleanStack();
while(EXP_INDex<len_VS)
{
ManAExp(&(TEM->ExpStack[EXP_INDex]));
EXP_INDex++;
}
return 1;
}
int CVarMan::GenERVar()
{
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -