您的位置:首页 > 其它

2016年秋季《编译原理》课程实验(2014级)表达式语法分析——递归子程序法

2016-11-15 11:27 423 查看
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int num;
stack<char> A;
stack<char> B;
int f(char x,char y)
{
if(x == 'E')
{
cout<<num<<" "<<"E-->TG"<<endl;
A.pop();
A.push('G');
A.push('T');
num++;
return 1;
}
else if(x == 'G'&&y=='+')
{
cout<<num<<" "<<"G-->+TG"<<endl;
A.pop();
A.push('G');
A.push('T');
A.push('+');
num++;
return 1;
}
else if(x == 'G'&&y!='+')
{
cout<<num<<" "<<"G-->&"<<endl;
A.pop();
num++;
return 1;
}
else if(x == 'T')
{
cout<<num<<" "<<"T-->FS"<<endl;
A.pop();
A.push('S');
A.push('F');
num++;
return 1;
}
else if(x =='S' && y == '*')
{
cout<<num<<" "<<"S-->*FS"<<endl;
A.pop();
A.push('S');
A.push('F');
A.push('*');
num++;
return 1;
}
else if(x =='S' && y !='*')//保持不变,E题不同
{
cout<<num<<" "<<"S-->&"<<endl;
A.pop();
num++;
return 1;
}
else if(x == 'F' && y == 'i')
{
cout<<num<<" "<<"F-->i"<<endl;
A.pop();
A.push('i');
num++;
return 1;
}
else if(x == 'F' && y == '(')
{
cout<<num<<" "<<"F-->(E)"<<endl;
A.pop();
A.push(')');
A.push('E');
A.push('(');
num++;
return 1;
}
else
{
if(x == y)
{

A.pop();
B.pop();
return 1;
}
else
{

return 0;
}
}
}
void reset()
{
num = 0;
while(!A.empty())
{
A.pop();
}
A.push('#');
A.push('E');
while(!B.empty())
{
B.pop();
}

}
int main()
{
string  s;
while(cin>>s)
{
reset();
int len =s.length();
for(int i = len -1;i >= 0;i--)
{
B.push(s[i]);
}

while(1)
{
if(A.top() == '#'&& B.top() == '#')
{
cout<<"accept"<<endl;
break;
}
else
{
int key = f(A.top(),B.top());
if(key == 0)
{
cout<<"error"<<endl;
break;
}
}
}

}
return 0;
}
//与E题不同也在G和S,为G时候不为‘+’,就G->&, S也一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: