整数计算器 Version 2
上一篇文章中代码实现了
- 10以内的整数加法
- 不允许有空格
本文将它扩展到任意位数的整数加法!
原理就是在识别到当前字符为整数时,继续判断下一个字符是否仍然为整数,如果是,拼接起来
NUMBER, PLUS, EOF = 'NUMBER', 'PLUS', 'EOF'
class Token:
def __init__(self, token_type, value):
self.type = token_type
self.value = value
def __repr__(self,):
return f'Token({self.type}, {self.value})'
class Interpreter:
def __init__(self, text):
self.text = text
self.pos = 0
self.current = None
def error(self,):
raise Exception('Parse Error!')
def get_next_token(self, ):
if self.pos >= len(self.text):
return Token(EOF, None)
self.current = self.text[self.pos]
if self.current.isdigit():
number = ''
while self.current.isdigit():
number += self.current
self.pos += 1
if self.pos >= len(self.text):
break
self.current = self.text[self.pos]
return Token(NUMBER, int(number))
if self.current == '+':
self.pos += 1
return Token(PLUS, '+')
self.error()
def expr(self,):
a = self.get_next_token()
plus = self.get_next_token()
b = self.get_next_token()
result = a.value + b.value
return result
while True:
try:
text = input('cal> ')
interpreter = Interpreter(text)
print(interpreter.expr())
except Exception as e:
print(e)
break
可以看到,多位的整数已经可以支持了!
下一步,处理空格
整数计算器 Version 3
NUMBER, PLUS, EOF = 'NUMBER', 'PLUS', 'EOF'
class Token:
def __init__(self, token_type, value):
self.type = token_type
self.value = value
def __repr__(self,):
return f'Token({self.type}, {self.value})'
class Interpreter:
def __init__(self, text):
self.text = text
self.pos = 0
self.current = None
def error(self,):
raise Exception('Parse Error!')
def get_next_token(self, ):
if self.pos >= len(self.text):
return Token(EOF, None)
self.current = self.text[self.pos]
if self.current == ' ':
while self.current == ' ':
self.pos += 1
if self.pos >= len(self.text):
return Token(EOF, None)
self.current = self.text[self.pos]
if self.current.isdigit():
number = ''
while self.current.isdigit():
number += self.current
self.pos += 1
if self.pos >= len(self.text):
break
self.current = self.text[self.pos]
return Token(NUMBER, int(number))
if self.current == '+':
self.pos += 1
return Token(PLUS, '+')
self.error()
def expr(self,):
a = self.get_next_token()
plus = self.get_next_token()
b = self.get_next_token()
result = a.value + b.value
return result
def main():
while True:
try:
text = input('cal> ')
interpreter = Interpreter(text)
print(interpreter.expr())
except Exception as e:
print(e)
break
main()
可以看到空格已经可以自动忽略了!
下一步拓展到 同时支持加减法!