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

問題
解法
P,Q,Rの値の組み合わせの総数は3^3=27通りなのでそれぞれに対して、
真になるか判定する。
構文解析は初めてだったのでちょっとてこずった。

#include <cstdio>
#include <algorithm>
using namespace std;

int P, Q, R;
char f[81];
int p;

int formula(){
	int val1, val2, val;
	char c = f[p];
	char op;
	p++;
	if(c == 'P') return P;
	else if(c == 'Q') return Q;
	else if(c == 'R') return R;
	else if('0' <= c && c <= '2'){
		return c - '0';
	}else if(c == '-'){
		val = formula();
		if(val == 0)
			val = 2;
		else if(val == 2)
			val = 0;
		return val;
	}
	val1 = formula();
	op = f[p];
	p++;
	val2 = formula();
	p++;
	if(op == '*'){
		if(val1 == val2 && val1 == 2){
			val = 2;
		}else if(val1 == 0 || val2 == 0){
			val = 0;
		}else{
			val = 1;
		}
	}
	if(op == '+'){
		if(val1 == val2 && val1 == 0){
			val = 0;
		}else if(val1 == 2 || val2 == 2){
			val = 2;
		}else{
			val = 1;
		}
	}
	return val;
}
int main(){
	char c;
	int sum;
	while(scanf("%s", f)){
		if(f[0] == '.') break;
		scanf("%c", &c);
		sum = 0;
		for(P = 0; P < 3; P++){
			for(Q = 0; Q < 3; Q++){
				for(R = 0; R < 3; R++){
					p = 0;
					if(formula() == 2)
						sum++;
				}
			}
		}
		printf("%d\n", sum);
	}
	return 0;
}