#include <stdio.h>
#include <string.h>

/* 三値論理の否定を計算する */
int tnot(int a) {
	return 2 - a;
}
/* 三値論理の積を計算する */
int tand(int a, int b) {
	return a < b ? a : b;
}
/* 三値論理の和を計算する */
int tor(int a, int b) {
	return a > b ? a : b;
}

/* 三値論理の式を計算する */
#define SIGN_NOT 3
#define SIGN_AND 4
#define SIGN_OR 5
#define SIGN_LEFT_PAREN 6
#define SIGN_RIGHT_PAREN 7
int calculate(const char *formula, int n, int p, int q, int r) {
	int stack[81];
	int size = 0;
	int i;

	for (i = 0; i < n; i++) {
		/* 式を1文字読む */
		switch (formula[i]) {
			case '-': stack[size] = SIGN_NOT; break;
			case '*': stack[size] = SIGN_AND; break;
			case '+': stack[size] = SIGN_OR; break;
			case '(': stack[size] = SIGN_LEFT_PAREN; break;
			case ')': stack[size] = SIGN_RIGHT_PAREN; break;
			case 'P': stack[size] = p; break;
			case 'Q': stack[size] = q; break;
			case 'R': stack[size] = r; break;
			default: stack[size] = formula[i] - '0'; /* 値 */
		}
		size++;

		/* 構文に一致する箇所がなくなるまで処理する */
		int b = 1;
		while (b) {
			b = 0;
			/* 構文に一致する箇所を計算する */
			if (size >= 2 && stack[size-2] == SIGN_NOT && (stack[size-1] >= 0 && stack[size-1] <= 2)) {
				/* 否定 */
				stack[size-2] = tnot(stack[size-1]);
				size--;
				b = 1;
			} else if (size >= 5 && stack[size-5] == SIGN_LEFT_PAREN  && stack[size-1] == SIGN_RIGHT_PAREN) {
				if (stack[size-3] == SIGN_AND) {
					/* 論理積 */
					stack[size-5] = tand(stack[size-4], stack[size-2]);
					size -= 4;
					b = 1;
				} else if (stack[size-3] == SIGN_OR) {
					/* 論理和 */
					stack[size-5] = tor(stack[size-4], stack[size-2]);
					size -= 4;
					b = 1;
				}
			}
		}
	}

	return stack[0];
}

int main(void) {
	char s[81];
	int i, l, n;

	/* データセット毎の処理 */
	while (scanf("%s", s) == 1 && s[0] != '.') {
		l = strlen(s); /* 式の長さ */
		n = 0;
		/* (P,Q,R) を総当たりで調べ計算結果が 2 となる場合の数を数える */
		for (i = 0; i < 3 * 3 * 3; i++) {
			if (calculate(s, l, (i / 3 / 3) % 3, (i / 3) % 3, i % 3) == 2) n++;
		}
		printf("%d\n", n);
	}

	return 0;
}