📄 main.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 + -