📄 编译原理试验2.cpp
字号:
{
output[outputrec].output1.assign(suanfu);
output[outputrec].output2.assign(de[rec-3]);
output[outputrec].output3.assign(de[rec-1]);
output[outputrec].output4="T";
output[outputrec].Tnum4=Trec;
NTrec[rec-3]=Trec;
outputrec++;
Trec++;
}
else if(NTrec[rec-1]<0&&NTrec[rec-3]>=0)
{
output[outputrec].output1.assign(suanfu);
output[outputrec].output2="T";
output[outputrec].output3.assign(de[rec-1]);
output[outputrec].output4="T";
output[outputrec].Tnum2=NTrec[rec-3];
output[outputrec].Tnum4=Trec;
NTrec[rec-3]=Trec;
outputrec++;
Trec++;
}
else if(NTrec[rec-1]>=0&&NTrec[rec-3]<0)
{
output[outputrec].output1.assign(suanfu);
output[outputrec].output2.assign(de[rec-3]);
output[outputrec].output3="T";
output[outputrec].output4="T";
output[outputrec].Tnum3=NTrec[rec-1];
output[outputrec].Tnum4=Trec;
NTrec[rec-3]=Trec;
outputrec++;
Trec++;
NTrec[rec-1]=-1;
}
else if(NTrec[rec-1]>=0&&NTrec[rec-3]>=0)
{
output[outputrec].output1.assign(suanfu);
output[outputrec].output2="T";
output[outputrec].output3="T";
output[outputrec].output4="T";
output[outputrec].Tnum2=NTrec[rec-3];
output[outputrec].Tnum3=NTrec[rec-1];
output[outputrec].Tnum4=Trec;
NTrec[rec-3]=Trec;
outputrec++;
Trec++;
NTrec[rec-1]=-1;
}
st[rec-3]='N';
rec=rec-2;
}
else
{
outputerror(14,"",temp);
return 0;
}
i--;
}//relation==1
else
{
outputerror(14,"",temp);
return 0;
}
}//else -开头
}//for
st[rec]='\0';
single="";
if(strcmp(st,"#N#")==0)
{
if(NTrec[1]==-1)
single.assign(de[1]);
return 1;
}
else
{
outputerror(14,"",temp);
return 0;
}
}
int chartoint2(char a)
{
if(a=='o')return 0;
if(a=='a')return 1;
if(a=='n')return 2;
if(a=='d')return 3;
if(a=='f')return 4;
if(a=='g')return 5;
if(a=='(')return 6;
if(a==')')return 7;
if(a=='#') return 8;
else return -1;
}
int boolexpression(char * str)//布尔表达式是否合法判断
{
int relation2[9][9]={{1,-1,-1,-1,-1,-1,-1,1,1},{1,1,-1,-1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,-1,-1,1,1},{1,1,2,2,2,2,2,1,1},{1,1,2,2,2,2,2,1,1},{1,1,2,2,2,2,2,1,1},
{-1,-1,-1,-1,-1,-1,-1,0,2}, {1,1,2,2,2,2,2,1,1},{-1,-1,-1,-1,-1,-1,-1,2,0}};
//数组的意义与numberexpression函数相同
bnode bexp[10];//存关系表达式
int bexprec=0;
int i,j,k,m=0,n;
int fgf[8][2];
for(i=0;str[i]!='\0';)
{
if(str[i]==':'||str[i]=='['||str[i]==']'||str[i]=='.'
||str[i]==';'||str[i]=='\''||str[i]==',')//布尔表达式中非法字符
{
outputerror(15,"","");
return 0;
}
if(str[i]=='<'||str[i]=='>'||str[i]=='=')//遇到关系符时
{
k=0;
n=0;
for(j=i;j>=0;j--)
{
if(str[j]==')')k++;//考虑括号个数
if(str[j]=='(')n++;
if(str[j-2]=='a'&&str[j-1]=='n'&&str[j]=='d'
||str[j-2]=='n'&&str[j-1]=='o'&&str[j]=='t'
||str[j-1]=='o'&&str[j]=='r')break;
}
if(k==n)fgf[m][0]=j+1;
else
{
j++;
for(int temp=0;temp<abs(k-n);temp++)
{
for(;str[j]!='(';j++)////////////////////
if(str[j]!=' ')
{
outputerror(13,"","");
return 0;
}
j++;
}
fgf[m][0]=j;
}
n=0;
k=0;
for(j=i;str[j]!='\0';j++)
{
if(str[j]=='(')k++;//考虑括号个数
if(str[j]==')')n++;
if(str[j]=='a'&&str[j+1]=='n'&&str[j+2]=='d'
||str[j]=='n'&&str[j+1]=='o'&&str[j+2]=='t'
||str[j]=='o'&&str[j+1]=='r')break;
}
if(k==n)fgf[m][1]=j-1;
else
{
j--;
for(int temp=0;temp<abs(k-n);temp++)
{
for(;str[j]!=')';j--)
if(str[j]!=' ')
{
outputerror(13,"","");
return 0;
}
j--;
}
fgf[m][1]=j;
}
for(k=0,j=fgf[m][0];j<i;j++,k++)bexp[m].first[k]=str[j];
bexp[m].first[k]='\0';//记录关系符前面的表达式
if(str[i]=='<'&&(str[i+1]=='>'||str[i+1]=='=')
||str[i]=='>'&&str[i+1]=='=')
{
bexp[m].fu[0]='j';
bexp[m].fu[1]=str[i];
bexp[m].fu[2]=str[i+1];//记录算符
bexp[m].fu[3]='\0';
for(k=0,j=i+2;j<=fgf[m][1];j++,k++)bexp[m].second[k]=str[j];
bexp[m].second[k]='\0';//记录关系符后面的表达式
}
else if(str[i]=='<'||str[i]=='>'||str[i]=='=')
{
bexp[m].fu[0]='j';
bexp[m].fu[1]=str[i];
bexp[m].fu[2]='\0';//记录算符
for(k=0,j=i+1;j<=fgf[m][1];j++,k++)bexp[m].second[k]=str[j];
bexp[m].second[k]='\0';
}
i=fgf[m][1];
m++;
}
i++;
}//遇到关系符时
char btemp[20];
bexprec=m-1;
m=0;
char bstack[50];
int bstackrec=0;
string bsfu[15];//存标识符
int bsfurec=0;
string constbool[8];
int constboolrec=0;
for(i=0;str[i]!='\0';)
{
if(i==fgf[m][0])
{
bstack[bstackrec]='f';
bstackrec++;
i=fgf[m][1]+1;
m++;
continue;
}
for(;str[i]==' '&&str[i]!='\0';i++);
if(str[i]=='('||str[i]==')')
{
bstack[bstackrec]=str[i];
bstackrec++;
i++;
}
else if(str[i]!='\0')
{
for(j=0;!(str[i]==' '||str[i]=='('||str[i]==')')&&str[i]!='\0';j++,i++)btemp[j]=str[i];
btemp[j]='\0';
if(strcmp(btemp,"true")==0||strcmp(btemp,"false")==0)
{
constbool[constboolrec].assign(btemp);
constboolrec++;
bstack[bstackrec]='d';
bstackrec++;
}
else if(strcmp(btemp,"or")==0)
{
bstack[bstackrec]='o';
bstackrec++;
}
else if(strcmp(btemp,"and")==0)
{
bstack[bstackrec]='a';
bstackrec++;
}
else if(strcmp(btemp,"not")==0)
{
bstack[bstackrec]='n';
bstackrec++;
}
else
{
for(j=0;strcmp(btemp,record[j].content)!=0&&j<=record1;j++);//j<=record可以删去
if(j==record1)
{
cout<<"标识符错误。位置:第"<<row<<"行。\n";
return 0;
}
if(record[j].define==0)
{
cout<<"布尔表达式错误,标识符没有定义。位置第"<<row<<"行。\n";
return 0;
}
else if(record[j].type!=1)
{
cout<<"布尔表达式错误,单个标识符类型不是布尔型。位置第"<<row<<"行。\n";
return 0;
}
else
{
bsfu[bsfurec].assign(btemp);
bsfurec++;
bstack[bstackrec]='g';
bstackrec++;
}
}
}//else
}//for
bstack[bstackrec]='#';
bstack[bstackrec+1]='\0';
for(i=0;i<6;i++)
{
bexit[i].truesum=0;
bexit[i].falsesum=0;
bexit[i].allsum=0;
}
int bexitrec[20]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
bsfurec=0;//标记bsfu数组
bexprec=0;//标记bexp数组
constboolrec=0;//标记constbool数组
char Nrec[20];//记录归约时的N
int Nnum=1;
Nrec[0]='#';
pbexit=0;
for(i=0;bstack[i]!='\0';i++)
{
if(Nrec[Nnum-1]=='N')j=relation2[chartoint2(Nrec[Nnum-2])][chartoint2(bstack[i])];
else j=relation2[chartoint2(Nrec[Nnum-1])][chartoint2(bstack[i])];
if(j==-1)//移进
{
Nrec[Nnum]=bstack[i];
Nnum++;
}
else if(j==0)//归约
{
if(Nrec[Nnum-1]!='N')
{
outputerror(13,"","");
return 0;
}
else if(Nrec[Nnum-2]=='(')
{
bexitrec[Nnum-2]=bexitrec[Nnum-1];
bexitrec[Nnum-1]=-1;
Nrec[Nnum-2]='N';
Nnum=Nnum-1;
}
else
{
Nrec[Nnum]=bstack[i];
Nnum++;
}
}//j==0
else if(j==1)
{
if(Nrec[Nnum-1]=='g')
{
Nrec[Nnum-1]='N';
gguiyue(bsfurec,bexitrec[Nnum-1], pbexit,bexit,bsfu);//布尔表达式中归约g函数
}
else if(Nrec[Nnum-1]=='f')
{
Nrec[Nnum-1]='N';
fguiyue(bexprec,bexitrec[Nnum-1], pbexit,bexit,bexp);//布尔表达式中归约f函数
}
else if(Nrec[Nnum-1]=='d')//分析true or false 情况
{
Nrec[Nnum-1]='N';
bexit[pbexit].entry=outputrec;
if(constbool[constboolrec].compare("true")==0)
{
output[outputrec].output1="j-true";
bexit[pbexit].truesum=1;
bexit[pbexit].trueexit[0]=outputrec;
bexit[pbexit].falsesum=0;
}
else
{
output[outputrec].output1="j-false";
bexit[pbexit].falsesum=1;
bexit[pbexit].falseexit[0]=outputrec;
bexit[pbexit].truesum=0;
}
output[outputrec].output2="-";
output[outputrec].output3="-";
output[outputrec].output4="j";
outputrec++;
constboolrec++;
bexitrec[Nnum-1]=pbexit;
pbexit++;
}
else if((Nrec[Nnum-3]=='N'&&Nrec[Nnum-2]=='o'||
Nrec[Nnum-3]=='N'&&Nrec[Nnum-2]=='a'||
Nrec[Nnum-2]=='n')&&Nrec[Nnum-1]=='N')
{
if(Nrec[Nnum-2]=='n')//归约nN
{//交换真假出口
int ntemp;
ntemp=bexit[bexitrec[Nnum-1]].falsesum;
bexit[bexitrec[Nnum-1]].falsesum=bexit[bexitrec[Nnum-1]].truesum;
bexit[bexitrec[Nnum-1]].truesum=ntemp;
for(int i=0;i<bexit[bexitrec[Nnum-1]].falsesum||i<bexit[bexitrec[Nnum-1]].truesum;i++)
{
ntemp=bexit[bexitrec[Nnum-1]].falseexit[i];
bexit[bexitrec[Nnum-1]].falseexit[i]=bexit[bexitrec[Nnum-1]].trueexit[i];
bexit[bexitrec[Nnum-1]].trueexit[i]=ntemp;
}
bexitrec[Nnum-2]=bexitrec[Nnum-1];
bexitrec[Nnum-1]=-1;
Nrec[Nnum-2]='N';
Nnum--;
}//归约nN
else//当NoN,NaN
{
if(Nrec[Nnum-2]=='o')//归约NoN
{
int i,k;
if(bexit[bexitrec[Nnum-3]].falsesum==0)
{//当第一个N中是布尔常量且常量为真时
outputrec-=bexit[bexitrec[Nnum-1]].allsum;
}
else
{
for(i=0;i<bexit[bexitrec[Nnum-3]].falsesum;i++)//回填假出口
output[bexit[bexitrec[Nnum-3]].falseexit[i]].Tnum4=bexit[bexitrec[Nnum-1]].entry;
for(k=0, i=bexit[bexitrec[Nnum-3]].truesum;k<bexit[bexitrec[Nnum-1]].truesum;i++,k++)
{//合并真出口
bexit[bexitrec[Nnum-3]].trueexit[i]=bexit[bexitrec[Nnum-1]].trueexit[k];
}
bexit[bexitrec[Nnum-3]].truesum+=bexit[bexitrec[Nnum-1]].truesum;
for(k=0;k<bexit[bexitrec[Nnum-1]].falsesum;k++)
{//覆盖假出口
bexit[bexitrec[Nnum-3]].falseexit[k]=bexit[bexitrec[Nnum-1]].falseexit[k];
}
bexit[bexitrec[Nnum-3]].falsesum=bexit[bexitrec[Nnum-1]].falsesum;
bexit[bexitrec[Nnum-3]].allsum+=bexit[bexitrec[Nnum-1]].allsum;
}
bexitrec[Nnum-1]=-1;
pbexit--;//bexitrec[Nnum-1]对应的bexit结点可以删除
Nnum-=2;
}
else//归约NaN
{
int i,k;
if(bexit[bexitrec[Nnum-3]].truesum==0)
{//当第一个N中是布尔常量且常量为假时
outputrec-=bexit[bexitrec[Nnum-1]].allsum;
}
else
{
for(i=0;i<bexit[bexitrec[Nnum-3]].truesum;i++)//回填真出口
output[bexit[bexitrec[Nnum-3]].trueexit[i]].Tnum4=bexit[bexitrec[Nnum-1]].entry;
for(k=0, i=bexit[bexitrec[Nnum-3]].falsesum;k<bexit[bexitrec[Nnum-1]].falsesum;i++,k++)
{//合并假出口
bexit[bexitrec[Nnum-3]].falseexit[i]=bexit[bexitrec[Nnum-1]].falseexit[k];
}
bexit[bexitrec[Nnum-3]].falsesum+=bexit[bexitrec[Nnum-1]].falsesum;
for(k=0;k<bexit[bexitrec[Nnum-1]].truesum;k++)//覆盖真出口
{
bexit[bexitrec[Nnum-3]].trueexit[k]=bexit[bexitrec[Nnum-1]].trueexit[k];
}
bexit[bexitrec[Nnum-3]].truesum=bexit[bexitrec[Nnum-1]].truesum;
bexit[bexitrec[Nnum-3]].allsum+=bexit[bexitrec[Nnum-1]].allsum;
}
bexitrec[Nnum-1]=-1;
pbexit--;//bexitrec[Nnum-1]对应的bexit结点可以删除
Nnum-=2;
}
}//归约NoN,NaN
}//归约nN NaN NoN
else
{
outputerror(16,"","");
return 0;
}
i--;//归约时因为没有移入,所以i--,让i指针停止
}//j==1
else
{
outputerror(13,"","");
return 0;
}
}//算符优先分析
Nrec[Nnum]='\0';
if(strcmp(Nrec,"#N#")==0)return 1;//#N#时,成功匹配
else
{
outputerror(13,"","");
return 0;
}
}
void gguiyue(int& a,int &c,int & pbexit,bexitnode bexit[],
string bsfu[])//布尔表达式中归约g函数
{
bexit[pbexit].entry=outputrec;
output[outputrec].output1="j=";
output[outputrec].output2.assign(bsfu[a]);
output[outputrec].output3="true";
output[outputrec].output4="j";
outputrec++;
output[outputrec].output1="j";
output[outputrec].output2="-";
output[outputrec].output3="-";
output[outputrec].output4="j";
outputrec++;
bexit[pbexit].truesum=1;
bexit[pbexit].trueexit[0]=outputrec-2;
bexit[pbexit].falsesum=1;
bexit[pbexit].falseexit[0]=outputrec-1;
bexit[pbexit].allsum=2;
c=pbexit;
pbexit++;
a++;
}
void fguiyue(int & b,int &c,int & pbexit,bexitnode bexit[],
bnode bexp[])//布尔表达式中归约f函数
{
string ftemp;
int fnum=0;
bexit[pbexit].entry=outputrec;
numberexpression(bexp[b].first);
ftemp.assign(single);//记录single的值
fnum=output[outputrec-1].Tnum4;//记录最后T值
numberexpression(bexp[b].second);
if(single.compare("")!=0)
{
output[outputrec].output3.assign(single);
}
else
{
output[outputrec].output3="T";
output[outputrec].Tnum3=output[outputrec-1].Tnum4;
}
output[outputrec].output1.assign(bexp[b].fu);
output[outputrec].output4="j";
if(ftemp.compare("")!=0)
{
output[outputrec].output2.assign(ftemp);
}
else
{
output[outputrec].output2="T";
output[outputrec].Tnum2=fnum;
}
outputrec++;
output[outputrec].output1="j";
output[outputrec].output2="-";
output[outputrec].output3="-";
output[outputrec].output4="j";
outputrec++;
bexit[pbexit].truesum=1;
bexit[pbexit].trueexit[0]=outputrec-2;
bexit[pbexit].falsesum=1;
bexit[pbexit].falseexit[0]=outputrec-1;
bexit[pbexit].allsum=outputrec-bexit[pbexit].entry;
c=pbexit;
pbexit++;
b++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -