📄 yufa.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<malloc.h>
#define M 5
#define N 6
#define null 0
typedef struct node{//创建存放字符的数据结构
char c;
struct node *next;
}stack;
typedef struct node1{
char *d;
}table[M][N];
void createtable(table a)//创建预测分析表
{ char *b;
cout<<"请输入预测分析表的元素:";
for(int i=0;i<M;i++)
{ for(int j=0;j<N;j++)
{b=new char;
a[i][j].d=new char;
cin>>b;
strcpy(a[i][j].d,b);
//cout<<"a[i][j]="<<a[i][j].d<<endl;
//cout<<endl<<a[i][j].d[0]<<endl<<a[i][j].d[1];
}
}
}
void printtable(table a)//打印二维数组的元素
{ int n=0;
for(int i=0;i<M;i++)
{ for(int j=0;j<N;j++)
cout<<a[i][j].d<<'\t';
cout<<endl;
}
}
int checktable(table a,int i,int j)//检查a[i][j]是产生式吗
{
if(a[i][j].d!="0")
return 1;
else
return 0;
}
stack *initiate(stack *s)//初始化堆栈
{ s=(stack *)malloc(sizeof(stack));
s->next=null;
return s;
}
stack *searchtail(stack *s)//搜索队尾元素
{
while(s->next!=null)
s=s->next;
return s;
}
stack *searchtail1(stack *s)//搜索队尾元素的前一个元素
{
while(s->next->next!=null)
s=s->next;
return s;
}
char queuestack1(stack *s)//上托栈顶符号
{ char d;
stack *s2=s;
stack *s1=s;
s1=searchtail(s1);
s2=searchtail1(s2);//搜索队尾元素的前一个元素
d=s1->c;
s2->next=s1->next;
delete s1;
return d;
}
char queuestack2(stack *s)//从堆栈尾取非终结符
{ char d;
stack *s1=s;
s1=searchtail(s1);
d=s1->c;
return d;
}
stack *queuetail(stack *s)//删除队尾元素
{ stack *s1=s;
s1=searchtail(s1);
stack *s2=s;
s2=searchtail1(s2);
s2->next=s1->next;
delete s1;
return s;
}
void Enstack(stack *s,char d)//元素入堆栈从队头插入
{ stack *s1;
s1=(stack *)malloc(sizeof(stack));
s1->c=d;
s1->next=s->next;
s->next=s1;
}
void Enstack1(stack *s,char d)//元素入堆栈从队尾插入
{stack *s1;
stack *s2=s;
s1=(stack *)malloc(sizeof(stack));
s1->c=d;
s2=searchtail(s2);//搜索队尾元素
s1->next=s2->next;
s2->next=s1;
}
void create1(stack *s)//创建输入符号堆栈
{ char c;
cout<<"输入你要输入的符号串\n";
while(1){
cin>>c;
Enstack(s,c);
if(c=='#')
break;
}
}
void create2(stack *s)//创建一个分析栈
{ char c;
cout<<"输入你要入分析栈的元素\n";
cout<<"如果结束请输入Y或y否则继续输入:\n";
while(1){
cin>>c;
if(c=='Y'||c=='y')
break;
Enstack(s,c);
}
}
void print(stack *s)
{ stack *s1;
s1=s;s1=s1->next;
while(s1!=null)
{ cout<<s1->c;
s1=s1->next;
}
cout<<endl;
}
int create3(char VN[])//创建的字符数组,返回数组元素的个数
{ char c;
int i=0;
cout<<"输入你所要创建的字符数组的元素:\n";
cout<<"如果输入完毕请按Y或y\n";
while(1)
{ cin>>c;
if(c=='Y'||c=='y')
break;
VN[i]=c;
i++;
}
return i;
}
int CheckVT(char a[],int b,char c)//检查数组中是否有元素c
{
int i;
for( i=0;i<b;i++)
{
if(c==a[i])
break;
else
continue;
}
if(i==b)
return 0;
else
return i;
}
int position(char a[],int b,char c)//从数组a中返回元素c的位置b为长度
{ for(int i=0;i<b;i++)
{ if(a[i]==c)
break;
}
return i;
}
void printfrs(stack *s,stack *s1,char *s2,int i)//打印结果
{
cout<<i;
stack *s3,*s4;
s3=s;s4=s1;
s3=s3->next;s4=s4->next;
while(s3!=null)
{ cout<<s3->c;
s3=s3->next;
}
cout<<"\t";
while(s4!=null)
{ cout<<s4->c;
s4=s4->next;
}
cout<<"\t";
cout<<s2;
}
int getlength(char *s)
{
int i=0;
while(s[i]!='\0')
i++;
return i;
}
void main()
{
char VN[10];//存放非终结符数组
char VT[10];//存放终结符数组
char X,a;
int ff=1;
char *bc;
bc=new char;
int hh,hh0;
table aa;
// char cc;
createtable(aa);
printtable(aa);//打印二维数组的元素
int length1,length2;//非终结符和终结符的长度
length1=create3(VN);//创建的字符数组,返回数组元素的个数
length2=create3(VT);
stack *s=0;//输入符号堆栈
s=initiate(s);
create1(s);//创建输入符号堆栈
print(s);
stack *s1=0;
s1=initiate(s1);
create2(s1);//创建一个分析栈
//X=queuestack1(s1);//上托栈顶符号送X
a=queuestack2(s);//从堆栈尾取非终结符
while(1){
X=queuestack1(s1);//上托栈顶符号送X
if(CheckVT(VT,length2,X))
{ if(X=='a')
{//cc=a;
s=queuetail(s);//删除队尾元素
a=queuestack2(s);
}
else
{
cout<<"该句子不是合法的句子:"<<endl;
return;
}
}
else
{ if(X=='#')
{
if(X=='a')
{ cout<<"该句子是合法的句子:"<<endl;
return ;
}
else {cout<<"该句子不是合法的句子:"<<endl;
return;
}
}
else
{ hh=position(VT,length2,a);
hh0=position(VN,length1,X);
strcpy(bc,aa[hh0][hh].d);
int i=0;
if(checktable(aa,hh0,hh))
{i=getlength(aa[hh0][hh].d);
while(1){
if(aa[hh0][hh].d!="e")
{
Enstack1(s1,aa[hh0][hh].d[i-1]);
i--;
if(i==-1)
break;
}
}
}
else
{
cout<<"该句子不是合法的句子:"<<endl;
return;
}
}
}
printfrs(s1,s,bc,ff);//打印结果
ff++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -