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

📄 main.cpp

📁 用递归向下文法做的2到10进制转换
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<math.h>
int   i=0,jsav,j=0,len,lensav,p=0;
typedef struct{
	double val;
	int   len;
}tab;
tab   L0,L1,A0,B0;
char  instring[20],oustring[20];
char  stack[20];
char  ch;
bool  m=true,n=true;
char * fp[]={"L-->BL","L-->.A","L-->ε","A-->BA","A-->ε","B-->0 ","B-->1 "};
void read();
void L();
void A();
void B();
bool error();
void print(const int k);
void s();
void s0(int &,int &);
void s1(int &,int &);
void s2(int &,int &);
void s3(int &,int &);
void s4(int &,int &);
void s5(int &,int &);
void s6(int &,int &);
void main()
{
	cout.width(50);
	cout.flags(ios::right);
	cout<<"二进制转换为十进制的编译程序"<<endl;
	cout<<"*******************************************************************************"<<endl;
    cout<<"词法分析用到的文法为:"<<endl;
	cout.width(20);
	cout.flags(ios::right);
	cout<<"L-->BL"<<endl;
    cout.width(20);
	cout.flags(ios::right);
   	cout<<"L-->.A"<<endl;
    cout.width(20);
	cout.flags(ios::right);
	cout<<"L-->ε"<<endl;
    cout.width(20);
	cout.flags(ios::right);
	cout<<"A-->BA"<<endl;
    cout.width(20);
	cout.flags(ios::right);
	cout<<"A-->ε"<<endl;
    cout.width(20);
	cout.flags(ios::right);
	cout<<"B-->0 "<<endl;
	cout.width(20);
	cout.flags(ios::right);
	cout<<"B-->1 "<<endl;
	cout<<"*******************************************************************************"<<endl;
    cout<<"请输入要转换的二进制数:";
	cin>>instring;
	cout<<"*******************************************************************************"<<endl;
	cout<<"开始词法分析:"<<endl;
    cout.width(20);
	cout.flags(ios::left);
	cout<<"符号栈";
    cout.width(20);
	cout.flags(ios::right);
	cout<<"输入字符串";
    cout.width(20);
	cout.flags(ios::right);
	cout<<"产生式"<<endl;
	lensav=len=strlen(instring);
	instring[len]='#';
	L();
	cout<<"*******************************************************************************"<<endl;
	cout<<"下面开始语义分析"<<endl;
	getchar();
	cout<<"中间代码为:"<<endl;
	L0.val=0;
	L1.len=0;
	L1.val=0;
	A0.val=0;
	s();
	getchar();
}
void read()
{
	ch=instring[i];
	i++;
}
void L()
{
	if(n==false) return;
	read();
	len=strlen(oustring);
	if(ch=='.'){
		for(;len>j;len--){
			oustring[len+1]=oustring[len];
		}
		jsav=j;
		A0.len=lensav-jsav;
		oustring[j]='.';
		oustring[j+1]='A';
		j++;
        print(1);
		stack[p++]='1';
		A();
	}
	else if(ch=='#'){
		oustring[j]=ch;
		print(2);
		stack[p++]='2';
		cout<<endl<<"词法分析成功!"<<endl;
		return;
	}
	else {
		for(;len>j;len--){
			oustring[len+1]=oustring[len];
		}
		oustring[j]='B';
		oustring[j+1]='L';
		print(0);
		stack[p++]='0';
		B();
		L();
	}
}
void A()
{
	if(n==false) return;
	read();
	len=strlen(oustring);
	if(ch=='#'){
		oustring[j]=ch;
		print(4);
		stack[p++]='4';
		cout<<endl<<"词法分析成功!"<<endl;
		return;
	}
	else {
		for(;len>j;len--){
			oustring[len+1]=oustring[len];
		}
		oustring[j]='B';
		oustring[j+1]='A';
		print(3);
		stack[p++]='3';
		B();
		A();
	}
}
void B()
{
	if(n==false) return;
	if(ch=='0'){
		oustring[j]=ch;
		j++;
		print(5);
		stack[p++]='5';
	}
	else if(ch=='1'){
		oustring[j]=ch;
		j++;
		print(6);
		stack[p++]='6';
	}
	else {
		n=error();
		return;
	}
}
bool error()
{
	cout<<"非法字符串!"<<endl;
	return false;
}
void print(const int k)
{
		instring[i-1]=' ';
		cout.width(20);
		cout.flags(ios::left);
		cout<<oustring;
		cout.width(20);
		cout.flags(ios::right);
		cout<<instring;
		cout.width(20);
		cout.flags(ios::right);
		cout<<fp[k]<<endl;
}
void s()
{
	int l=p,m=1,n=1;
	for(p=p-2;p>=0;p--){
		switch(stack[p])
		{
		 case'0':s0(m,n);break;
		 case'1':s1(m,n);break;
		 case'3':s3(m,n);break;
		 case'5':s5(m,n);break;
		 case'6':s6(m,n);break;
		 default:cout<<"语义分析错误"<<endl;n=false;return;
		}
	}
    switch(stack[l-1])
	{
		 case'2':s2(m,n);break;
	   	 case'4':s4(m,n);break;
	}
	cout<<"分析成功!"<<endl;
	cout<<"*******************************************************************************"<<endl;
	cout<<"输出结果:"<<L0.val<<endl;


}
void s0(int & m,int & n)
{
	L1.val=B0.val*pow(2,L1.len)+L1.val;
	L1.len=L1.len+1;
    cout<<n<<"(= ,LL,_ ,i)"<<endl;
	n++;
	cout<<n<<"(= ,1 ,_ ,T"<<m<<")"<<endl;
	n++;
	cout<<n<<"(j ,i,_ ,"<<n+4<<" )"<<endl;
	n++;
	cout<<n<<"(* ,2 ,T"<<m<<",T"<<m<<")"<<endl;
	n++;
	cout<<n<<"(- ,i ,1 ,i )"<<endl;
	n++;
	cout<<n<<"(jn,i ,_ ,"<<n-2<<" )"<<endl;
	m++;
    n++;
	cout<<n<<"(* ,B ,T"<<m-1<<",T"<<m<<")"<<endl;
	n++;
	m++;
	cout<<n<<"(+ ,T"<<m-1<<",L1 ,T"<<m<<")"<<endl;
	m++;
	n++;
	cout<<n<<"(= ,T"<<m-1<<",_ ,L1)"<<endl;
	n++;
    cout<<n<<"(+ ,LL,1 ,T"<<m<<")"<<endl;
	m++;
	n++;
    cout<<n<<"(= ,T"<<m-1<<",_ ,LL)"<<endl;
	n++;
}
void s1(int & m,int & n)
{

}
void s2(int & m,int & n)
{
	L0.val=L1.val;
	cout<<n<<"(= ,L1,_ ,L )"<<endl;
	n++;
}
void s3(int & m,int & n)
{
    A0.len=A0.len-1;
	A0.val=B0.val/pow(2,A0.len)+A0.val;
	cout<<n<<"- ,AL,1 ,T"<<m<<")"<<endl;
	n++;
	m++;
	cout<<n<<"= ,T"<<m-1<<"_ ,AL)"<<endl;
	n++;
    cout<<n<<"(= ,AL,_ ,i)"<<endl;
	n++;
	cout<<n<<"(= ,1 ,_ ,T"<<m<<")"<<endl;
	n++;
	cout<<n<<"(j ,i,_ ,"<<n+4<<" )"<<endl;
	n++;
	cout<<n<<"(* ,2 ,T"<<m<<",T"<<m<<")"<<endl;
	n++;
	cout<<n<<"(- ,i ,1 ,i )"<<endl;
	n++;
	cout<<n<<"(jn,i ,_ ,"<<n-2<<" )"<<endl;
	m++;
    n++;
	cout<<n<<"(/ ,B ,T"<<m-1<<",T"<<m<<")"<<endl;
	n++;
	m++;
	cout<<n<<"(+ ,T"<<m-1<<",A ,T"<<m<<")"<<endl;
	m++;
	n++;
	cout<<n<<"(= ,T"<<m-1<<",_ ,A )"<<endl;
	n++;
}
void s4(int & m ,int & n)
{
	L0.val=L1.val+A0.val;
	cout<<n<<"(+ ,L1,A ,T"<<m<<")"<<endl;
	n++;
	cout<<n<<"(= ,T"<<m<<",_ ,L )"<<endl;
	n++;
	m++;
}
void s5(int & m,int & n)
{
	B0.val=0;
	cout<<n<<"(= ,1 ,_ ,B )"<<endl;
	n++;
}
void s6(int & m,int & n)
{
	B0.val=1;
	cout<<n<<"(= ,1 ,_ ,B )"<<endl;
	n++;
}

⌨️ 快捷键说明

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