📄 yffx.cpp
字号:
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
char a[50],b[50],d[500],e[100];
char ch;
char y;
int n1,i1=0,flag=1,n=6;
int total=0;
int S();
int S1();
int T();
int G(); //G为T'
void input();
void input1();
void output();
void main()
{
int f,p,j=0;
char x;
printf("请输入字符串(长度<50,以#号结束)\n");
do
{
scanf("%c",&y);
a[j]=y;
j++;
}while(y!='#');
n1=j;
y=a[0];
if(y=='a')
{
d[0]='S';
d[1]='=';
d[2]='>';
d[3]='a';
d[4]='#';
}
else if(y=='^')
{
d[0]='S';
d[1]='=';
d[2]='>';
d[3]='^';
d[4]='#';
}
else if(y=='(')
{
d[0]='S';
d[1]='=';
d[2]='>';
d[3]='(';
d[4]='T';
d[5]=')';
d[6]='#';
}
ch=b[0]=a[0];
printf("步骤\t文法\t分析串\t\t\t分析字符\t剩余串\n");
f=S1();
if(f==0)
return;
if(ch=='#')
{
printf("accept\n");
p=0;
x=d[p];
while(x!='#')
{
printf("%c",x);
p=p+1;
x=d[p];
}
}
else
{
printf("error\n");
printf("回车返回\n");
getchar();
getchar();
return;
}
}
int S1()
{
int f;
if(ch=='(')
{
b[i1]=ch;
printf("%d\tS-->(T)\t",total);
total++;
flag=0;
input();
input1();
ch=a[++i1];
f=T();
if(f==0)
return(0);
if(ch==')')
{
b[i1]=ch;
printf("%d\tS-->(T)\t",total);
total++;
flag=0;
input();
input1();
ch=a[++i1];
}
else
{
printf("error\n");
return(0);
}
}
else if(ch=='a')
{
b[i1]=ch;
printf("%d\tS-->a\t",total);
total++;
flag=0;
input();
input1();
ch=a[++i1];
}
else if(ch=='^')
{
b[i1]=ch;
printf("%d\tS-->^\t",total);
total++;
flag=0;
input();
input1();
ch=a[++i1];
}
else
{
printf("error\n");
return(0);
}
return(1);
}
int S()
{
int f;
if(ch=='(')
{
b[i1]=ch;
printf("%d\tS-->(T)\t",total);
total++;
e[0]='S';
e[1]='=';
e[2]='(';
e[3]='T';
e[4]=')';
e[5]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
f=T();
if(f==0)
return(0);
if(ch==')')
{
b[i1]=ch;
printf("%d\tS-->(T)\t",total);
total++;
flag=0;
input();
input1();
ch=a[++i1];
}
else
{
printf("error\n");
return(0);
}
}
else if(ch=='a')
{
b[i1]=ch;
printf("%d\tS-->a\t",total);
total++;
e[0]='S';
e[1]='=';
e[2]='>';
e[3]='a';
e[4]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
}
else if(ch=='^')
{
b[i1]=ch;
printf("%d\tS-->^\t",total);
total++;
e[0]='S';
e[1]='=';
e[2]='>';
e[3]='^';
e[4]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
}
else
{
printf("error\n");
return(0);
}
return(1);
}
int T()
{
int f,t;
printf("%d\tT-->SG\t",total);
total++;
e[0]='T';
e[1]='=';
e[2]='>';
e[3]='S';
e[4]='G';
e[5]='#';
output();
flag=1;
input();
input1();
f=S();
if(f==0)
return(0);
t=G();
if(t==0)
return(0);
else
return(1);
}
int G()
{
int f,t;
if(ch==',')
{
b[i1]=ch;
printf("%d\tG-->,SG\t",total);
total++;
e[0]='G';
e[1]='=';
e[2]='>';
e[3]=',';
e[4]='S';
e[5]='G';
e[6]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
f=S();
if(f==0)
return 0;
t=G();
if(t==0)
return 0;
else
return 1;
}
printf("%d\tG-->~\t",total);//~表是空
total++;
e[0]='G';
e[1]='=';
e[2]='>';
e[3]='~';
e[4]='#';
output();
flag=1;
input();
input1();
return 1;
}
void input()
{
int j=0;
for (;j<=i1-flag;j++)
printf("%c",b[j]);
if(j<8) printf("\t");
printf("\t\t");
printf("%c\t\t",ch);
}
void input1()
{
int j;
for (j=i1+1-flag;j<n1;j++)
printf("%c",a[j]);
printf("\n");
}
void output()
{
int m,k,j,q;
int i=0;
m=0;k=0;q=0;
i=n;
d[n]='=';
d[n+1]='>';
d[n+2]='#';
n=n+2;
i=n;
i=i-2;
while(d[i]!='>'&&i!=0)
i=i-1;
i=i+1;
while(d[i]!=e[0])
i=i+1;
q=i;
m=q;
k=q;
while(d[m]!='>')
m=m-1;
m=m+1;
while(m!=q)
{
d[n]=d[m];
m=m+1;
n=n+1;
}
d[n]='#';
for(j=3;e[j]!='#';j++)
{
d[n]=e[j];
n=n+1;
}
k=k+1;
while(d[k]!='=')
{
d[n]=d[k];
n=n+1;
k=k+1;
}
d[n]='#';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -