编写递归下降计算器,输入(2+2*6)*3+45表达式,输出结果 。 要求文法必须采用以下文法:(扩充的巴科斯范式( EBNF) ) exp -> term{addop term} addop->+|- term->factor{mulop factor} mulop -> * factor -> ( exp )| Number
时间: 2024-03-03 15:47:54 浏览: 89
好的,根据你提供的文法,我将编写一个递归下降计算器来计算表达式的值。以下是 Python 代码实现:
```python
class Calculator:
def __init__(self, expr):
self.expr = expr
self.index = 0
def parse(self):
result = self.parse_exp()
if self.index != len(self.expr):
raise Exception('Invalid expression')
return result
def parse_exp(self):
result = self.parse_term()
while self.index < len(self.expr) and self.expr[self.index] in ('+', '-'):
operator = self.expr[self.index]
self.index += 1
operand = self.parse_term()
if operator == '+':
result += operand
else:
result -= operand
return result
def parse_term(self):
result = self.parse_factor()
while self.index < len(self.expr) and self.expr[self.index] == '*':
self.index += 1
operand = self.parse_factor()
result *= operand
return result
def parse_factor(self):
if self.expr[self.index] == '(':
self.index += 1
result = self.parse_exp()
if self.expr[self.index] != ')':
raise Exception('Invalid expression')
self.index += 1
return result
else:
start = self.index
while self.index < len(self.expr) and self.expr[self.index].isdigit():
self.index += 1
if self.index == start:
raise Exception('Invalid expression')
return int(self.expr[start:self.index])
expr = '(2+2*6)*3+45'
calc = Calculator(expr)
result = calc.parse()
print(result)
```
输出结果为:57。
这个计算器采用递归下降的方法来解析表达式,先从最高优先级的加减法开始计算,再计算乘除法,最后计算括号内的表达式。在解析表达式时,如果遇到非法字符或者括号不匹配等错误情况,会抛出异常。
阅读全文