📄 cpp1.cpp
字号:
#include<stdio.h>
#include<string.h>
typedef struct
{char s[5];
}node;
node fenxibiao[5][6]={{{"Te"},{"#"},{"#"},{"Te"},{"#"},{"#"}},{{"#"},{"+Te"},{"#"},{"#"},{"@"},
{"@"}},{{"Ft"},{"#"},{"#"},{"Ft"},{"#"},{"#"}},{{"#"},{"@"},{"*Ft"},{"#"},{"@"},{"@"}},{{"d"},
{"#"},{"#"},{"(E)"},{"#"},{"#"}}};
typedef struct
{char L[10];
int top;
}zhan;
char chanshengshi[5];
void set(zhan *p)
{p->top=0;
p->L[p->top]='$';
p->top=1;
p->L[p->top]='E';
}
int panduan1(zhan *p,char a[5])
{int i=0;
while(i<5)
{if(p->L[p->top]==a[i])
break;
else
i=i+1;
}
if(i==5)
return 0;
else
return 1;
}
int panduan2(zhan *p,char a[10],int t,char c[6])
{char b[5]={'E','e','T','t','F'};
int i=0;
while(i<5)
{if(b[i]==p->L[p->top])
break;
else
i=i+1;
}
int j=0;
while(j<6)
{if(c[j]==a[t])
break;
else
j=j+1;
}
if(strcmp(fenxibiao[i][j].s,"#")==0)
return 0;
else
{strcpy(chanshengshi,fenxibiao[i][j].s);
return 1;
}
}
void print(zhan *p,char a[10],int t)
{int i;
for(i=0;i<=p->top;i++)
printf("%c",p->L[i]);
printf(" ");
int j=t;
while(a[j]!='\0')
{printf("%c",a[j]);
j=j+1;
}
}
void fanyazhan(zhan *p)
{
if(strcmp(chanshengshi,"@")!=0)
{int i=0;
while(chanshengshi[i]!='\0')
i=i+1;
i=i-1;
while(i>=0)
{p->top=p->top+1;
p->L[p->top]=chanshengshi[i];
i=i-1;
}
}
}
void main()
{char zhongjifu[6]={'d','+','*','(',')','$'};
printf("终结符:");
int j;
for(j=0;j<5;j++)
printf("%c",zhongjifu[j]);
printf("\n");
printf("请输入要分析的语句:");
char shuruliu[10];
scanf("%s",shuruliu);
zhan fenxizhan;
zhan *s;
s=&fenxizhan;
set(s);
int ip=0;//指向输入流头元素的指针
int t;//判断栈顶元素是否为终结符的标志
int k;//判断分析表中对应位置是否为空的标志
print(s,shuruliu,ip);
printf("\n");
while(s->L[s->top]!='$')
{t=panduan1(s,zhongjifu);
if(t||s->L[s->top]=='$')
if(s->L[s->top]==shuruliu[ip])
{s->top=s->top-1;
ip=ip+1;
print(s,shuruliu,ip);
printf("\n");
}
else
{printf("错误\n");
printf("语句:%s不符合文法\n",shuruliu);
break;
}
else
{k=panduan2(s,shuruliu,ip,zhongjifu);
if(k)
{s->top=s->top-1;
fanyazhan(s);
print(s,shuruliu,ip);
printf(" %s",chanshengshi);
printf("\n");
}
else
{printf("错误\n");
printf("语句:%s不符合文法\n",shuruliu);
break;
}
}
}
if(s->L[s->top]=='$')
printf("分析完成,语句%s符合文法\n",shuruliu);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -