E - 表达式语法分析——预测分析法

include<bits/stdc++.h>

using namespace std;
stack a;//非终结符栈(左栈)
stack b;//输入栈(右栈)
int num=1;//输出编号

int f(char at,char bt)
{
if(atbt)//匹配
{
a.pop();
b.pop();
return 1;
}
else if(at
'E')
{
if(bt'i'||bt'(')
{
cout<<num++<<" "<<"E->TG"<<endl;
a.pop();
a.push('G');
a.push('T');
return 1;
}
else
{
return 0;
}
}
else if(at'G')
{
if(bt
'+')
{
cout<<num++<<" "<<"G->+TG"<<endl;
a.pop();
a.push('G');
a.push('T');
a.push('+');
return 1;
}
else if(bt')'||bt'#')
{
cout<<num++<<" "<<"G->^"<<endl;
a.pop();
return 1;
}
else
{
return 0;
}
}
else if(at'T')
{
if(bt
'i'||bt'(')
{
cout<<num++<<" "<<"T->FS"<<endl;
a.pop();
a.push('S');
a.push('F');
return 1;
}
else
{
return 0;
}
}
else if(at
'S')
{
if(bt'+'||bt')'||bt'#')
{
cout<<num++<<" "<<"S->^"<<endl;
a.pop();
return 1;
}
else if(bt
'')
{
cout<<num++<<" "<<"S->
FS"<<endl;
a.pop();
a.push('S');
a.push('F');
a.push('*');
return 1;
}
else
{
return 0;
}
}
else if(at'F')
{
if(bt
'i')
{
cout<<num++<<" "<<"F->i"<<endl;
a.pop();
a.push('i');
return 1;
}
else if(bt=='(')
{
cout<<num++<<" "<<"F->(E)"<<endl;
a.pop();
a.push(')');
a.push('E');
a.push('(');
return 1;
}
else
{
return 0;
}
}
}

int main()
{
string s;
cin>>s;
int len=s.length();
for(int i=len-1;i>=0;i--)
{
b.push(s[i]);
}
a.push('#');
a.push('E');
while(1)
{
if(a.top()'#'&&b.top()'#')
{
cout<<"acc!"<<endl;
return 0;
}
else
{
int z=f(a.top(),b.top());
if(z==0)
{
cout<<"error!"<<endl;
return 0;
}
}
}
return 0;
}

posted @ 2025-11-18 08:45  W001hhhFA  阅读(0)  评论(0)    收藏  举报