📄 fenxi.cpp
字号:
bool Factor1(int *iPlace,char*buffer) //X
{
TOKEN token;
char ex[1024]={0};
char ex1[1024]={0};
char temp[100]={0};
int Argument[10],num=0;
token=accidence(infile,irow,0);
if(token.iType==KEYWORD &&token.dProperty=='(')
{
token=accidence(infile,irow,1);
if(!Expression(Argument,ex))
{
return false;
}
num++;
if(!ExpressionList(Argument,&num,ex1))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD || token.dProperty!=')')
{
WriteError("缺少')'",token.iPosition);
}
sprintf(buffer,"%s%s",ex,ex1);
for(int i=0;i<num;i++)
{
if(GetType(Argument[i])!=GetType(table.getParam(*iPlace,i)))
{
WriteError("类型不匹配",token.iPosition);
}
sprintf(temp,"param %d\r\n",Argument[i]);
strcat(buffer,temp);
}
sprintf(temp,"call %d\r\n",*iPlace);
strcat(buffer,temp);
iCodeLine+=num+1;
return true;
}
return true;
}
bool Term(int *iPlace,char *buffer) //T
{
TOKEN token;
int place,temp;
char factor[1024]={0};
char term[1024]={0};
token=accidence(infile,irow,0);
if(token.iType==MUL_OP)
{
token=accidence(infile,irow,1);
if(!Factor(&place,factor))
{
return false;
}
if(GetType(*iPlace)!=GetType(place))
{
WriteError("类型不匹配",token.iPosition);
}
if(token.dProperty=='*' ||token.dProperty=='/')
{
temp=Insert(GetType(*iPlace),2);
if(GetType(*iPlace)>GetType(place))
{
temp=Insert(GetType(*iPlace),2);
}
else
{
temp=Insert(GetType(place),2);
}
}
else
{
temp=Insert(BOOL,2);
}
sprintf(buffer,"%s%d = %d %c %d\r\n",factor,temp,*iPlace,(char)token.dProperty,place);
iCodeLine++;
if(!Term(&temp,term))
{
return false;
}
*iPlace=temp;
strcat(buffer,term);
}
return true;
}
bool SimpleExpression1(int *iPlace,char *buffer)//Y
{
TOKEN token;
char factor[512]={0};
char term[512]={0};
char se[1024]={0};
int temp,place;
token=accidence(infile,irow,0);
if(token.iType==ADD_OP)
{
token=accidence(infile,irow,1);
if(!Factor(&place,factor))
{
return false;
}
if(!Term(&place,term))
{
return false;
}
if(GetType(*iPlace)!=GetType(place))
{
WriteError("类型不匹配",token.iPosition);
}
if(GetType(*iPlace)>GetType(place))
{
temp=Insert(GetType(*iPlace),2);
}
else
{
temp=Insert(GetType(place),2);
}
sprintf(buffer,"%s%s%d = %d %c %d\r\n",factor,term,temp,*iPlace,(char)token.dProperty,place);
iCodeLine++;
if(!SimpleExpression1(&temp,se))
{
return false;
}
*iPlace=temp;
strcat(buffer,se);
}
return true;
}
//记录错误,参数为错误信息,出错行号
void WriteError(char* strErr,int iLine)
{
FILE *pFile;
char buffer[1024]={0};
pFile=fopen("Error.txt","a"); //打开文件
if(pFile==NULL)
{
return;
}
//写入错误记录文件
if(!strcmp(strErr,"编译成功"))
{
sprintf(buffer,"----%s\r\n",strErr);
}
else
{
sprintf(buffer,"----Error at Line%d:%s\r\n",iLine,strErr);
}
fwrite(buffer,1,strlen(buffer),pFile);
fclose(pFile);
}
void WriteCode(char *cCode) //写入三地址代码
{
FILE *pFile;
pFile=fopen("Code.txt","a");
if(pFile==NULL)
{
return;
}
fwrite(cCode,1,strlen(cCode),pFile);
fclose(pFile);
}
//查找关键字
char KeyWordSearch(char* ca)
{
for(int i=0;i<23;i++)
{
int ret=strcmp(ca,key_table[i].cName);//判断ca是否为保留字
if(ret==0)
return key_table[i].cReturnName;//ca是保留字,返回保留字缩写字符
}
return '0';//ca不是保留字
}
//清除注释
int Clearzhushi(ifstream &infile)
{
char ca;
int i=1;
while(i!=0)
{
if(!infile.eof())
infile.read(&ca,1);
else
return 0;
if(ca=='{')
i++;
else if(ca=='}')
i--;
}
return 1;
}
//词法分析,infile为文件流,irow为当前行号,flag为标志(判断文件流指针是否前进)
TOKEN accidence(ifstream &infile,int &irow,int flag)
{
char ca;
TOKEN token;
streampos spos=infile.tellg();
int ih=irow;
token.iPosition=irow;
while(!infile.eof())
{
infile.read(&ca,1);
if(ca==' '||ca==9||ca==13)//读到' ',tab,\r
continue;
else if(ca=='\n')//读到\n
{
irow++;
token.iPosition=irow;
}
else if((48<=ca)&&(ca<=57))//读到常数
{
int i=0;
float f=0;
bool b=true;
while(1)
{
i=i*10+ca-48;
ca=infile.peek();
while(ca=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
ca=infile.peek();
}
if((48<=ca)&&(ca<=57))
infile.read(&ca,1);
else if(ca=='.')
{
infile.read(&ca,1);
ca=infile.peek();
if(ca=='.')
{
infile.putback(ca);
break;
}
else if((48<=ca)&&(ca<=57))
{
infile.read(&ca,1);
float fi=1;
while(1)
{
fi/=10;
f+=(ca-48)*fi;
ca=infile.peek();
while(ca=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
ca=infile.peek();
}
if((48<=ca)&&(ca<=57))
infile.read(&ca,1);
else
break;
}
break;
}
else
break;
}
else
break;
}
token.iType=5;
token.dProperty=i+f;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if((65<=ca)&&(ca<=90)||(97<=ca)&&(ca<=122))//读到标识符,及关键字
{
char cid[leng];
int i=0;
while(1)
{
cid[i++]=ca;
ca=infile.peek();
while(ca=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
ca=infile.peek();
}
if((65<=ca)&&(ca<=90)||(97<=ca)&&(ca<=122)||(48<=ca)&&(ca<=57))
infile.read(&ca,1);
else
break;
}
cid[i]=0;
char cb=KeyWordSearch(cid);
if(cb=='0')//读到标识符
{
token.iType=1;
token.dProperty=table.insert(cid);
//cout<<cid<<" "<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(cb=='|')//读到or
{
token.iType=3;
token.dProperty=cb;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(cb=='g'||cb=='m'||cb=='&')//读到div,mod,and
{
token.iType=4;
token.dProperty=cb;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else//读到其他关键字
{
token.iType=0;
token.dProperty=cb;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.clear();
infile.seekg(spos);
irow=ih;
}
return token;
}
}
else if(ca=='+'||ca=='-')//读到+,-
{
token.iType=3;
token.dProperty=ca;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='*'||ca=='/')//读到*,/
{
token.iType=4;
token.dProperty=ca;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca==';'||ca=='('||ca==')'||ca=='['||ca==']'||ca==',')//读到;,(,),[,]及,
{
token.iType=0;
token.dProperty=ca;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='.')//读到..
{
char cb=infile.peek();
while(cb=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
cb=infile.peek();
}
if(cb=='.')
{
infile.read(&ca,1);
token.iType=0;
token.dProperty=cb;
}
else
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='<')//读到<,<=,<>
{
token.iType=6;
char cb=infile.peek();
while(cb=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
cb=infile.peek();
}
if(cb=='='||cb=='>')
{
infile.read(&ca,1);
if(cb=='=')
token.dProperty='L';
else
token.dProperty='X';
}
else
token.dProperty=ca;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='>')//读到>,>=
{
token.iType=6;
char cb=infile.peek();
while(cb=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
cb=infile.peek();
}
if(cb=='=')
{
infile.read(&ca,1);
token.dProperty='G';
}
else
token.dProperty=ca;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='=')//读到=
{
token.iType=6;
token.dProperty='E';
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca==':')//读到:=
{
char cb=infile.peek();
while(cb=='{')
{
infile.read(&ca,1);
if(!Clearzhushi(infile))
{
token.iType=-1;
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
cb=infile.peek();
}
if(cb=='=')
{
infile.read(&ca,1);
token.iType=2;
}
else
{
token.iType=0;
token.dProperty=ca;
}
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
else if(ca=='{')//读到{
{
if(!Clearzhushi(infile))
{
token.iType=-1;
return token;
}
}
else
{
token.iType=-1;
//cout<<token.iType<<" "<<token.dProperty<<" "<<token.iPosition<<'\n';
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
}
if(!flag)
{
infile.seekg(spos);
irow=ih;
}
return token;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -