📄 算符优先.cpp
字号:
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#define max_id 256 //标识符最大长度;
#define stack_size 90 //栈的大小;
#define max_in 90 //输入存放数组的大小;
struct token{
char id;
char val[max_id];
}; //符号表表项的结构体定义;
char row[]={"+-*/()i$"};
int f[]={2,2,4,4,0,6,6,0};
int g[]={1,1,3,3,5,0,5,0};
int link(char c)
{ int i;
int a=strlen(row);
for(i=0;i<a;i++)
if(row[i]==c) return i;
return -1;
}
void main()
{ token temp[max_in];
char filename[40];
cout<<"请输入语法分析源文件的文件名及路径:";
cin>>filename;
ifstream infile(filename,ios::in);
cout<<"请输入语法分析过程描述文件的文件名及路径:";
cin>>filename;
ofstream outfile(filename,ios::out);
// infile>>temp.id>>temp.val;
char stack[stack_size]={'$'};
int top_ptr=0;
char inbuff[max_in]={'\0'};
int in_ptr=0;
outfile<<"栈"<<'\t'<<'\t'<<'\t'<<"输入"<<'\t'<<'\t'<<'\t'<<"动作"<<endl;
int i=0;
do{ infile>>temp[i].id>>temp[i].val;
if(temp[i].id=='#') break;
inbuff[i]=temp[i].id;
i++;
}while(1);
inbuff[i]='$';
outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<endl;
cout<<inbuff<<endl;
int flag;
while(1)
{ if(top_ptr==0&&inbuff[in_ptr]=='$')
break;
else
{ int m=link(stack[top_ptr]);
int n=link(inbuff[in_ptr]);
if(n==-1)
{ cout<<"出错!输入字符"<<inbuff[in_ptr]<<"为非法字符!"<<endl;
break;
}
if(f[m]<g[n]||f[m]==g[n])
{ top_ptr++;
stack[top_ptr]=inbuff[in_ptr];
inbuff[in_ptr]=' ';
in_ptr++;
outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<"移进"<<endl;
}
else if(f[m]>g[n])
{
while(1){
m=link(stack[top_ptr]);
stack[top_ptr]='\0';
top_ptr--;
n=link(stack[top_ptr]);
if(f[n]<g[m])
break;
};
outfile<<stack<<'\t'<<'\t'<<'\t'<<inbuff<<'\t'<<'\t'<<'\t'<<"规约"<<endl;
}
else
cout<<"出错!栈顶终结符与当前输入之间无优先关系!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -