早教吧 育儿知识 作业答案 考试题库 百科 知识分享

构造算符优先分析器能够实现:输入文法,判断是否是算符文法!输出每个非终结符的FRISTVT集和LASTVT集!构造算符优先分析表!对输入的句子进行规约!以及输入的句子的分析过程

题目详情
构造算符优先分析器
能够实现:输入文法,判断是否是算符文法!输出每个非终结符的FRISTVT集和LASTVT集!构造算符优先分析表!对输入的句子进行规约!以及输入的句子的分析过程
▼优质解答
答案和解析
#include
#include
//
void error()
{
\x09printf("error!\n");
\x09exit(1);
}
char judge(char x,char y)
{
\x09int col;\x09\x09//分析表中的y所在的列号
\x09switch (y)
\x09{
\x09case '+':
\x09\x09col=0;
\x09\x09break;
\x09case '*':
\x09\x09col=1;
\x09\x09break;
\x09case 'i':
\x09\x09col=2;
\x09\x09break;
\x09case '(':
\x09\x09col=3;
\x09\x09break;
\x09case ')':
\x09\x09col=4;
\x09\x09break;
\x09case '#':
\x09\x09col=5;
\x09\x09break;
\x09default:
\x09\x09printf("y isn't in the analysis List!");
\x09}
\x09switch(x)
\x09{
\x09case '+':
\x09\x09return ConstList[0][col];
\x09case '*':
\x09\x09return ConstList[1][col];
\x09case 'i':
\x09\x09return ConstList[2][col];
\x09case '(':
\x09\x09return ConstList[3][col];
\x09case ')':
\x09\x09return ConstList[4][col];
\x09case '#':
\x09\x09return ConstList[5][col];
\x09default:
\x09\x09printf(" x isn't in the analysis List!");
\x09}
\x09return '$';//错误信息
\x09
}
char POP(struct stack *s)
{
\x09char ch;
\x09struct linkList *p;
\x09if(0==s->num)
\x09{
\x09\x09printf("pop error!\n");
\x09\x09return 0;
\x09}
\x09else
\x09{
\x09\x09s->num--;
\x09\x09ch=s->top->data;
\x09\x09p=s->top;
\x09\x09s->top=s->top->next;
\x09\x09free(p);
\x09\x09return ch;
\x09\x09
\x09}
}
void PUSH(struct stack *s,char ch)
{
\x09struct linkList *p;
\x09if(NULL==s->top)
\x09{
\x09\x09s->top=(struct linkList *)malloc (sizeof(struct linkList ));
\x09\x09s->top->data=ch;
\x09\x09s->top->next=NULL;
\x09\x09s->num=1;
\x09}
\x09else
\x09{
\x09\x09p=(struct linkList *)malloc (sizeof(struct linkList ));
\x09\x09p->data=ch;
\x09\x09p->next=s->top;
\x09\x09s->top=p;
\x09\x09s->num++;
\x09}
}
char head(struct stack *s)\x09\x09\x09//取栈顶元素
{
\x09if (s->num>0)
\x09{
\x09\x09return s->top->data;
\x09}
\x09else
\x09\x09return 0;
}
void enStack_Queue(struct stack *s,char ch)\x09\x09//按入队方式入栈
{
\x09struct linkList *p;
\x09if (NULL==s->top)
\x09{
\x09\x09s->top=(struct linkList *)malloc (sizeof(struct linkList ));
\x09\x09s->top->data=ch;
\x09\x09s->top->next=NULL;
\x09\x09s->num=1;
\x09\x09
\x09}
\x09else
\x09{
\x09\x09p=s->top;
\x09\x09while (NULL!=p->next)
\x09\x09{
\x09\x09\x09p=p->next;
\x09\x09}
\x09\x09p->next=(struct linkList *)malloc (sizeof(struct linkList ));
\x09\x09p->next->data=ch;
\x09\x09p->next->next=NULL;
\x09\x09s->num++;
\x09\x09
\x09}
}
char getStack(struct stack *s,int j)
{
\x09struct linkList *p;
\x09int c;
\x09int i=s->num-j;
\x09if (s->num>=j)
\x09{
\x09\x09p=s->top;
\x09\x09for (c=0;cnext;
\x09\x09}
\x09\x09return p->data;
\x09}
\x09else
\x09\x09return 0;
}
int isVT(char ch)\x09\x09\x09//是否是终极符
{
\x09int i;
\x09for(i=0;inum;i>0;i--)
\x09{
\x09\x09p=s->top;
\x09\x09for (c=0;cnext;
\x09\x09}
\x09\x09printf("%c",p->data);
\x09}
\x09printf("\t");
\x09
}
void showInput(struct stack *s)
{
\x09struct linkList *p;
\x09int i,c;
\x09for (i=0;inum;i++)
\x09{
\x09\x09p=s->top;
\x09\x09for (c=0;cnext;
\x09\x09}
\x09\x09printf("%c",p->data);
\x09}
}
void main()
{
\x09char ch;
\x09char a,Q;
\x09int k,j,pop_c,i,flag=0;
\x09int relation=0;
\x09struct stack *s_in=(struct stack *)malloc (sizeof(struct stack ));
\x09struct stack *s_an=(struct stack *)malloc (sizeof(struct stack ));
\x09s_an->top=NULL;
\x09s_in->top=NULL;
\x09printf("please input the string:");
\x09
\x09do
\x09{\x09
\x09\x09ch=getchar();
\x09\x09enStack_Queue(s_in,ch);
\x09}while ('#'!=ch);
\x09k=1;
\x09PUSH(s_an,'#');
\x09printf("栈\t当前符号\t剩余输入符\t优先关系\t移进或规约\n");
\x09do
\x09{
\x09\x09a=POP(s_in);\x09\x09//当前输入符读入a\x09\x09
\x09\x09do
\x09\x09{
\x09\x09\x09
\x09\x09\x09showAnalysis(s_an);
\x09\x09\x09printf("%c\t\t",a);
\x09\x09\x09showInput(s_in);
\x09\x09\x09if (isVT(getStack(s_an,k)))
\x09\x09\x09{
\x09\x09\x09\x09j=k;
\x09\x09\x09}
\x09\x09\x09else
\x09\x09\x09\x09j=k-1;
\x09\x09\x09if ('>'==judge(getStack(s_an,j),a))\x09\x09//s[j]>a
\x09\x09\x09{
\x09\x09\x09\x09printf("\t\t%c",'>');
\x09\x09\x09\x09printf("\t\t规约\n");
\x09\x09\x09\x09do
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09Q=getStack(s_an,j);
\x09\x09\x09\x09\x09if (isVT(getStack(s_an,j-1)))
\x09\x09\x09\x09\x09{
\x09\x09\x09\x09\x09\x09j--;
\x09\x09\x09\x09\x09}
\x09\x09\x09\x09\x09else
\x09\x09\x09\x09\x09\x09j=j-2;
\x09\x09\x09\x09} while (!('