假设某语言的表达式遵循如下的结合性和优先级规则: 优先级 最高 +,- *,/ 最低 **(乘方) 结合性 从右到左 +,-,*,/ 从左到右 ** (1)请写出下列表达式的运算顺序,以标注序号的括号表示,如表达式x + y – z * s 的运算顺序为:( (x + (y–z)1)2 * s)3 (i) a * b – c / d + a ** b ** c ** d (ii) a ** b + c ** d / a ** b + c ** d (iii) a * b + c ** d ** e (iv) (a * b) + c ** (d ** e) (2)请写出计算这些表达式的无二义文法,并写出表达式1+2*3**3**2-1的语法树。
时间: 2023-07-01 07:11:43 浏览: 81
(1)(i) a * b ** c ** d - c / d + a ** b ** c ** d 的运算顺序为:((a + ((b ** (c ** d)) - (c / d))) ** (b ** (c ** d))) + a
运算顺序解释:
- 先计算 b ** c ** d,得到一个指数运算的结果
- 将 a 与上一步的结果相加,得到一个加法运算的结果
- 将 c 除以 d,得到一个除法运算的结果
- 将上一步的结果减去上一步的加法运算结果,得到一个减法运算的结果
- 将上一步的减法运算结果与 b ** c ** d 做指数运算,得到一个指数运算的结果
- 将上一步的指数运算结果与 a 做加法运算,得到最终结果
(ii) a ** b + c ** d / a ** b + c ** d 的运算顺序为:((a ** b) + ((c ** d) / (a ** b))) + (c ** d)
运算顺序解释:
- 先计算 a ** b,得到一个指数运算的结果
- 将 c ** d 除以 a ** b,得到一个除法运算的结果
- 将上一步的除法运算结果与 a ** b 做加法运算,得到一个加法运算的结果
- 将上一步的加法运算结果与 c ** d 做加法运算,得到最终结果
(iii) a * b + c ** d ** e 的运算顺序为:a * b + (c ** (d ** e))
运算顺序解释:
- 先计算 d ** e,得到一个指数运算的结果
- 将 c 与上一步的结果相连,得到一个指数运算的结果
- 将 a 与 b 做乘法运算,得到一个乘法运算的结果
- 将上一步的乘法运算结果与上一步的指数运算结果做加法运算,得到最终结果
(iv) (a * b) + c ** (d ** e) 的运算顺序为:(a * b) + (c ** (d ** e))
运算顺序解释:
- 先计算 d ** e,得到一个指数运算的结果
- 将 c 与上一步的结果相连,得到一个指数运算的结果
- 将 a 与 b 做乘法运算,得到一个乘法运算的结果
- 将上一步的乘法运算结果与上一步的指数运算结果做加法运算,得到最终结果
(2)下面是表达式的无二义文法:
```
expression: term
| term + expression
| term - expression
term: factor
| factor * term
| factor / term
factor: base
| base ** factor
base: NUMBER
| ( expression )
```
其中,`NUMBER` 代表一个数字,可以是整数或者小数。
下面是表达式 `1+2*3**3**2-1` 的语法树:
```
-
/ \
+ 1
/ \
1 *
/ \
2 **
/ \
3 **
/ \
3 2
```
阅读全文