#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define del(a,b) memset(a,b,sizeof(a))
#define MOD 1000000007
#define LL long long
int T,len;
int a[110];//0 stand for num,1 stand for vec
char op[110];
LL dp[110][110][2];//dp[i][j][k]其中k=0时表示常数,k=1时表示向量,dp[i][j][k]表示从第i到第j项的运算结果为k的可能数
int n1,n2;
char s[100010];
int main(){
scanf("%d",&T);
getchar();
while(T--){
gets(s);
len=strlen(s);
n1=n2=0;
for(int i=0;i<len;){
if(s[i]>='0'&&s[i]<='9'){
a[n1++]=0;
while(s[i]>='0'&&s[i]<='9') i++;
}
else if(s[i]>='a'&&s[i]<='z'){
a[n1++]=1;
while(s[i]>='a'&&s[i]<='z') i++;
}
else op[n2++]=s[i++];
}
del(dp,0);
for(int i=0;i<n1;i++) dp[i][i][a[i]]=1;
for(int i=n1-1;i>=0;i--){
for(int j=i+1;j<n1;j++){
for(int k=i;k<j;k++){
if(op[k]=='*'){
dp[i][j][0]=(dp[i][j][0]+dp[i][k][0]*dp[k+1][j][0]%MOD)%MOD;
dp[i][j][1]=((dp[i][j][1]+dp[i][k][0]*dp[k+1][j][1]%MOD)%MOD+dp[i][k][1]*dp[k+1][j][0]%MOD)%MOD;
}
else if(op[k]=='.'){
dp[i][j][0]=(dp[i][j][0]+dp[i][k][1]*dp[k+1][j][1]%MOD)%MOD;
}
else if(op[k]=='^'){
dp[i][j][1]=(dp[i][j][1]+dp[i][k][1]*dp[k+1][j][1]%MOD)%MOD;
}
else if(op[k]=='!'){
dp[i][j][0]=(dp[i][j][0]+dp[i][k][1]*dp[k+1][j][1]%MOD)%MOD;
dp[i][j][1]=(((dp[i][j][1]+dp[i][k][0]*dp[k+1][j][0]%MOD)%MOD+dp[i][k][0]*dp[k+1][j][1]%MOD)%MOD+dp[i][k][1]*dp[k+1][j][0]%MOD)%MOD;
}
}
}
}
printf("%lld\n",(dp[0][n1-1][0]+dp[0][n1-1][1])%MOD);
}
return 0;
}
09-12
09-12