From b5a2ecec1fcfcca62ba46002c38776b2adb2ff3b Mon Sep 17 00:00:00 2001 From: Amazing Coder Date: Sat, 24 Aug 2024 14:56:41 +0800 Subject: [PATCH 1/2] v1.0-Only single digit integers are allowed in the input --- interpreter.py | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 interpreter.py diff --git a/interpreter.py b/interpreter.py new file mode 100644 index 0000000..c04b680 --- /dev/null +++ b/interpreter.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@file: interpreter.py +@author: amazing coder +@date: 2024/8/24 +@desc: simple demo for python interpreter v1.0 +""" +from unittest.mock import right + +INTEGER, PLUS, EOF = 'INTEGER', 'PLUS', 'EOF' + +class Token(object): + def __init__(self, type, value): + self.type = type + self.value = value + + def __str__(self): + return 'Token({type}, {value})'.format( + type=self.type, + value=repr(self.value) + ) + + def __repr__(self): + return self.__str__() + +class Interpreter(object): + + def __init__(self, text): + self.text = text + self.pos = 0 + self.current_token = None + + + def error(self): + raise Exception('Error parsing input') + + def get_next_token(self): + text = self.text + + if self.pos > len(text) - 1: + return Token(EOF, None) + + current_char = text[self.pos] + self.pos += 1 + + if current_char.isdigit(): + return Token(INTEGER, int(current_char)) + if current_char == '+': + return Token(PLUS, current_char) + self.error() + + def eat(self, token_type): + if self.current_token.type == token_type: + self.current_token = self.get_next_token() + else: + self.error() + + def expr(self): + self.current_token = self.get_next_token() + left = self.current_token + self.eat(INTEGER) + + op = self.current_token + self.eat(PLUS) + + right = self.current_token + self.eat(INTEGER) + + result = left.value + right.value + return result + +def main(): + while True: + try: + text = input('input a express like "1+2"(Only single digit integers are allowed in the input)> ') + except EOFError: + break + + if not text: + continue + + interpreter = Interpreter(text) + result = interpreter.expr() + print(result) + +if __name__ == '__main__': + main() + From bdc7239d0b9b46defa31628eb67f3b6def1a3f0c Mon Sep 17 00:00:00 2001 From: Amazing Coder Date: Sat, 24 Aug 2024 14:56:41 +0800 Subject: [PATCH 2/2] v1.0-Only single digit integers are allowed in the input --- interpreter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/interpreter.py b/interpreter.py index c04b680..66bf101 100644 --- a/interpreter.py +++ b/interpreter.py @@ -7,7 +7,6 @@ @date: 2024/8/24 @desc: simple demo for python interpreter v1.0 """ -from unittest.mock import right INTEGER, PLUS, EOF = 'INTEGER', 'PLUS', 'EOF'