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

📄 算符优先.cpp

📁 用SLR分析法实现的语法分析
💻 CPP
字号:
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#define max_id	256		//标识符最大长度;
#define stack_size	90	//栈的大小;
#define max_in  90    //输入存放数组的大小;
struct token{
char id;
char val[max_id];
};		//符号表表项的结构体定义;
char row[]={"+-*/()i$"};
int f[]={2,2,4,4,0,6,6,0};
int g[]={1,1,3,3,5,0,5,0};
int link(char c)
{	int i;
	int a=strlen(row);
	for(i=0;i<a;i++)
		if(row[i]==c)	return i;
	return -1;
}

void main()
{	token temp[max_in];
	char filename[40];
	cout<<"请输入语法分析源文件的文件名及路径:";
	cin>>filename;
	ifstream infile(filename,ios::in);
	cout<<"请输入语法分析过程描述文件的文件名及路径:";
	cin>>filename;
	ofstream outfile(filename,ios::out);
//	infile>>temp.id>>temp.val;
	char stack[stack_size]={'$'};
	int  top_ptr=0;
	char inbuff[max_in]={'\0'};
	int in_ptr=0;
	outfile<<"栈"<<'\t'<<'\t'<<'\t'<<"输入"<<'\t'<<'\t'<<'\t'<<"动作"<<endl;
	int i=0;

	do{	infile>>temp[i].id>>temp[i].val;
		if(temp[i].id=='#') break;
		inbuff[i]=temp[i].id;
		i++;
	}while(1);
	inbuff[i]='$';
	outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<endl;
	cout<<inbuff<<endl;
	int flag;
	while(1)
	{	if(top_ptr==0&&inbuff[in_ptr]=='$')
			break;
		else
		{	int m=link(stack[top_ptr]);
			int n=link(inbuff[in_ptr]);
			if(n==-1)
			{	cout<<"出错!输入字符"<<inbuff[in_ptr]<<"为非法字符!"<<endl;
				break;
			}
			if(f[m]<g[n]||f[m]==g[n])
			{	top_ptr++;
				stack[top_ptr]=inbuff[in_ptr];
				inbuff[in_ptr]=' ';
				in_ptr++;
				outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<"移进"<<endl;	
			}
			else if(f[m]>g[n])
			{	
				while(1){	
					m=link(stack[top_ptr]);
					stack[top_ptr]='\0';
					top_ptr--;
					n=link(stack[top_ptr]);
					if(f[n]<g[m])
						break;
					};
				outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<"规约"<<endl;
			}
			else
				cout<<"出错!栈顶终结符与当前输入之间无优先关系!"<<endl;
			
			
		
			
		}
		
	}	

}

⌨️ 快捷键说明

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