早教吧作业答案频道 -->其他-->
构造算符优先分析器能够实现:输入文法,判断是否是算符文法!输出每个非终结符的FRISTVT集和LASTVT集!构造算符优先分析表!对输入的句子进行规约!以及输入的句子的分析过程
题目详情
构造算符优先分析器
能够实现:输入文法,判断是否是算符文法!输出每个非终结符的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 (!('
#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 (!('
看了 构造算符优先分析器能够实现:...的网友还看了以下:
计算方程组s=2(t-9)+3(t-5),s=(t+3)/2-(t+2)/3拜托了,答得好我一定加 2020-05-23 …
关系R.S如下表所示,元组演算表达式T={t|R(t)^?u(S(u)→[3]>u[1]运算的结果为 2020-05-26 …
已知函数y=f(x)在t=0处可导,且具有性质f(t+s)=(f(t)+f(s))/(1-f(t) 2020-06-08 …
如题,250khz的频率换算成周期是多少纳秒,如何换算,希望给出步骤带上单位.1/振荡器频率(hz 2020-06-09 …
原有一油滴静止在极板水平放置的平行板电容器中给电容器再充上一些电荷ΔQ油滴开始向上运动经t(s)后 2020-07-10 …
质点运动问题已知质点沿半径为40CM的圆做圆周运动,其运动规律:S=20t(s以cm计算,t以s计 2020-07-26 …
怎么计算二阶微分方程(mathematrica)我想用mathematica5来书写,但是我又不知 2020-07-31 …
若把(s+t)、(s-t)分别看作一个整体,指出下面式子中的同类项.1.3分之1(s+t)-5分之 2020-08-01 …
解微分方程:a∫∫s(t)=n+s(t)∫∫是双重积分号,a和n是常数,s(t)是待求解的函数这是 2020-08-02 …
求助几个vb问题(多选),1.vb中假设t,s,w分别为整型,字符型,逻辑型变量,且s=“ABC”在 2020-12-02 …