#include<iostream.h>
char a[4][4]={' ','a','b','c','a','>','<','<','b','>','>','<','c','>','>','<'};
int f(char m);
int g(char n);
int max(int x,int y)
{return (x>y?x:y);}
int f(char m)
{
int fa=1;
int fb=1;
int fc=1;
int ga,gb,gc;
if(m=='a')
{
for(int j=1;j<4;j++)
if(a[1][j]=='>'&&j==1)
{
ga=g('a');
if(fa<=ga) fa=ga+1;
}
if(a[1][j]=='>'&&j==2)
{
gb=g('b');
if(fa<=gb) fa=gb+1;
}
if(a[1][j]=='>'&&j==3)
{
gc=g('c');
if(fa<=gc) fa=gc+1;
}
if(a[1][j]=='<'&&j==1)
{
ga=g('a');
if(fa>=ga) fa=ga-1;
}
if(a[1][j]=='<'&&j==2)
{
gb=g('b');
if(fa>=gb) fa=gb-1;
}
if(a[1][j]=='<'&&j==3)
{
gc=g('c');
if(fa>=gc) fa=gc-1;
}
if(a[1][j]=='='&&j==1)
{
ga=g('a');
fa=max(fa,ga);
}
if(a[1][j]=='='&&j==2)
{
gb=g('b');
fa=max(fa,gb);
}
if(a[1][j]=='='&&j==3)
{
gc=g('c');
fa=max(fa,gc);
}
return fa;
}
if(m=='b')
{
for(int j=1;j<4;j++)
if(a[2][j]=='>'&&j==1)
{
ga=g('a');
if(fb<=ga) fb=ga+1;
}
if(a[2][j]=='>'&&j==2)
{
gb=g('b');
if(fb<=gb) fb=gb+1;
}
if(a[2][j]=='>'&&j==3)
{
gc=g('c');
if(fb<=gc) fb=gc+1;
}
if(a[2][j]=='<'&&j==1)
{
ga=g('a');
if(fb>=ga) fb=ga-1;
}
if(a[2][j]=='<'&&j==2)
{
gb=g('b');
if(fb>=gb) fb=gb-1;
}
if(a[2][j]=='<'&&j==3)
{
gc=g('c');
if(fb>=gc) fb=gc-1;
}
if(a[2][j]=='='&&j==1)
{
ga=g('a');
fb=max(fb,ga);
}
if(a[2][j]=='='&&j==2)
{
gb=g('b');
fb=max(fb,gb);
}
if(a[2][j]=='='&&j==3)
{
gc=g('c');
fb=max(fb,gc);
}
return fb;
}
if(m=='c')
{
for(int j=1;j<4;j++)
if(a[3][j]=='>'&&j==1)
{
ga=g('a');
if(fc<=ga) fc=ga+1;
}
if(a[3][j]=='>'&&j==2)
{
gb=g('b');
if(fc<=gb) fc=gb+1;
}
if(a[3][j]=='>'&&j==3)
{
gc=g('c');
if(fc<=gc) fc=gc+1;
}
if(a[3][j]=='<'&&j==1)
{
ga=g('a');
if(fc>=ga) fc=ga-1;
}
if(a[3][j]=='<'&&j==2)
{
gb=g('b');
if(fc>=gb) fc=gb-1;
}
if(a[3][j]=='<'&&j==3)
{
gc=g('c');
if(fc>=gc) fc=gc-1;
}
if(a[3][j]=='='&&j==1)
{
ga=g('a');
fc=max(fc,ga);
}
if(a[3][j]=='='&&j==2)
{
gb=g('b');
fc=max(fc,gb);
}
if(a[3][j]=='='&&j==3)
{
gc=g('c');
fc=max(fc,gc);
}
return fc;
}
}
int g(char n)
{
int ga=1;
int gb=1;
int gc=1;
int fa,fb,fc;
if(n=='a')
{
for(int i=1;i<4;i++)
if(a[i][1]=='>'&&i==1)
{
fa=f('a');
if(fa<=ga) ga=fa-1;
}
if(a[i][1]=='>'&&i==2)
{
fb=f('b');
if(fb<=ga) ga=fb-1;
}
if(a[i][1]=='>'&&i==3)
{
fc=f('c');
if(fc<=ga) ga=fc-1;
}
if(a[i][1]=='<'&&i==1)
{
fa=f('a');
if(fa>=ga) ga=fa+1;
}
if(a[i][1]=='<'&&i==2)
{
fb=f('b');
if(fb>=ga) ga=fb+1;
}
if(a[i][1]=='<'&&i==3)
{
fc=f('c');
if(fc>=ga) ga=fc+1;
}
if(a[i][1]=='='&&i==1)
{
fa=f('a');
ga=max(ga,fa);
}
if(a[i][1]=='='&&i==2)
{
fb=f('b');
ga=max(ga,fb);
}
if(a[i][1]=='='&&i==3)
{
fc=f('c');
ga=max(ga,fc);
}
return ga;
}
if(n=='b')
{
for(int i=1;i<4;i++)
if(a[i][2]=='>'&&i==1)
{
fa=f('a');
if(fa<=gb) gb=fa-1;
}
if(a[i][2]=='>'&&i==2)
{
fb=f('b');
if(fb<=gb) gb=fb-1;
}
if(a[i][2]=='>'&&i==3)
{
fc=f('c');
if(fc<=gb) gb=fc-1;
}
if(a[i][2]=='<'&&i==1)
{
fa=f('a');
if(fa>=gb) gb=fa+1;
}
if(a[i][2]=='<'&&i==2)
{
fb=f('b');
if(fb>=gb) gb=fb+1;
}
if(a[i][2]=='<'&&i==3)
{
fc=f('c');
if(fc>=gb) gb=fc+1;
}
if(a[i][2]=='='&&i==1)
{
fa=f('a');
gb=max(gb,fa);
}
if(a[i][2]=='='&&i==2)
{
fb=f('b');
gb=max(gb,fb);
}
if(a[i][2]=='='&&i==3)
{
fc=f('c');
gb=max(gb,fc);
}
return gb;
}
if(n=='c')
{
for(int i=1;i<4;i++)
if(a[i][3]=='>'&&i==1)
{
fa=f('a');
if(fa<=gc) gc=fa-1;
}
if(a[i][3]=='>'&&i==2)
{
fb=f('b');
if(fb<=gc) gc=fb-1;
}
if(a[i][3]=='>'&&i==3)
{
fc=f('c');
if(fc<=gc) gc=fc-1;
}
if(a[i][3]=='<'&&i==1)
{
fa=f('a');
if(fa>=gc) gc=fa+1;
}
if(a[i][3]=='<'&&i==2)
{
fb=f('b');
if(fb>=gc) gc=fb+1;
}
if(a[i][3]=='<'&&i==3)
{
fc=f('c');
if(fc>=gc) gc=fc+1;
}
if(a[i][3]=='='&&i==1)
{
fa=f('a');
gc=max(gc,fa);
}
if(a[i][3]=='='&&i==2)
{
fb=f('b');
gc=max(gc,fb);
}
if(a[i][3]=='='&&i==3)
{
fc=f('c');
gc=max(gc,fc);
}
return gc;
}
}
void main()
{
cout<<"算符优先分析表:"<<endl;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
cout<<a[i][j];
cout<<" ";
if (j==3) cout<<endl;
}
cout<<"算符优先函数:"<<endl;
cout<<f('a')<<endl;
}