📄 lcsgrammer.cpp
字号:
# include "stdio.h"
# include "string.h"
# define SUCCESS 1
# define ERROR 0
# define MAXINPUT 300
# define MAXSTACK 100
# define STARTSYMBOL 'S'
int prioriy[6][6]={
{-1,-1,-1,-1, 0, 4},
{ 4, 4, 1, 1, 1, 1},
{-1,-1, 1, 1, 1, 1},
{-1,-1,-1, 1, 1, 1},
{ 4, 4, 1, 1, 1, 1},
{-1,-1,-1,-1, 4, 4}};
char VtList[6]={'(','i','*','+',')','#'};
char character[MAXINPUT];
int stack[MAXSTACK],a[MAXINPUT];
int Reduce(int,int,int);
int prioriycmp(int,int);
int transferCHARtoINT(char);
char transferINTtoCHAR(int);
int parser (void);
int IsVt(int);
int main ()
{
int Result;
printf("欢迎进入ARMOSEE语法分析程序\n本程序分析由以下文法生成的一个句子\nE->E+T|T\nT->T*F|F\nF->(E)|i\n");
printf("请输入该文法的句子,以#结束:\n");
scanf("%s",&character);
while(character[strlen(character)-1]!='#')
{
printf("输入句子不合法,没有以#结束!请重新输入:\n");
scanf("%s",&character);
}
for(int i=0;i<strlen(character);i++)
a[i]=transferCHARtoINT(character[i]);
printf("当前输入串\t\t当前状态栈\t\n");
Result=parser();
if(Result==0)
printf("\n分析失败!\n");
else
printf("\n分析成功!\n");
return (0);
}
int Reduce(int begin,int end,int len)
{
switch(end)
{
case 7: return(6);break;
case 8: return(7);break;
case 4:
case 1: return(8);break;
default:break;
}
}
int IsVt(int character)
{
if(character>=0&&character<6)
return(1);
else return(0);
}
int prioriycmp(int character1,int character2)
{
return(prioriy[character1][character2]);
}
int transferCHARtoINT(char character)
{
switch(character)
{
case '(': return(0);break;
case 'i': return(1);break;
case '*': return(2);break;
case '+': return(3);break;
case ')': return(4);break;
case '#': return(5);break;
case 'E': return(6);break;
case 'T': return(7);break;
case 'F': return(8);break;
default : break;
}
}
char transferINTtoCHAR(int num)
{
switch(num)
{
case 0: return('(');break;
case 1: return('i');break;
case 2: return('*');break;
case 3: return('+');break;
case 4: return(')');break;
case 5: return('#');break;
case 6: return('E');break;
case 7: return('T');break;
case 8: return('F');break;
default : break;
}
}
int parser (void)
{
int i,k,r,NewVn;
i=0;
k=0;
stack[0]=5;
for(int count=i;count<strlen(character);count++)
printf("%c",transferINTtoCHAR(a[count]));
printf("\t\t\t");
for(int num=0;num<=k;num++)
printf("%c",transferINTtoCHAR(stack[num]));
do
{
printf("\n");
for(int count=i+1;count<strlen(character);count++)
printf("%c",transferINTtoCHAR(a[count]));
printf("\t\t\t");
int j;
r=a[i++];
if (IsVt(stack[k])) j=k;
else j=k-1;
while (prioriycmp(stack[j],r)==1)
{
int q;
do
{
q=stack[j];
if(IsVt(stack[j-1])) j--;
else j-=2;
}while (prioriycmp(stack[j],q)!=-1);
NewVn=Reduce(stack[j+1],stack[k],k-j);
k=j+1;
stack[k]=NewVn;
}
if(r!=5)
{
if (prioriycmp(stack[j],r)==-1||prioriycmp(stack[j],r)==0)
stack[++k]=r;
else return ERROR;
}
for(int num=0;num<=k;num++)
printf("%c",transferINTtoCHAR(stack[num]));
}while(r!=5);
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -