#include <stdio.h>
#include <string.h>
#define NLINE 17
// 
式の行数の最大値
#define LEN 9
// 
式の１行の長さの最大値
int n;
// 
式の行数
char buff[NLINE][LEN+1];
// 
式を格納する配列
// line
行目を評価して値を返す関数
int calc(int line)
{
char c;
// 
処理内容を示す文字（数字
, *, +
）
int level;
// 
現在の行の入れ子レベル
int val;
// 
評価結果を入れる変数
int arg;
// 
演算の引数の値を入れる変数
level = strlen(buff[line]) 
-
1;
// 
自分の入れ子レベル
c = buff[line][level];
// c
はこのレベルでの処理内容
switch(c){
case '*':
// 
乗算
line++;
// 
次の行から引数の値を順に評価
val = 1;
// 
とりあえず結果を
1
とする
for(;;){
if(strlen(buff[line])
-
1 <= level) break;
// 
引数の評価は終了
if(strlen(buff[line])
-
1 == level+1){
// 
評価すべきレベルなら
arg = calc(line);
// 
引数の値を再帰的に求め
val *= arg;
// val 
にかける。
}
line++;
// 
次の行へ
if(line >= n) break;
// 
全ての行をチェックした！
}
return val;
// 
評価結果を返す
case '+':
// 
加算
line++;
// 
次の行から引数の値を順に評価
val = 0;
// 
とりあえず結果を
0
とする
for(;;){
if(strlen(buff[line])
-
1 <= level) break;
// 
引数の評価は終了
if(strlen(bu
ff[line])
-
1 == level+1){
// 
評価すべきレベルなら
arg = calc(line);
// 
引数の値を再帰的に求め
val += arg;
// val 
にたす。
}
line++;
// 
次の行へ
if(line >= n) break;
// 
全ての行をチェックした！
}
return val;
// 
評価結果を返す
default:
// 
１桁の整数
return c 
-
'0'
;
// 
対応する整数値を返す
}
}
int main(void)
{
for(;;){
int i;
scanf("%d", &n);
// 
式の行数
n
を読み込む
if(n==0) break;
// n
が
0
なら終了
for(i=0; i<n; i++)
// n
行分の式を読み込む
scanf("%s", &buff[i][0]);
printf("%d
¥
n", calc(0));
// 
式を評価した結果をプリント
}
}
