?? unit1.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include"stack.h"
#include"publicfunction.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetTnum=0;
SetNnum=0;
int N=0;
int K=0;
X=30;
Y=30;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBoxEx1Change(TObject *Sender)
{
if(ComboBoxEx1->ItemIndex==0)
{
Memo1->Enabled=false;
ComboBoxEx2->Enabled=true;
BitBtn1->Enabled=true;
}
if(ComboBoxEx1->ItemIndex==1)
{
Memo1->Enabled=true;
ComboBoxEx2->Enabled=false;
BitBtn1->Enabled=true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBoxEx2Change(TObject *Sender)
{
if(ComboBoxEx2->ItemIndex==0)
{ Memo1->Clear();
Memo1->Lines->Add("E->E*n");
Memo1->Lines->Add("E->n");
}
if(ComboBoxEx2->ItemIndex==1)
{
Memo1->Clear();
Memo1->Lines->Add("P->bPb");
Memo1->Lines->Add("P->cPc");
Memo1->Lines->Add("P->d");
}
if(ComboBoxEx2->ItemIndex==2)
{
Memo1->Clear();
Memo1->Lines->Add("E->E+T");
Memo1->Lines->Add("E->E");
Memo1->Lines->Add("T->T*F");
Memo1->Lines->Add("T->F");
Memo1->Lines->Add("F->(E)");
Memo1->Lines->Add("F->i");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
ListBox1->Clear();
SLRGrid->Visible=false;
DFA();
Button1->Enabled=true;
BitBtn1->Enabled=false;
}
//---------------------------------------------------------------------------'
//---------------------------------------------------------------------------
void TForm1::DrawDFA(int start, int end, char token, TImage * image)
{
//TODO: Add your source code here
int x2=X+80,y2=Y;
image->Canvas->Ellipse(X-15,Y-15,X+15,Y+15);
image->Canvas->TextOutA(X-5,Y-5,IntToStr(start));
image->Canvas->MoveTo(X+15,Y);
image->Canvas->LineTo(x2-15,Y);
image->Canvas->MoveTo(x2-15-5,Y-5);
image->Canvas->LineTo(x2-15,Y);
image->Canvas->LineTo(x2-15-5,Y+6);
image->Canvas->Ellipse(x2-15,y2-15,x2+15,y2+15);
image->Canvas->TextOutA(x2-5,y2-5,IntToStr(end));
image->Canvas->TextOutA(X/2+x2/2-5,Y-15-5,token);
X=X+150;
if(X+100>457){X=30;Y=Y+50;}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SLRGrid->Visible=true;
Image1->Visible=false;
for( int i=0;i<100;i++)//初始化表
{
token[i]='\0';
for(int j=0;j<100;j++)
{
table[i][j]=-1;
}
}
//token中保存所有的終結符和非終結符
int i=0;
while(SetT[i]!='\0')
{
token[i]=SetT[i];
i++;
}
token[i++]='$';
int j=1;//不要文法的開始符號
while(SetN[j]!='\0')
{
token[i]=SetN[j];
i++;
j++;
}
for(int i=0;i<=N;i++)
{
SLRGrid->Cells[0][i+1]=IntToStr(i);
SLRGrid->RowCount++;
}
i=0;
j=1;
while(token[i]!='\0')
{
SLRGrid->Cells[j][0]=token[i];
SLRGrid->ColCount++;
i++;
j++;
}
i=0;
while(i<=N)
{
for(int j=0;j<=N;j++)//處理TAB表
{
if(TAB[i][j]!='#')
{
int t=0;
while(token[t]!=TAB[i][j])
t++;
if(TAB[i][j]>=65&&TAB[i][j]<=90)
{
table[i][t]=j;
SLRGrid->Cells[t+1][i+1]=IntToStr(j);
}
else
{
table[i][t]=10000+j;
SLRGrid->Cells[t+1][i+1]="S"+IntToStr(j);
}
}
}
int j=0;//處理DA表
while(DA[i][j]!=-1)
{
int x=DA[i][j];
int y=DA[i][j+1];
if(P[x][y]=='\0'||P[x][y]=='@')
{
int fo=0;//找到follow集合
while(P[x][0]!=follow[fo][0])
fo++;
int m=1;
while(follow[fo][m]!='\0')
{
int n=0;
while(follow[fo][m]!=token[n])
n++;
table[i][n]=20000+x;
SLRGrid->Cells[n+1][i+1]=SLRGrid->Cells[n+1][i+1]+"r("+P[x][0]+"->";
int v=1;
while(P[x][v]!='\0')
{
SLRGrid->Cells[n+1][i+1]=SLRGrid->Cells[n+1][i+1]+P[x][v];
v++;
}
SLRGrid->Cells[n+1][i+1]=SLRGrid->Cells[n+1][i+1]+")";
m++;
}
}
j=j+2;
}
i++;
}
if(i>N)
{
Application->MessageBoxA("Analyse Table Achieve!","Message",MB_ICONASTERISK);
}
}
//---------------------------------------------------------------------------
void TForm1::DFA(void)
{
//TODO: Add your source code here
IntProduction();
ConNandTSet();
FirstS();
FollowS();
DFACon();
}
void TForm1::FirstS(void)
{
//TODO: Add your source code here
for(int i=0;i<SetNnum;i++)//初始化first集合
first[i][0]=SetN[i];
bool change=true;
while(change==true)//計算first集合
{
change=false;
for(int i=0;i<Pnum;i++)
{
int k=1;bool continues=true;
while(continues==true&&P[i][k]!='\0')
{
if(add(P[i][k],P[i][0],first)==true)
change=true;
if(P[i][k]>=65&&P[i][k]<=90)
{
int j=0;
while(P[i][k]!=first[j][0])
j++;
if(inset('@',first[j])==false)
continues=false;
}
else if(P[i][k]!='@')continues=false;
k++;
}
if(continues==true)
{
int ps=0;
while(P[i][0]!=first[ps][0])
ps++;
if(inset('@',first[ps])==false)
{
int j=0;
while(first[ps][j]!='\0')
j++;
first[ps][j]='@';
change=true;
}
}
}
}
}
void TForm1::FollowS(void)
{
//TODO: Add your source code here
for(int i=0;i<SetNnum;i++)
follow[i][0]=SetN[i];
follow[0][1]='$';
bool changef=true;
while(changef==true)
{
changef=false;
for(int i=0;i<Pnum;i++)//follow集合
{
int j=1;
while(P[i][j]!='\0')
{
if(P[i][j]>=65&&P[i][j]<=90)//P[i][j]為非終結符,求G[i][j]的follow集合
{
int k=j+1;
while(P[i][k]!='\0')
{
if((P[i][k]<65||P[i][k]>90)&&P[i][k]!='@')//P[i][k]為終結符,將終結符加到follow集合
{if(add(P[i][k],P[i][j],follow)==true)
changef=true;
break;
}
else if(P[i][k]>=65&&P[i][k]<=90)//P[i][k]為非終結符,將該非終結符的first集合加到follow集合
{
if(addfirstfollow(P[i][k],P[i][j],first,follow)==true)
changef=true;
int ps=0;
while(P[i][k]!=first[ps][0])
ps++;
if(inset('@',first[ps])==false)
break;
}
k++;
}
if(P[i][k]=='\0')//將規則左部的非終結符的follow集合加到當前的非終結符的follow集合中
{
if(add(P[i][0],P[i][j],follow)==true)
changef=true;
}
}
j++;
}
}//for
}// while(changef==true)
}
//====================================================================
void TForm1::DFACon(void)
{
for(int i=0;i<100;i++)//初始化狀態集合
for(int j=0;j<100;j++)
{DA[i][j]=-1;TAB[i][j]='#';}
int clo[100];//閉包集合
closure(0,1,clo,Pnum,P);//初始項的閉包
int i=0;
while(clo[i]!=-1)
{
DA[0][i]=clo[i];
i++;
}
int check=checkconflict( N, DA, follow,P);
if(check==1)
ListBox1->Items->Add("狀態0產生移進-歸約沖突");
else if(check==2)
ListBox1->Items->Add("狀態0產生歸約-歸約沖突");
if(check==1||check==2)
{
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(30-15,30-15,30+15,30+15);
Image1->Canvas->TextOutA(30,30,"0");
Image1->Canvas->Brush->Color=clWhite;
}
Image1->Canvas->Ellipse(0,0,0,0);
while(K<=N)
{
int clo1[100];
int i=0;
while(DA[K][i]!=-1)//處理狀態K
{
int x=DA[K][i];
int y=DA[K][i+1];
if(P[x][y]!='\0'&&P[x][y]!='@')//要進行處理的項
{
int f=-1;
for(int m=0;m<=N;m++)
{
int n=0;
while(DA[m][n]!=-1)
{
if(DA[m][n]==x&&DA[m][n+1]==y+1)
{f=m;goto L;}
n=n+2;
}
}
L:
if(f!=-1)
{
TAB[K][f]=P[x][y];
DrawDFA(K,f,P[x][y],Image1);
}
else
{
int check=0;
while(TAB[K][check]!=P[x][y]&&TAB[K][check]!='\0')
check++;
if(TAB[K][check]==P[x][y])
{
closure(x,y+1,clo1,Pnum,P);
int t1=0;
while(DA[check][t1]!=-1)
t1++;
int t2=0;
while(clo1[t2]!=-1)
{
DA[check][t1]=clo1[t2];
t1++;
t2++;
}
//在這里添加代碼檢測沖突
int check2=checkconflict( check, DA, follow,P);
if(check2==1)
ListBox1->Items->Add("狀態"+IntToStr(check)+"產生移進-歸約沖突");
else if(check2==2)
ListBox1->Items->Add("狀態"+IntToStr(check)+"產生歸約-歸約沖突");
DrawDFA(K,check,P[x][y],Image1);
}
else
{
N++;
TAB[K][N]=P[x][y];
closure(x,y+1,clo1,Pnum,P);
int tem=0;
while(clo1[tem]!=-1)
{
DA[N][tem]=clo1[tem];
tem++;
}
//在這里添加代碼檢測沖突
int check2=checkconflict( N, DA, follow,P);
if(check2==1)
ListBox1->Items->Add("狀態"+IntToStr(N)+"產生移進-歸約沖突");
else if(check2==2)
ListBox1->Items->Add("狀態"+IntToStr(N)+"產生歸約-歸約沖突");
DrawDFA(K,N,P[x][y],Image1);
}
}
}//if
i=i+2;//檢測下一條文法規則
}//end while(DA[k][i]!=0)
K++;//檢測下一個狀態
}//end while(K<=N)
if(K>N)
{
Application->MessageBoxA("DFA Achieve!","Message",MB_ICONASTERISK);
}
}
void TForm1::IntProduction(void)
{
//TODO: Add your source code here
char *str=new char [100];
for(int i=0;i<Memo1->Lines->Count;i++)
{
strcpy(str,Memo1->Lines->Strings[i].c_str());
int j=0;
while(str[j]!='\x18'&&str[j]!='\0'&&str[j]!='\x14')
{P[i][j]=str[j];j++;}
Pnum++;
}
delete str;
for(int i=Pnum;i>0;i--)
{
int k=0,l=0;
for(;k<100;k++)
P[i][k]='\0';
k=0;
while(P[i-1][k]!='\0'&&P[i-1][k]!='\x18'&&P[i-1][k]!='\x14')
{
if(P[i-1][k]=='-'&&P[i-1][k+1]=='>')
{
k=k+2;
continue;
}
P[i][l]=P[i-1][k];
l++;
k++;
}
}
for(int k=0;k<100;k++)
P[0][k]='\0';
P[0][0]='P';
P[0][1]=P[1][0];
Pnum++;
}
void TForm1::ConNandTSet(void)
{
//TODO: Add your source code here
for (int m=0;m<100;m++)
{ SetT[m]='\0';SetN[m]='\0';
for(int n=0;n<100;n++)
{first[m][n]='\0';follow[m][n]='\0';}
}
for(int i=0;i<Pnum;i++)//計算終結符與非終結符集合
{
int j=0;
while(P[i][j]!='\0')
{
if((P[i][j]<65||P[i][j]>90)&&P[i][j]!='@'&&inset(P[i][j],SetT)==false)
{
SetT[SetTnum]=P[i][j];
SetTnum++;
}
else if(P[i][j]>=65&&P[i][j]<=90&&inset(P[i][j],SetN)==false)
{
SetN[SetNnum]=P[i][j];
SetNnum++;
}
j++;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -