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