📄 s.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char vt[30],vn[20],vn1[20][20],stack[20],current;
/////vt[]中级符数组,vn[20]非中级符数组,vn1[20][20]辅助存储非中级符所在结构体位置;
///////////*stack堆栈,current待检测字符串的当前字符
struct analyse
{ char head;
char body[20];
char predict[10];
};
int number=0,top=0; //////////number记录所用结构体数组个数,top栈的位置
int findv(char *a,char ch);///在数组中查找字符
void inputchan( );////////////输入产生式
void push(char ch);///////////进栈
char pop();///////////////////出栈
void read(char ch);///////////读待检测字符串的字符到current中
analyse tt[15];///////////////结构体数组变量
/////////////////////////////////////////////////
///////////////////////////////////////////////////
void main()
{char carry[15],ch;/////carry为待检测字符串,
int d=0,k=0,kk,kkk,ii,f;//////////k=0,kk,kkk栈顶当前字符为非中级符,查找其预选集
cout<<"请输入产生式"<<endl;
inputchan();
cout<<"请输入各个产生式的预选集"<<endl;
getchar();
for(ii=0;ii<number;ii++)
{ ch=getchar();
for(int j=0;ch!=10;j++)
{ tt[ii].predict[j]=ch;
ch=getchar();
}
}
//cout<<"好"<<endl;
for(ii=0;ii<=number;ii++)
cout<<int(vn1[ii][0])<<endl;
cout<<"请输入待分析的字符串"<<endl;
ch=getchar();
for(d=0;ch!=10;d++)
{carry[d]=ch;
ch=getchar();
}
cout<<"准备分析"<<endl;
//////////
for(int c=0;c<number;c++) printf("%c, %s, %s\n",tt[c].head,tt[c].body,tt[c].predict);
top=0;
d=0;
push('#');
push(vn[0]);
read(carry[d++]);
printf("%s,%s\n",vn,vt);
ls1:
ch=pop();cout<<"当前栈顶字符"<<ch<<"当前指针分析字符"<<current<<endl;
if(ch=='#'&¤t=='#')
cout<<"待分析字符分析成功"<<endl;
else
{//////////////查找中级符
if(ch==vn[0])
{ for(int a=int(strlen(tt[0].body))-1;a>=0;a--) push(tt[0].body[a]);putchar(ch);
printf("出栈");printf("%s",tt[0].body);printf("进栈\n");goto ls1;
}
f=findv(vt,ch);
if(f!=50)
if(ch==current)
{///char ch1=pop();
read(carry[d++]);goto ls1;}
else
cout<<"当前指针分析字符不是合法的中级符,分析失败!!!"<<endl;
else
//////////////查找非中级符号 cout<<"好1"<<endl;
{ f=findv(vn,ch);
if(f!=50) //cout<<"好2"<<endl;cout<<int(strlen(vn1[f]))<<int(strlen(vn1[f+1]))<<int(vn1[f][0])<<int(vn1[f+1][0])<<endl;
for(kkk=0;kkk<int(strlen(vn1[f]));kkk++)
{k=int(vn1[f][kkk]);
kk=findv(tt[k].predict,current);
if(kk!=50) break;
}
if(kkk<int(strlen(vn1[f])) )
{////////pop();
for(int a=int(strlen(tt[k].body))-1;a>=0;a--)
push(tt[k].body[a]);
putchar(ch);printf("出栈");printf("%s",tt[k].body);printf("进栈\n");
goto ls1;
}
else
cout<<"当前指针分析字符与产生式预选集不匹配,分析失败!!!"<<endl;
}
}
}
////////////////////////////////////
/////////////////////////////////////
void inputchan( )
{char ch;
ch=getchar();
for(int k=0;ch!='@';k++)
{ int i=0;///////////body位置*vn1[j]=ch;
tt[k].head=ch;
for(int j=0;j<int(strlen(vn))&&vn[j]!=ch;j++);
if (j==int(strlen(vn))) {vn[j]=ch;vn1[j][0]=k;vn1[j][1]='\0';}
else
{vn1[j][strlen(vn1[j])]=k;vn1[j][strlen(vn1[j])+1];}
if(getchar()=='-'&&getchar()=='>')
while((ch=getchar())!=10 && ch!='@')
{ tt[k].body[i++]=ch;////////body位置
if(!isupper(ch))
{for(int j=0;vt[j]!=ch&&j<int(strlen(vt));j++);
if (j==int(strlen(vt))) vt[j]=ch;
}
}
ch=getchar();
}
number=k;
}
///////////////
int findv(char *a,char ch)
{for(int j=0;a[j]!=ch &&j<int(strlen(a));j++);
if(j<int(strlen(a)))
return j;
else
return 50;
}
////////////////////
void push(char ch)
{stack[top++]=ch;
}
char pop()
{return stack[--top];
}
////////////////////
void read(char ch)
{current=ch;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -