C:\>ping google.com.hk
正在 Ping google.com.hk [74.125.128.105] 具有 32 字节的数据:
来自 74.125.128.105 的回复: 字节=32 时间=91ms TTL=45
来自 74.125.128.105 的回复: 字节=32 时间=95ms TTL=45
请求超时。
来自 74.125.128.105 的回复: 字节=32 时间=40ms TTL=45
74.125.128.105 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 3,丢失 = 1 (25% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 40ms,最长 = 95ms,平均 = 75ms
字数限制只能发上部分,你若有其它联系方法再想法发下半部分,这个程序是已通过编译的#include <stdio.h>
#include <process.h>
#include <iostream.h>
#include <string.h>
#include <fstream.h>
class Yui_Kong //滤空格
{ char Yufa[30][30]
char k[30]
int N
public:
char Yufa0[30][30]
char Kong[30][30]
private:
void Shu_Ru()
{ cout<<endl<<"请输入文法:"<<endl<<endl
char cint i=0,j=0
c=getchar()
while(c!='#')
else Yufa[i][j++]=c
c=getchar()
}
if(j==0)Yufa[i][j]='#'
else{
Yufa[i][j]='\0'Yufa[i+1][0]='#'
}
}
void Hua_jian()
{ int i=0int ii=0,jj=0
while(Yufa[i][0]!='#')
{
for(int j=0Yufa[i][j]!='\0'j++)
{ if(j==1||j==2)
else if(Yufa[i][j]=='|')
{ Yufa0[ii++][jj++]='\0'
Yufa0[ii][0]=Yufa0[ii-1][0]
jj=1
}
else
Yufa0[ii][jj++]=Yufa[i][j]
}
Yufa0[ii][jj]='\0'
ii++jj=0
i++
}
Yufa0[ii][0]='#'
}
void Vn()//在产生式中提取非终结符
{ int i=0,ii=0,iii=0
Kong[ii++][0]=Yufa[0][0]
while(Yufa[i][0]!='#')
{
for(int j=0Yufa[i][j]!='\0'j++)
if(Yufa[i][j]>='A'&&Yufa[i][j]<='Z')
{
for(iii<iiiii++)
if(Kong[iii][0]==Yufa[i][j])break
if(iii==ii)
Kong[ii++][0]=Yufa[i][j]
iii=0
}
i++
}
Kong[ii][0]='#'
}
void Scan()//进行扫描,看各非终结符能否推出空
{
char tmp[30][30]
int i=0
for(Yufa0[i][0]!='#'i++)//把产生时拷贝到临时数组
strcpy(tmp[i],Yufa0[i])
tmp[i][0]='#'
for(int j=0tmp[j][0]!='#'j++)//进行第一次扫描,
{
for(int jj=0tmp[j][jj]!='\0'jj++)
{
if(tmp[j][jj]=='$')//能推出空
{
char tm=tmp[j][0]
for(int t=jtmp[t+1][0]!='#'t++)
strcpy(tmp[t],tmp[t+1])
tmp[t][0]='#'j--
for(int a=0Kong[a][0]!='#'a++)
{
if(Kong[a][0]==tm)
}
break
}
else if(tmp[j][jj]<'A'||tmp[j][jj]>'Z')//不能推出空
{
for(int jjj=jtmp[jjj+1][0]!='#'jjj++)
strcpy(tmp[jjj],tmp[jjj+1])
tmp[jjj][0]='#'j--
break
} }
}
for(int e=0Kong[e][0]!='#'e++)//把第一次扫描的结果记录到Kong数组里
{ for(int j=0tmp[j][0]!='#'j++)
if(Kong[e][0]==tmp[j][0]) break
if(tmp[j][0]=='#'&&Kong[e][1]!='1')Kong[e][1]='0'
}
int hj=0
for(int y=0Kong[y][0]!='#'y++)
{Kong[y][2]=Kong[y][1]
if(Kong[y][1]!='1'&&Kong[y][1]!='0')hj=1
}
N=3
if(hj==1)
{ int p=1
while(p)
{ for(int aa=0tmp[aa][0]!='#'aa++)
{ int bb=1,nn=0
for(tmp[aa][bb]!='\0'bb++)//逐个扫描产生式的每一个符号
{ for(int cc=0Kong[cc][0]!='#'cc++)//查看kong中的每一个非终结符
{
int oo=0
if(Kong[cc][0]==tmp[aa][bb])//在产生式中发现了一个非终结符
{
if(Kong[cc][1]=='1'||k[cc]=='1')//如果该非终结符被标记为能推出空,则删除该非终结符
{ int dd=bb
while(tmp[aa][dd+1]!='\0')
{ tmp[aa][dd]=tmp[aa][dd+1]
dd++
}
tmp[aa][dd]='\0'bb--
break
}
if(Kong[cc][1]=='0'||k[cc]=='0')//如果该非终结符被标记为不能推出空,说明此产生式左部亦不能推出空,记录,并删除此产生式
{ char jj=tmp[aa][0]
for(int ii=aatmp[ii+1][0]!='#'ii++)//删除产生式
strcpy(tmp[ii],tmp[ii+1])
tmp[ii][0]='#'aa--oo=1
int ll=0
for(int kk=0tmp[kk][0]!='#'kk++)
{
if(tmp[kk][0]==jj)//查看产生式数组中是否还有以此以产生式左部非终结符开始的产生式
}
if(ll==0)//产生式数组中没有以此非终结符开始的产生式,此非终结符标记为不能
{ for(int mm=0Kong[mm][0]!='#'mm++)
if(Kong[mm][0]==jj)
}
if(bb==1)//标记此产生式右部并不是因为全部被删除而产生的空
break
}
}
if(oo==1)break//已经有结果,循环没必要继续,退出
}
}
if(bb==1&&nn==0)//产生式右部全部被删除
{
for(int ee=0Kong[ee][0]!='#'ee++)//标记为能推出空
if(Kong[ee][0]==tmp[aa][0])
char ff=tmp[aa][0]
for(int hh=0tmp[hh][0]!='#'hh++)//删除左部为此非终结符的全部产生式
if(tmp[hh][0]==ff)
{
for(int gg=hhtmp[gg+1][0]!='#'gg++)
strcpy(tmp[gg],tmp[gg+1])
tmp[gg][0]='#'hh--aa--
}}
}
for(int mn=0Kong[mn][0]!='#'mn++)
{ Kong[mn][N]=k[mn]
if(Kong[mn][1]!='1'&&Kong[mn][1]!='0')
Kong[mn][1]=k[mn]
k[mn]='a'
}
N++
int ty=0
while(Kong[ty][0]!='#')
{ if(Kong[ty][1]!='0'&&Kong[ty][1]!='1')break
ty++
}
if(Kong[ty][0]=='#')p=0
} }
}
void KG(int a)//输出空格个数;
{ for(int i=0i<ai++)cout<<" "
}
public:
void print_Kong()//显示非终结符能否推出空的结果
{ Shu_Ru()
Hua_jian()
Vn()
Scan()
int num=0,num1,num2,num3
for(int i=0Kong[i][0]!='#'i++) num++
if(num==2)if(num==3)if(num==4)if(num==5)
if(num==6)if(num==7)if(num==8)
cout<<"\n\n ************非终结符能否推出空的表************\n"
cout<<"┏================================================== =======┑"
cout<<"┊"KG(num2)cout<<"非终结符"KG(num3)cout<<"┊"
for(int ii=0ii<numii++)
{ KG(num1)cout<<Kong[ii][0]KG(num1)cout<<"┊"
}
cout<<"├————————————————————————————————┤"
cout<<"┊"KG(num2+num3+8)cout<<"┊"
for(int kk=0kk<numkk++)
{ KG(num1+num1+1)cout<<"┊"
}
cout<<"┊"KG(num2+2)cout<<"初值"KG(num3+2)cout<<"┊"
for(int iii=0iii<numiii++)
{ KG(num1-1)cout<<"未定"KG(num1-2)cout<<"┊"
}
for(int we=2we<Nwe++)
{ cout<<"┊"KG(num2+num3+8)cout<<"┊"
for(int s=0s<nums++)
{ KG(num1+num1+1)cout<<"┊"
}
cout<<"┊"KG(num2)cout<<"第"<<we-1<<"次扫描"KG(num3-1)cout<<"┊"
for(int j=0j<numj++)
else if(Kong[j][we]=='0')
else
}
}
cout<<"┊"KG(num2+num3+8)cout<<"┊"
for(int ss=0ss<numss++)
{ KG(num1+num1+1)cout<<"┊"
}
cout<<"├———————————————————————————————————┤"
cout<<"┊"KG(num2)cout<<"最终结果"KG(num3)cout<<"┊"
for(int jjj=0jjj<numjjj++)
else if(Kong[jjj][1]=='0')
else
}
cout<<"┕===============================================================┙"
}
}
class Qiu_First:public Yui_Kong
{
public:
char FIRST[30][30]
int number2[30]//记录非终结符FIRST集元素的数目
int number1[30]//记录非终结符在FIRST中的位置,与产生式数组配对使用
char chan_sheng_shi[30][30]
int U//记录符号集合与符号串集合的分界
int number3[30]
void chu_shi_hua()//初始化 FIRST、number1、number2、chan_sheng_shi
{ int i=0
for(Kong[i][0]!='#'i++)
FIRST[i][0]='#'U=i
i=0
for(Yufa0[i][0]!='#'i++)
{for(int j=0Yufa0[i][j]!='\0'j++)
chan_sheng_shi[i][j]=Yufa0[i][j]
chan_sheng_shi[i][j]='\0'
for(int k=0FIRST[k][0]!='#'k++)
if(chan_sheng_shi[i][0]==FIRST[k][0])
}
chan_sheng_shi[i][0]='#'
}
void he_bing(char ch[30][30],int m,int i,int &j,char ch0[30][30],int m0,int i0,int j0)//要扩展的集合、指明行数、指明集合元素开始的位置、指明集合元素结束位置……
{ for(int a=i0a<j0a++)
{
int b=i
for(b<jb++)
if(ch[m][b]==ch0[m0][a])break
if(b==j)
ch[m][j++]=ch0[m0][a]
} }
void scan1()
{ int a=0,aa=0
while(chan_sheng_shi[a][0]!='#')
{ if(chan_sheng_shi[a][1]=='$')
{aa=a
for(chan_sheng_shi[aa+1][0]!='#'aa++)
{
strcpy(chan_sheng_shi[aa],chan_sheng_shi[aa+1])number1[aa]=number1[aa+1]
}
chan_sheng_shi[aa][0]='#'a--
}
else if(chan_sheng_shi[a][1]<'A'||chan_sheng_shi[a][1]>'Z')
{
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][1]
aa=a
for(chan_sheng_shi[aa+1][0]!='#'aa++)
{
strcpy(chan_sheng_shi[aa],chan_sheng_shi[aa+1])number1[aa]=number1[aa+1]
}
chan_sheng_shi[aa][0]='#'a--
}
a++
}
a=0
while(FIRST[a][0]!='#')
{
int i=0
for(chan_sheng_shi[i][0]!='#'i++)
if(chan_sheng_shi[i][0]==FIRST[a][0])break
if(chan_sheng_shi[i][0]=='#')
FIRST[a][1]='1'
a++
}
}
void scan2()
{
int a=0,aa=0
for(chan_sheng_shi[a][0]!='#'a++)
{
aa=1int n
while(chan_sheng_shi[a][aa]!='\0')
{
n=0
if((chan_sheng_shi[a][aa]>='A'&&chan_sheng_shi[a][aa]<='Z')&&(chan_sheng_shi[a][aa+1]<'A'||chan_sheng_shi[a][aa+1]>'Z'))
n=1
if((chan_sheng_shi[a][aa]>='A'&&chan_sheng_shi[a][aa]<='Z')&&(chan_sheng_shi[a][aa+1]>='A'&&chan_sheng_shi[a][aa+1]<='Z'))
{
int a2=0
for(int a1=0Kong[a1][0]!='#'a1++)
{
if(chan_sheng_shi[a][aa]==Kong[a1][0])
{if(Kong[a1][1]=='0')a2=1
break
}
}
if(a2==1) n=1
}
if(n==1)
{
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][aa]
for(int aaa=achan_sheng_shi[aaa+1][0]!='#'aaa++)
{
strcpy(chan_sheng_shi[aaa],chan_sheng_shi[aaa+1])number1[aaa]=number1[aaa+1]
}
chan_sheng_shi[aaa][0]='#'
a--
break
}
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][aa]
aa++
}
}
}
void zheng_li()
{
int a=1
while(a)
{
for(int b=0FIRST[b][0]!='#'b++)
{
if(FIRST[b][1]=='0')//说明含有非终结符
{
for(int c=2c<number2[b]c++)
{
if(FIRST[b][c]>='A'&&FIRST[b][c]<='Z')//找到非终结符进行集合扩展
for(int d=0FIRST[d][0]!='#'d++)
if(FIRST[d][0]==FIRST[b][c]&&FIRST[d][1]=='1')//找到要添加的集合并且此集合已经整理完毕
}
int e=0
for(int f=2f<number2[b]f++)
if(FIRST[b][f]>='A'&&FIRST[b][f]<='Z')
if(e==0)
FIRST[b][1]='1'
}
}
int h=0
for(int g=0FIRST[g][0]!='#'g++)
if(FIRST[g][1]=='0')
if(h==0) a=0
}
for(a=0FIRST[a][0]!='#'a++)
{
if(Kong[a][1]=='1')
FIRST[a][number2[a]++]='$'
}
}
void kuo_zhan(int &b,int &c,int &d)
{
int m=1,i=2
for(i<number2[d]i++)
{
int j=2
for(j<number2[b]j++)//查找,没有则插入
if(FIRST[d][i]==FIRST[b][j])break
if(j==number2[b])//插入
{
if(m==1)
{
m=0FIRST[b][c]=FIRST[d][i]
}
else
{
for(int n=number2[b]n>cn--)
FIRST[b][n]=FIRST[b][n-1]
FIRST[b][c]=FIRST[d][i]
number2[b]++
c++
}
}
}
if(m==1)
{
for(int n=cn<number2[b]n++)
FIRST[b][n]=FIRST[b][n+1]
number2[b]--
c--
}
}
void print_FIRST()
{
chu_shi_hua()
scan1()
scan2()
zheng_li()
cout<<"\n 1.非终结符的 FIRST 集:"
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n"
for(int i=0FIRST[i][0]!='#'i++)
{
cout<<" FIRST( "<<FIRST[i][0]<<" ) ={ "<<FIRST[i][2]
for(int j=3j<number2[i]j++)
cout<<" , "<<FIRST[i][j]
cout<<" }\n\n"
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n"
chuan_first()
}
void re_chu()
{
for(int i=0Yufa0[i][0]!='#'i++)
{
for(int j=0Yufa0[i][j]!='\0'j++)
chan_sheng_shi[i][j]=Yufa0[i][j]
chan_sheng_shi[i][j]='\0'
}
chan_sheng_shi[i][0]='#'
i=U+1
for(int j=0chan_sheng_shi[j][0]!='#'j++)
{
for(int j1=1chan_sheng_shi[j][j1]!='\0'j1++)
FIRST[i][j1-1]=chan_sheng_shi[j][j1]
number2[i]=number3[i-U]=j1-1
i++
}
FIRST[i][0]='#'
}
void chuan_first()
{
re_chu()
for(int i=U+1FIRST[i][0]!='#'i++)
{
if(FIRST[i][0]>='A'&&FIRST[i][0]<='Z')
{
for(int i2=0Kong[i2][0]!='#'i2++)
if(Kong[i2][0]==FIRST[i][0])break
if(Kong[i2][1]=='0')
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i2,2,number2[i2])
if(Kong[i2][1]=='1')
{
for(int i3=0i3<number3[i-U]i3++)
{
for(int i4=0Kong[i4][0]!='#'i4++)
if(Kong[i4][0]==FIRST[i][i3])break
if(Kong[i4][1]=='1')
{
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i4,2,number2[i4])
number2[i]--
}
if(Kong[i4][1]=='0')
{
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i4,2,number2[i4])
break
}
}
if(i3==number3[i-U]) FIRST[i][number2[i]++]='$'
}
}
else
FIRST[i][number2[i]++]=FIRST[i][0]
}
for(int j=U+1FIRST[j][0]!='#'j++)
FIRST[j][number2[j]]='\0'
//print_chuan_first()
}
void print_chuan_first()
{
cout<<"/n每一个符号串的 FIRST 集:"
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n"
for(int i=U+1FIRST[i][0]!='#'i++)
{
cout<<" FIRST( "
for(int i1=0i1<number3[i-U]i1++)
cout<<FIRST[i][i1]
cout<<" ) ={ "<<FIRST[i][i1]
for(i1=number3[i-U]+1i1<number2[i]i1++)
cout<<" , "<<FIRST[i][i1]
cout<<" }\n\n"
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n"
}
}
class Qiu_Follow:public Qiu_First
{
public:
char FOLLOW[30][30]
int n1[30]
int n2[30]
void chu_shi_hua_follow()
{
for(int i=0Yufa0[i][0]!='#'i++)
strcpy(chan_sheng_shi[i],Yufa0[i])
chan_sheng_shi[i][0]='#'
for(int j=0Kong[j][0]!='#'j++)
{
FOLLOW[j][0]=Kong[j][0]n1[j]=n2[j]=1
}
FOLLOW[0][1]='#'n1[0]=n2[0]=2
FOLLOW[j][0]='#'
}
void qiu_follow_ji()
{chu_shi_hua_follow()
int a=1
while(a){
a=0
for(int i=0FOLLOW[i][0]!='#'i++)
{
for(int i0=0chan_sheng_shi[i0][0]!='#'i0++)
{
for(int i1=1chan_sheng_shi[i0][i1]!='\0'i1++)
if(FOLLOW[i][0]==chan_sheng_shi[i0][i1])//如果在产生式中找到一个此非终结符则进行处理
{
if(chan_sheng_shi[i0][i1+1]=='\0')//A->aB
{
for(int i2=0FOLLOW[i2][0]!='#'i2++)
if(FOLLOW[i2][0]==chan_sheng_shi[i0][0])break
he_bing(FOLLOW,i,1,n1[i],FOLLOW,i2,1,n1[i2])
}
else if(chan_sheng_shi[i0][i1+1]<'A'||chan_sheng_shi[i0][i1+1]>'Z')//A->aBc
{
for(int m=1m<n1[i]m++)
if(FOLLOW[i][m]==chan_sheng_shi[i0][i1+1])break
if(m==n1[i])
FOLLOW[i][n1[i]++]=chan_sheng_shi[i0][i1+1]
}
else //A->aBCD……
{
for(int i3=0Kong[i3][0]!='#'i3++)//判断C是否能推出空
if(Kong[i3][0]==chan_sheng_shi[i0][i1+1])break
if(Kong[i3][1]=='0')//C不能推出空
he_bing(FOLLOW,i,1,n1[i],FIRST,i3,2,number2[i3])
else//C能推出空,则查看D……
{
he_bing(FOLLOW,i,1,n1[i],FIRST,i3,2,number2[i3])
n1[i]--
int j=0
for(int i4=i1+2chan_sheng_shi[i0][i4]!='\0'i4++)
{
if(chan_sheng_shi[i0][i4]>='A'&&chan_sheng_shi[i0][i4]<='Z')
{j=0
for(int i5=0Kong[i5][0]!='#'i5++)
if(Kong[i5][0]==chan_sheng_shi[i0][i4])break
if(Kong[i5][1]=='0')
{
he_bing(FOLLOW,i,1,n1[i],FIRST,i5,2,number2[i5])
j=1
break
}
else
}
else
{
for(int k=1k<n1[i]k++)
if(FOLLOW[i][k]==chan_sheng_shi[i0][i4])break
if(k==n1[i])
FOLLOW[i][n1[i]++]=chan_sheng_shi[i0][i4]
j=1break}
}
if(j==0)
{
for(int i6=0FOLLOW[i6][0]!='#'i6++)
if(FOLLOW[i6][0]==chan_sheng_shi[i0][0])break
he_bing(FOLLOW,i,1,n1[i],FOLLOW,i6,1,n1[i6])
}
}
}
}
}
}
for(int b=0FOLLOW[b][0]!='#'b++)
if(n1[b]!=n2[b])
for(b=0FOLLOW[b][0]!='#'b++)
n2[b]=n1[b]
}
}
void print_FOLLOW()
{
qiu_follow_ji()
cout<<"\n2.非终结符的 FOLLOW 集:"
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n"
for(int i=0FOLLOW[i][0]!='#'i++)
{
cout<<" FOLLOW( "<<FOLLOW[i][0]<<" ) ={ "<<FOLLOW[i][1]
for(int j=2j<n1[i]j++)
cout<<" , "<<FOLLOW[i][j]
cout<<" }\n\n"
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n"
}
}
class Qiu_Select:public Qiu_Follow
{
public:
char SELECT[30][30]
int num[30]
void qiu_select()
{
for(int a=0a<30a++)num[a]=0
for(int i=U+1FIRST[i][0]!='#'i++)
{
if(FIRST[i][number2[i]-1]=='$')
{
number2[i]--
he_bing(SELECT,i-U-1,0,num[i-U-1],FIRST,i,number3[i-U],number2[i])
int s=i-U-1
for(int i1=0FOLLOW[i1][0]!='#'i1++)
if(FOLLOW[i1][0]==Yufa0[s][0])break
he_bing(SELECT,i-U-1,0,num[i-U-1],FOLLOW,i1,1,n1[i1])
number2[i]++
}
else
{
he_bing(SELECT,i-U-1,0,num[i-U-1],FIRST,i,number3[i-U],number2[i])
}
}
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)