📄 fifoexedlg.cpp
字号:
row = isin(StrGen[i][0],VN);
col = isin(FL_Stack[top].vt,VT);// 第一个终结符所在数组的列数
first[row][col] = '1';
FL_Stack[top].vn = StrGen[i][0];//存入堆栈
//FL_Stack[top].vt = StrGen[i][3];
top++;
}
}//end of while top
}
/***************************************************************************/
/* 求LastVT表格中的内容 */
/***************************************************************************/
void Creat_LastVT_Table(char first[][100],char StrGen[][20], int num_Gen, char VN[],char VT[])
{
int num_VN,num_VT;
int i,SourcePointer,SourceLen;
// int j,k;
int templength;
// int tempch;
struct stack {
char vn;
char vt;
}FL_Stack[100];//定义操作使用的堆栈
int top=0;//栈顶指针
int row, col; //firstVT数组中的行列位置
num_VN = strlen(VN);/*求出VN的长度,即非终结符的个数*/
num_VT = strlen(VT);/*求出VT的长度,即终结符的个数*/
for( row=0; row<num_VN+1; row++) //初始化
for(int col=0; col < num_VT+1; col++)
first[row][col]=' ';
for( row=0;row<num_VN+1;row++) //初始化行头
first[row+1][0]=VN[row];
for(col=0;col < num_VT;col++) //初始化列头
first[0][col+1]=VT[col];
for( i= 0; i<num_Gen;i++) //用产生式对数组进行初始化
{
SourcePointer =0;
SourceLen =strlen(StrGen[i]);//当前产生式
row = isin(StrGen[i][0],VN); // 第一个非终结符所在数组的行数
col = isin(StrGen[i][SourceLen-1],VT);// 第一个终结符所在数组的列数
if ( col > 0 )//P->...a
{
FL_Stack[top].vn = StrGen[i][0];//存入堆栈
FL_Stack[top].vt = StrGen[i][SourceLen-1];
top++;
first[row][col] = '1';
}
else if(isin(StrGen[i][SourceLen-1],VN) && isin(StrGen[i][SourceLen-2],VT))//P->...aQ
{
FL_Stack[top].vn = StrGen[i][0];//存入堆栈
FL_Stack[top].vt = StrGen[i][SourceLen-2];
top++;
col = isin(StrGen[i][4],VT);
first[row][col] = '1';
}
}//end of for i*/
while(top >0) //从堆栈中弹出修改数组
{
top--;
for( i= 0; i<num_Gen;i++)
{
templength=strlen(StrGen[i]);
if ( (StrGen[i][templength-1] == FL_Stack[top].vn) && (StrGen[i][0] != FL_Stack[top].vn))
{//P->...Q且不是Q->...Q
row = isin(StrGen[i][0],VN);
col = isin(FL_Stack[top].vt,VT);// 第一个终结符所在数组的列数
first[row][col] = '1';
FL_Stack[top].vn = StrGen[i][0];//存入堆栈
//FL_Stack[top].vt = StrGen[i][3];
top++;
}
}
}//end of while top
}
/***************************************************************************/
/* 求LR表格中的内容 */
/***************************************************************************/
void Creat_LR_Table(char first[][100],char StrGen[][20], int num_Gen, char VN[],char VT[])
{
int num_VN,num_VT;
int i,SourcePointer,SourceLen;
int j;
int row, col; //firstVT数组中的行列位置
num_VN = strlen(VN);/*求出VN的长度,即非终结符的个数*/
num_VT = strlen(VT);/*求出VT的长度,即终结符的个数*/
for( row=0; row<num_VN+1; row++) //初始化
for(int col=0; col < num_VT+1; col++)
first[row][col]=' ';
for( row=0;row<num_VT+1;row++) //初始化行头
first[row+1][0]=VT[row];
for(col=0;col < num_VT;col++) //初始化列头
first[0][col+1]=VT[col];
for( i= 0; i<num_Gen;i++)
{
SourcePointer =0;
SourceLen =strlen(StrGen[i]);
for(j=0;j<SourceLen-5;j++)//P->...aQb...
{
row = isin(StrGen[i][j+3],VT);
col = isin(StrGen[i][j+5],VT);
if ( col > 0&&row>0 && isin(StrGen[i][j+4],VN)>0)
{
first[row][col] ='=';
}
}
for(j=0;j<SourceLen-4;j++)//P->...ab...
{
row = isin(StrGen[i][j+3],VT);
col = isin(StrGen[i][j+4],VT);
if ( col > 0&&row>0)
{
first[row][col] ='=';
}
}
for(j=0;j<SourceLen-4;j++)//P->...aQ...
{
row = isin(StrGen[i][j+3],VT);
col = isin(StrGen[i][j+4],VN);
if ( col > 0&&row>0 )
{
for(int k=0;k<100;k++)
{
if(firstvt[col][k]=='1'&&j>=0)
first[row][k]='<';
}
}
}
for(j=0;j<SourceLen-4;j++)//P->...Qa...
{
row = isin(StrGen[i][j+3],VN);
col = isin(StrGen[i][j+4],VT);
if ( col > 0&&row>0 )
{
for(int k=0;k<100;k++)
{
if(lastvt[row][k]=='1'&&j>=0)
first[k][col]='>';
}
}
}
}
}
/***************************************************************************/
/* 设置FIRSTVT表格显示 */
/***************************************************************************/
void CFifoexeDlg::Display_Table_Fill(char first[][100],int num_VN,int num_VT)
{
int i,j;
char TmpStr[2];
m_ListTable.DeleteAllItems();
for(i=0;i<10;i++)
m_ListTable.DeleteColumn(i);
for (i=0; i <= num_VT; i++)
{
m_ListTable.DeleteColumn(0);
}
for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
{
TmpStr[0] = first[0][i];
TmpStr[1] ='\0';
m_ListTable.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
}
for(i =0; i< num_VN+1; i++) // 设置列表控件的行头
{
TmpStr[0] = first[i][0];
TmpStr[1] ='\0';
m_ListTable.InsertItem(i,TmpStr);
for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
{
TmpStr[0] = first[i+1][j];
TmpStr[1] ='\0';
m_ListTable.SetItemText(i,j,TmpStr);
}
}
}
/***************************************************************************/
/* 设置LASTVT表格显示 */
/***************************************************************************/
void CFifoexeDlg::Display_TableLastVT_Fill(char first[][100],int num_VN,int num_VT)
{
int i,j;
char TmpStr[2];
m_ListTableLastVT.DeleteAllItems();
for(i=0;i<10;i++)
m_ListTableLastVT.DeleteColumn(i);
for (i=0; i <= num_VT; i++)
{
m_ListTableLastVT.DeleteColumn(0);
}
for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
{
TmpStr[0] = first[0][i];
TmpStr[1] ='\0';
m_ListTableLastVT.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
}
for(i =0; i< num_VN+1; i++) // 设置列表控件的行头
{
TmpStr[0] = first[i][0];
TmpStr[1] ='\0';
m_ListTableLastVT.InsertItem(i,TmpStr);
for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
{
TmpStr[0] = first[i+1][j];
TmpStr[1] ='\0';
m_ListTableLastVT.SetItemText(i,j,TmpStr);
}
}
}
/***************************************************************************/
/* 设置LR表格显示 */
/***************************************************************************/
void CFifoexeDlg::Display_TableLR_Fill(char first[][100],int num_VT1,int num_VT)
{
int i,j;
char TmpStr[2];
m_ListTableLR.DeleteAllItems();
for(i=0;i<10;i++)
m_ListTableLR.DeleteColumn(i);
for (i=0; i <= num_VT; i++)
{
m_ListTableLR.DeleteColumn(0);
}
for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
{
TmpStr[0] = first[0][i];
TmpStr[1] ='\0';
m_ListTableLR.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
}
for(i =0; i< num_VT1+1; i++) // 设置列表控件的行头
{
TmpStr[0] = first[i][0];
TmpStr[1] ='\0';
m_ListTableLR.InsertItem(i,TmpStr);
for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
{
TmpStr[0] = first[i+1][j];
TmpStr[1] ='\0';
m_ListTableLR.SetItemText(i,j,TmpStr);
}
}
}
void CFifoexeDlg::OnButtonFirst()
{
// TODO: Add your control notification handler code here
bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
char StrGen[10][20];//存放产生式的数组
int num_Gen=0; //产生式个数
char VN[10];//存放全部非终结符的数组
char VT[10];//存放全部终结符的数组
char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );
flagfirstvt=1;
UpdateData(true) ; //将控件内容取到变量中
if( m_Source.IsEmpty())
{
MessageBox("还没有输入产生式,请输入产生式!");
return;
}
m_Source = Pre_Process(m_Source); // 对产生式的预处理
num_Gen = Generator(m_Source,StrGen);//生成产生式数组
VN[0]='\0';
VT[0]='\0';
VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符
Creat_FirstVT_Table(first, StrGen, num_Gen, VN, VT);//计算FirstVT表格的内容
Display_Table_Fill(first,strlen(VN), strlen(VT) );//在屏幕上显示FirstVT表格的内容
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
firstvt[i][j]=first[i][j];
UpdateData(false) ;
}
void CFifoexeDlg::OnButtonFollow()
{
// TODO: Add your control notification handler code here
bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
char StrGen[10][20];//存放产生式的数组
int num_Gen=0; //产生式个数
char VN[10];//存放全部非终结符的数组
char VT[10];//存放全部终结符的数组
char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );
flaglastvt=1;
UpdateData(true) ; //将控件内容取到变量中
if( m_Source.IsEmpty())
{
MessageBox("还没有输入产生式,请输入产生式!");
return;
}
m_Source = Pre_Process(m_Source); // 对产生式的预处理
num_Gen = Generator(m_Source,StrGen);//生成产生式数组
VN[0]='\0';
VT[0]='\0';
VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符
Creat_LastVT_Table(first, StrGen, num_Gen, VN, VT);//计算lastVT表格的内容
Display_TableLastVT_Fill(first,strlen(VN), strlen(VT) );//在屏幕上显示FirstVT表格的内容
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
lastvt[i][j]=first[i][j];
UpdateData(false) ;
}
void CFifoexeDlg::OnLR()
{
// TODO: Add your control notification handler code here
bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
char StrGen[10][20];//存放产生式的数组
int num_Gen=0; //产生式个数
char VN[10];//存放全部非终结符的数组
char VT[10];//存放全部终结符的数组
char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );
char tch;
flaglr=1;
UpdateData(true) ; //将控件内容取到变量中
if( m_Source.IsEmpty())
{
MessageBox("还没有输入产生式,请输入产生式!");
return;
}
if(flagfirstvt==0)
{
MessageBox("请先求Firstvt集!");
return;
}
if(flaglastvt==0)
{
MessageBox("请先求Lastvt集!");
return;
}
m_Source = Pre_Process(m_Source); // 对产生式的预处理
num_Gen = Generator(m_Source,StrGen);//生成产生式数组
tch=StrGen[0][0];
StrGen[num_Gen][0]='S';
StrGen[num_Gen][1]='-';
StrGen[num_Gen][2]='>';
StrGen[num_Gen][3]='#';
StrGen[num_Gen][4]=tch;
StrGen[num_Gen][5]='#';
StrGen[num_Gen][6]='\0';
num_Gen++;
VN[0]='\0';
VT[0]='\0';
VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符
// MessageBox(StrGen[num_Gen-1]);
Creat_LR_Table(first, StrGen, num_Gen, VN, VT);//计算LR表格的内容
Display_TableLR_Fill(first,strlen(VT), strlen(VT) );//在屏幕上显示First表格的内容
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
lr[i][j]=first[i][j];
UpdateData(false) ;
}
void CFifoexeDlg::OnBUTTONAnalyse()
{
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -