AOJ 1155 How can I satisfy thee? Let me count the ways...

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1155
構文解析する問題。
BNFが与えられているのでそれに従って書けばいい。

解析位置の移動に戸惑いました。
自分で書くのは楽しいけれどもあまり読み易くない感じのコード。

string in;
int pos;
int p,q,r;

int formula(){
  if(isdigit(in[pos])){
    return in[pos++]-'0';
  }

  switch(in[pos]){
  case 'P':++pos; return p;
  case 'Q':++pos; return q;
  case 'R':++pos; return r;
  }

  if(in[pos]=='-'){
    ++pos;
    return 2-formula();
  }
  ++pos;
  int a=formula();
  char cc=in[pos++];
  int b=formula();
  pos++;
  if(cc=='+'){
    if(a==2 || b==2)return 2;
    if(!a && !b)return 0;
    return 1;
  }
  if(!a || !b)return 0;
  if(a==2 && b==2)return 2;
  return 1;
}


main(){
  while(cin>>in){
    if(in==".")break;
    int ans=0;
    for(p=0;p<3;p++)for(q=0;q<3;q++)for(r=0;r<3;r++){
      pos=0;
      if(formula()==2)++ans;
    }
    cout<<ans<<endl;
  }
}