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

📄 srl1.cpp

📁 基于slr文法的语句分析,输出四元式,并判断语句是否符合文法要求
💻 CPP
字号:
#include <math.h>
#include <iostream.h>
#define eor -1
#define acc -2
char prog[80];
int p,top_t,top_b;
int state_s[80];
char symbol_s[80];

int table[9][7]={
{eor,8  ,eor,1  ,5  ,eor,2  },
{eor,eor,acc,eor,eor,eor,eor},
{3  ,eor,eor,eor,eor,eor,eor},
{eor,8  ,eor,eor,5  ,eor,4  },
{eor,eor,11 ,eor,eor,eor,eor},
{14 ,8  ,14 ,eor,5  ,6  ,7  },
{12 ,eor,12 ,eor,eor,eor,eor},
{13 ,eor,13 ,eor,eor,eor,eor},
{15 ,15 ,15 ,eor,eor,eor,eor}
};
/*
符号     .    num  $    S    B    K    I
index    0    1    2    3    4    5    6
*/
char a;              //输入符号读入a
int a_index;         //符号a对应的index  (index是便于查表用的编号)
int s,time,flag_dot; //s等于状态栈当前栈顶的状态,time,flag_dot在语义分析是有用
int sum1,sum2,range,flag;
void SRL1()
{
	p=0;s=0;time=0;sum1=0;sum2=0;flag_dot=0;range=1;flag=0;
	state_s[0]=0;top_t=1;            //初始状态进状态栈
	symbol_s[0]='$';top_b=1;         //初始符号进符号栈
	a=prog[p++];
	if(a>='0'&&a<='9')a_index=1;
	else if(a=='.')a_index=0;
	else if(a=='$')a_index=2;
	else {
		cout<<"错误:存在无法识别字符:"<<a<<endl;
		return;
	}
	while(table[s][a_index]!=acc)
	{
		if(table[s][a_index]>=0&&table[s][a_index]<=8)
		{
			s=table[s][a_index];
			state_s[top_t++]=s;
			symbol_s[top_b++]=a;
			a=prog[p++];
			if(a>='0'&&a<='9')a_index=1;
			else if(a=='.')a_index=0;
			else if(a=='$')a_index=2;
			else {
				cout<<"错误:存在无法识别字符:"<<a<<endl;
				break;
			}
		}
		else if(table[s][a_index]>=11&&table[s][a_index]<=15)
		{
			if(table[s][a_index]==11){
				top_t-=3;top_b-=3;
				s=table[state_s[top_t-1]][3];
				state_s[top_t++]=s;
				symbol_s[top_b++]='S';
			}
			else if(table[s][a_index]==12){
				top_t-=2;top_b-=2;
				s=table[state_s[top_t-1]][6];
				state_s[top_t++]=s;
				symbol_s[top_b++]='I';
				///////////////////////////////
				if(top_b==3){flag_dot=1;time=0;}
				///////////////////////////////
			}
			else if(table[s][a_index]==13){
				top_t-=1;top_b-=1;
				s=table[state_s[top_t-1]][5];
				state_s[top_t++]=s;
				symbol_s[top_b++]='K';
			}
			else if(table[s][a_index]==14){
				top_t-=0;top_b-=0;
				s=table[state_s[top_t-1]][5];
				state_s[top_t++]=s;
				symbol_s[top_b++]='K';
			}
			else if(table[s][a_index]==15){
				///////////////////////////
				if(flag_dot==0)
					sum1=symbol_s[top_b-1]-'0'+sum1*10;
				else {
					sum2=symbol_s[top_b-1]-'0'+sum2*10;
					range*=10;
				}
				time++;
				///////////////////////////
				top_t-=1;top_b-=1;
				s=table[state_s[top_t-1]][4];
				state_s[top_t++]=s;
				symbol_s[top_b++]='B';
			}
			else {
				cout<<"error"<<endl;
				break;
			}
		}
		else if(table[s][a_index]==eor)
		{
			cout<<"ERROR!"<<endl;
			break;
		}
	}//while
	if(table[s][a_index]==acc){
		cout<<"SUCCESS!"<<endl;
		flag=1;
	}
}

void show()
{
	//显示整数部分
	int flag=0;
	int size=8*sizeof(int);
	unsigned int mask=1;
	int i;
	for(i=size-1;!flag;i--)flag=sum1&(mask<<i);
	i++;
	while(i>=0){
		if(sum1&(mask<<i))cout<<'1';
		else cout<<'0';
		i--;
	}
	cout<<'.';
	//显示小数部分
	if(sum2==0)cout<<'0';
	for(int k=1;k<=10&&sum2;k++)
	{
		sum2*=2;
		if(sum2>=range){
			sum2-=range;
			cout<<'1';
		}
		else cout<<'0';
	}
	cout<<endl;
}

void main()
{
	cin.getline(prog,80);
	SRL1();
	if(flag)show();
}

⌨️ 快捷键说明

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