📄 制导翻译.cpp
字号:
#include "function.h"
const int maxsize=100;
void main()
{
char input[maxsize],a[maxsize/10];
stack1 snum,sop,svar,s;
stack2 sobj;
int len,pos=0,length,type,i,j,flag,k,num=0,outs;
node ntemp;
cout<<"请输入一个算术表达式!平方为符号'^'!"<<endl;
cin>>input;
out(80,'~');
length=int(strlen(input));
input[length]='#';
length++;
input[length]='\0';
ntemp.namelen=1;
ntemp.name[0]='#';
ntemp.name[1]='\0';
ntemp.value=-1;
ntemp.encode=0;
s.push(ntemp);
while(pos<length)
{
type=getword(input,a,len,pos);
ntemp.namelen=len;
ntemp.encode=type;
for(i=0;i<len;i++)
ntemp.name[i]=a[i];
ntemp.name[len]='\0';
flag=1;
if(type==1)//读取的单词为数字
{
int sum=0;
for(i=0;i<len;i++)
{
sum*=10;
sum+=a[i]-'0';
}
ntemp.value=sum;
int temp=snum.search(a,len,flag);
if(temp==-1&&flag==0)
snum.push(ntemp);
}
else
if(type==0)//读取的单词为操作符
{
ntemp.value=-1;
int temp=sop.search(a,len,flag);
if(temp==-1&&flag==0)
sop.push(ntemp);
}
else
if(type==2)//读取的为一个变量
{
cout<<"警告!读入了未初始化的变量:"<<a<<",默认值是:-1"<<endl;
ntemp.value=-1;
int temp=svar.search(a,len,flag);
if(temp!=-1||temp==-1&&flag==1)
{
cout<<"变量重复定义!"<<endl;
exit(0);
}
svar.push(ntemp);
}
else
if(type==5)
{
cout<<"输入有错误,在第 "<<pos<<" 个字符:"<<input[pos-1]<<endl;
exit(0);
}
k=s.getsize()-1;
if(nodeisvt(s.peek(k)))
j=k;
else
j=k-1;
while(chisvt(a)&&getrank(s.peek(j).name,a)==1)
{
int h=j,low=j-1;
if(!nodeisvt(s.peek(low)))
low--;
while(getrank(s.peek(low).name,s.peek(h).name)!=-1)
{
h=low;
low--;
if(!nodeisvt(s.peek(low)))
low--;
}
h=s.getsize()-1;
low++;
int lens=h-low+1;
node ch[4];
for(int p=0;p<lens;p++)
ch[lens-1-p]=s.pop();
if(lens>0)
{
outs=s.peekall();
if(outs<20)
out(20-outs,' ');
cout<<"弹出:";
for(p=0;p<lens;p++)
cout<<ch[p].name;
cout<<endl;
}
node c=guiyue(ch,lens,snum,svar,s,num);
outs=s.peekall();
if(outs<20)
out(20-outs,' ');
cout<<"压入:"<<c.name<<endl;
j=s.getsize()-1;
if(!nodeisvt(s.peek(j)))
j--;
}
if(chisvt(a)&&getrank(s.peek(j).name,a)==2)
{
cout<<"你的输入有错误,错误为第 "<<s.getsize()-1<<"个字符处 :"<<a<<endl;
exit(0);
}
else
{
s.push(ntemp);
outs=s.peekall();
if(outs<20)
out(20-outs,' ');
cout<<"进栈:"<<ntemp.name<<endl;
}
}
out(80,'-');cout<<endl;
cout<<"下面是结果:"<<endl;
cout<<input<<'\b'<<"="<<s.peek(1).value<<endl;
out(80,'-');cout<<endl;
cout<<"下面是常数表:"<<endl;
out(60,'*');cout<<endl;
for(i=0;i<snum.getsize();i++)
cout<<snum.peek(i).name<<"------------> "<<snum.peek(i).value<<endl;
out(60,'*');cout<<endl<<endl;
cout<<"下面是变量表:"<<endl;
out(60,'^');cout<<endl;
for(i=0;i<svar.getsize();i++)
cout<<svar.peek(i).name<<"------------> "<<svar.peek(i).value<<endl;
out(60,'^');cout<<endl;
cin>>i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -