PKU 2106 Boolean Expressions

http://poj.org/problem?id=2106
構文解析

優先順位付のやつだったので、stackとかを使わずに書こうとしたら案の定解析位置の移動があやふやになってかなり時間がかかりました。

string in;
int pos;

bool expr();

bool el(){
  bool ret;
  if(in[pos]=='('){
    ++pos;
    ret=expr();
    ++pos;
  }else if(in[pos]=='!'){
    ++pos;
    ret=!el();
  }else if(in[pos++]=='F')ret=false;
  else ret=true;
  
  return ret;
}

bool fact(){
  bool ret=el();
  
  while(pos<in.size() && in[pos]=='&'){
    ++pos;
    ret&=el();
  }
  return ret;
}

bool expr(){
  bool a=fact();
  while(pos<in.size() && in[pos]=='|'){
    ++pos;
    a|=fact();
  }
  return a;
}


main(){
  string temp;
  int e=0;
  while(getline(cin,temp)){
    ++e;
    pos=0;
    in="";
    rep(i,SZ(temp))if(temp[i]!=' ')in+=temp[i];
    cout<<"Expression "<<e<<": ";
    if(expr())cout<<'V';
    else cout<<'F';
    cout<<endl;
  }
}