U286287 表达式求值
题目背景
**时间限制:** 1.0 秒
**空间限制:** 512 MB
题目描述
在本题当中,你需要设法描述一个表达式的计算过程。这个表达式可能含有四则运算(加、减、乘、除,不会出现负号)、括号、函数调用(普通函数调用和成员函数调用),和一些常量。
例如,`(a+f((b-c+e)*d/c.h(d,d)).g(e)).g(d).h(f(a,c),f(b)/f(c),f(d))`就是一个可能出现的表达式,其中 `a`, `b`, `c`, `d`, `e` 是常量,`f` 是普通函数,`g`, `h` 是成员函数。
运算的优先级为:括号 > 函数调用 > 乘除法 > 加减法。注意运算的优先级的大小不代表计算顺序的先后。
你不需要求出这个表达式的具体值,你只需要描述它的计算过程,即将这个表达式分解为若干次四则运算与函数调用,且每次运算或调用的操作数都是常量或之前的运算或调用的结果。
你**可能**需要一些编译原理的相关知识来解决这道题目。
### 表达式的定义
首先,一个常量、普通函数、成员函数只可能是一个小写英文字母。在任何一个表达式中,一个字母至多只可能是常量、普通函数、成员函数的一种。
我们用递归的方式定义合法的表达式:
* 单独的一个常量是一个合法的表达式。
* 如果 `[EXPR]` 是一个合法的表达式,那么 `([EXPR])` 是一个合法的表达式,其值与 `[EXPR]` 相同。
* 如果 `[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` 是 $n$ 个合法的表达式($n$ 至少为 $1$),`[FUNC]` 是一个普通函数,那么 `[FUNC]([EXPR_1],[EXPR_2],……,[EXPR_n])` 是一个合法的表达式,其值为将 `[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` 依次作为参数,调用普通函数 `[FUNC]` 所得的结果。注意同一个函数在不同的调用中可能接受不同个数的参数。
* 如果 `[EXPR]` 是一个**上述三条规则和本条规则或只由本条规则**定义的一个合法的表达式,`[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` 是 $n$ 个合法的表达式($n$ 至少为 $1$),`[FUNC]` 是一个成员函数,那么 `[EXPR].[FUNC]([EXPR_1],[EXPR_2],……,[EXPR_n])` 是一个合法的表达式,其值为将 `[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` 依次作为参数,调用 `[EXPR]` 的成员函数 `[FUNC]` 所得的结果。注意同一个函数在不同的调用中可能接受不同个数的参数。
* 如果 `[EXPR_0]`、`[EXPR_1]`、……、`[EXPR_n]` 是 $n+1$ 个**上述四条规则**定义的合法的表达式($n$ 至少为 $1$),`[OPR_1]`、`[OPR_2]`、……、`[OPR_n]` 是 $n$ 个乘号或除号运算符,那么 `[EXPR_0][OPR_1][EXPR_1][OPR_2]……[OPR_n][EXPR_n]` 是一个合法的表达式,其值为将 `[EXPR_0]`、`[EXPR_1]`、……、`[EXPR_n]` 依次进行 `[OPR_1]`、`[OPR_2]`、……、`[OPR_n]` 运算的结果。
* 如果 `[EXPR_0]`、`[EXPR_1]`、……、`[EXPR_n]` 是 $n+1$ 个**上述五条规则**定义的合法的表达式($n$ 至少为 $1$),`[OPR_1]`、`[OPR_2]`、……、`[OPR_n]` 是 $n$ 个加号或减号运算符,那么 `[EXPR_0][OPR_1][EXPR_1][OPR_2]……[OPR_n][EXPR_n]` 是一个合法的表达式,其值为将 `[EXPR_0]`、`[EXPR_1]`、……、`[EXPR_n]` 依次进行 `[OPR_1]`、`[OPR_2]`、……、`[OPR_n]` 运算的结果。
* 只有符合以上几条定义的表达式才是合法的。
容易看到,这样定义的每个合法的表达式都有唯一一种解读方式,即不会引起歧义。
### 计算顺序的规定
上述规定确定了一个表达式的值,接下来我们确定一个表达式的求值顺序。我们用与定义类似的方式规定这个顺序:
* 对于单独的一个常量,不需要计算。
* 对于 `([EXPR])` ,只需计算 `[EXPR]` 。
* 对于 `[FUNC]([EXPR_1],[EXPR_2],……,[EXPR_n])` ,先依次计算 `[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` ,再调用 `[FUNC]` 。
* 对于 `[EXPR].[FUNC]([EXPR_1],[EXPR_2],……,[EXPR_n])` ,先依次计算 `[EXPR]`、`[EXPR_1]`、`[EXPR_2]`、……、`[EXPR_n]` ,再调用 `[FUNC]` 。
* 对于 `[EXPR_0][OPR_1][EXPR_1][OPR_2]……[OPR_n][EXPR_n]` (其中 `[OPR_1]`、`[OPR_2]`、……、`[OPR_n]` 全为乘除或全为加减),先计算 `[EXPR_0]` ,再计算 `[EXPR_1]` ,再调用 `[OPR_1]` 得出中间结果,再计算 `[EXPR_2]` ,再用上述中间结果和 `[EXPR_2]` 的结果调用 `[OPR_2]` ……直到计算完毕。
可以看出,除函数外,上述运算顺序均与我们日常使用的顺序相同;函数的运算顺序在不同的标准中不同,这里我们规定为从左至右。
输入格式
从标准输入读入数据。
输入文件只有一行(以换行符结束),只包含一个需要处理的表达式。
表达式的长度不超过 $100$ ,不会出现任何空格等多余字符。
输出格式
输出到标准输出。
按计算顺序输出每一次的运算符与函数调用。每次调用的参数只能是常量或之前某一次的运算结果,其中运算结果我们用从小到大的正整数依次表示。即:我们用单个英文字母(与输入中的相同)表示一个常量,用一个正整数表示之前某一次的运算结果,设第 $i$ 次的调用产生的结果为 $i$ 。
以下用 `[VALUE]` 表示一个参数,`[OPR]` 表示一个运算符,`[FUNC]` 表示一个函数。
如果是运算符调用,设这次要计算的是 `[VALUE_1][OPR][VALUE_2]` ,则你需要输出一行 `[OPR][空格][VALUE_1][空格][VALUE_2]` 。
如果是普通函数调用,设这次要计算的是 `[FUNC]([VALUE_1],[VALUE_2],……,[VALUE_n])` ,则你需要输出一行 `[FUNC][空格][VALUE_1][空格][VALUE_2][空格]……[空格][VALUE_n]` 。
如果是成员函数调用,设这次要计算的是 `[VALUE_0].[FUNC]([VALUE_1],[VALUE_2],……,[VALUE_n])` ,则你需要输出一行 `[FUNC][空格][VALUE_0][空格][VALUE_1][空格][VALUE_2][空格]……[空格][VALUE_n]` 。
说明/提示
### 样例 1 解释
```plain
- b c // 1 b-c
+ 1 e // 2 b-c+e
* 2 d // 3 (b-c+e)*d
h c d d // 4 c.h(d,d)
/ 3 4 // 5 (b-c+e)*d/c.h(d,d)
f 5 // 6 f((b-c+e)*d/c.h(d,d))
g 6 e // 7 f((b-c+e)*d/c.h(d,d)).g(e)
+ a 7 // 8 a+f((b-c+e)*d/c.h(d,d)).g(e)
g 8 d // 9 (a+f((b-c+e)*d/c.h(d,d)).g(e)).g(d)
f a c // 10 f(a,c)
f b // 11 f(b)
f c // 12 f(c)
/ 11 12 // 13 f(b)/f(c)
f d // 14 f(d)
h 9 10 13 14 // 15 (a+f((b-c+e)*d/c.h(d,d)).g(e)).g(d).h(f(a,c),f(b)/f(c),f(d))
```
### 数据范围
- 测试点 $1$:包含常量、加减号
- 测试点 $2$:包含常量、四则运算符
- 测试点 $3$:包含常量、加减号、括号
- 测试点 $4$:包含常量、四则运算符、括号
- 测试点 $5$:包含常量、普通函数调用
- 测试点 $6$:包含常量、成员函数调用
- 测试点 $7$:包含常量、普通函数调用、成员函数调用、括号
- 测试点 $8$:包含常量、四则运算符、普通函数调用、括号
- 测试点 $9$:包含常量、四则运算符、成员函数调用、括号
- 测试点 $10$:包含常量、四则运算符、普通函数调用、成员函数调用、括号