⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 suanfu.txt

📁 编译原理第二个试验用算符优先分析算法试验文法的分析功能
💻 TXT
字号:
#include<iostream>
#include<malloc.h>
#include<cstring>
#include<iomanip>
using namespace std;
bool pd();
void pd1();
void pd2();
void bj();
int bj1(char ch);
void showstack();
int k,j,step=0;
int sign;
char Stack[100];
char a,Q;
char Vn[5]={'e','E','T','F','P'};
//char *Vt[7]={"+","*","^","i","(",")","#"};
char Vt[7]={'+','*','^','i','(',')','#'};
char table[7][7]=
{
	                '>','<','<','<','<','>','>',
					'>','>','<','<','<','>','>',
					'>','>','<','<','<','>','>',
					'>','>','>','$','$','>','>',
					'<','<','<','<','<','=','$',
					'>','>','>','$','$','>','>',
					'<','<','<','<','<','$','=',
};
char *P[]={"e->#E#","E->E+T","E->T","T->T*F","T->F","F->P^F","F->P","P->(E)","P->i"};
//判断是否是终结符
bool pd(char a)
{
	if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||a==')'||a=='#')
		return 1;
	else
		return 0;
}
//根据算符优先表比较匹配
void bj()
{
	int m=bj1(Stack[j]);
	int n=bj1(a);
	if(table[m][n]=='>')
	{
		Q=Stack[j];
	    pd2();
        m=bj1(Stack[j]);
		n=bj1(Q);
		if(table[m][n]=='<')
		{
			sign=2;
		    showstack();
			k=j+1;
		    Stack[k]='N';
			pd1();
		}
        else
		{
			Q=Stack[j];
		    pd2();
		}
	}
	else if(table[m][n]=='<')
	{
		sign=1;
	    showstack();
		k=k+1;
	    Stack[k]=a;
		a=getchar();
		pd1();
	}
	else if(table[m][n]=='=')
	{
		m=bj1(Stack[j]);
		n=bj1('#');
		if(table[m][n]=='=')
		{
			sign=3;
			showstack();
            cout<<"  正确!  "<<endl;
		}
		else
		{
			showstack();
		    k=k+1;
		    Stack[k]=a;
			a=getchar();
			pd1();
		}
	}
	else
	{
		showstack();
		cout<<" error!"<<endl;
	}
}
int bj1(char ch)
{
	if(ch=='+')
		return 0;
	else if(ch=='*')
		return 1;
	else if(ch=='^')
		return 2;
	else if(ch=='i')
		return 3;
	else if(ch=='(')
		return 4;
	else if(ch==')')
		return 5;
	else if(ch=='#')
		return 6;
}
//
void pd1()
{
	if(pd(Stack[k])==1)
		j=k;
	else
		j=k-1;
	bj();
}
void pd2()
{
	if(pd(Stack[j-1])==1)
		j=j-1;
	else
		j=j-2;
}
void showstack()
{
	step++;
	if(step==1)
		cout<<"\n  步骤 当前符号 移进或规约 符号栈\n";
	cout<<"   "<<setw(2)<<step<<"     "<<a<<"        ";
	if(sign==1)
		cout<<"移进    ";
	else if(sign==2)
		cout<<"归约    ";
	else if(sign==3)
		cout<<"接受    ";
	for(int n=0;n<=k;n++)
	{
		cout<<Stack[n];
	}
	cout<<endl;
}

void main()
{
	cout<<"---->给定文法为:<-----\n"<<endl;
	for(int i=0;i<9;i++)
	{
		cout<<"        "<<P[i]<<endl;
	}
	cout<<"---->算符优先关系表为:<----\n"<<endl;
	for(int j=0;j<7;j++)
	{
		cout<<setw(3)<<Vt[j];
	}
	cout<<endl;
	for(int m=0;m<7;m++)
	{
		cout<<Vt[m];
		for(int n=0;n<7;n++)
		{
			if(table[m][n]!='$')
				cout<<setw(3)<<table[m][n];
			else
				cout<<setw(3)<<"";
		}
		cout<<endl;
	}
	cout<<"---->请输入表达式<----"<<endl;
	k=0;
	Stack[k]='#';
    a=getchar();
	sign=1;
	pd1();
        
}
//char *P[]={"#E#","E+T","T","T*F","F","P^F","P","(E)","i"};
//char number[5][2]={1,0,2,3,4,5,6,7,8,9};
/*void main()
{
	for(int i=0;i<5;i++)
	{
		for(int j=0;j<2;j++)
		{
			if(number[i][j]!=0)
			{
				cout<<"      "<<Vn[i]<<"->"<<P[number[i][j]-1]<<endl;
			}
		}
	}
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -