编译原理,设计一个简单的计算器,支持加减乘除和括号,能够处理整数和浮点数
时间: 2024-03-12 17:45:54 浏览: 85
好的,我可以为您解答这个问题。在编写一个计算器的时候,需要考虑以下几个步骤:
1. 词法分析:将输入的字符串分解为符号,例如数字、运算符、括号等等。
2. 语法分析:根据词法分析得到的符号序列,构建语法树,其中每个节点表示一个运算符或者数字(整数或浮点数)。
3. 语义分析:对语法树进行遍历,计算每个节点的值。
下面是一个简单的计算器的代码示例:
```python
# 词法分析
def tokenize(expression):
tokens = []
i = 0
while i < len(expression):
# 处理数字
if expression[i].isdigit() or expression[i] == '.':
j = i + 1
while j < len(expression) and (expression[j].isdigit() or expression[j] == '.'):
j += 1
tokens.append(expression[i:j])
i = j
# 处理运算符和括号
elif expression[i] in ['+', '-', '*', '/', '(', ')']:
tokens.append(expression[i])
i += 1
# 忽略空格
elif expression[i] == ' ':
i += 1
else:
raise ValueError('Invalid character: {}'.format(expression[i]))
return tokens
# 语法分析
def parse(tokens):
i = 0
root = None
while i < len(tokens):
token = tokens[i]
# 处理数字
if token.isdigit() or token == '.':
node = {'type': 'number', 'value': float(token)}
i += 1
# 处理括号
elif token == '(':
j = i + 1
level = 1
while j < len(tokens) and level > 0:
if tokens[j] == '(':
level += 1
elif tokens[j] == ')':
level -= 1
j += 1
if level > 0:
raise ValueError('Unmatched parentheses')
node = parse(tokens[i+1:j-1])
i = j
# 处理运算符
elif token in ['+', '-', '*', '/']:
node = {'type': 'operator', 'value': token}
i += 1
# 无法解析的符号
else:
raise ValueError('Invalid token: {}'.format(token))
# 将节点添加到语法树中
if not root:
root = node
elif root['type'] == 'operator' and node['type'] == 'number':
node['left'] = root
root = node
elif root['type'] == 'number' and node['type'] == 'operator':
node['left'] = root
root = node
elif root['type'] == 'number' and node['type'] == 'number':
node['left'] = root
root = node
elif root['type'] == 'operator' and node['type'] == 'operator':
if node['value'] in ['*', '/']:
node['left'] = root['right']
root['right'] = node
else:
node['left'] = root
root = node
return root
# 语义分析
def evaluate(node):
if node['type'] == 'number':
return node['value']
elif node['type'] == 'operator':
left_val = evaluate(node['left'])
right_val = evaluate(node['right'])
if node['value'] == '+':
return left_val + right_val
elif node['value'] == '-':
return left_val - right_val
elif node['value'] == '*':
return left_val * right_val
elif node['value'] == '/':
return left_val / right_val
# 计算器函数
def calculator(expression):
tokens = tokenize(expression)
syntax_tree = parse(tokens)
return evaluate(syntax_tree)
```
在这个计算器中,我们首先对输入的表达式进行词法分析,然后构建语法树,最后进行语义分析计算结果。这个计算器支持整数和浮点数的加减乘除和括号。
阅读全文