소스 검색

refactoring

Olesya Ivanova 3 년 전
부모
커밋
fa565824e5
2개의 변경된 파일62개의 추가작업 그리고 48개의 파일을 삭제
  1. 6 48
      interpreter/interpreter.py
  2. 56 0
      interpreter/lexer.py

+ 6 - 48
interpreter/interpreter.py

@@ -1,5 +1,5 @@
-
 from .tokens import TokenType, Token
 from .tokens import TokenType, Token
+from .lexer import Lexer
 
 
 
 
 class InterpreterException(Exception):
 class InterpreterException(Exception):
@@ -8,57 +8,17 @@ class InterpreterException(Exception):
 
 
 class Interpreter():
 class Interpreter():
     def __init__(self):
     def __init__(self):
-        self._pos: int = -1
         self._current_token: Token = None
         self._current_token: Token = None
-        self._current_char: str = None
-        self._text: str = ""
-
-    def _next_token(self) -> Token:
-        main_part = ''
-        while self._current_char is not None:
-            # self._current_char: str = self._text[self._pos]
-            if self._current_char == " ":
-                self._skip()
-                continue
-            if self._current_char.isdigit():
-                return Token(TokenType.FLOAT, self._float())
-            if self._current_char == "+":
-                char = self._current_char
-                self._forward()
-                return Token(TokenType.PLUS, char)
-            if self._current_char == "-":
-                char = self._current_char
-                self._forward()
-                return Token(TokenType.MINUS, char)
-            raise InterpreterException(f"bad token {self._current_char}")
-        return Token(TokenType.EOS, None)
-
-    def _forward(self):
-        self._pos += 1
-        if self._pos >= len(self._text):
-            self._current_char = None
-        else:
-            self._current_char = self._text[self._pos]
-
-    def _skip(self):
-        while self._current_char and self._current_char == " ":
-            self._forward()
-
-    def _float(self):
-        result: list = []
-        while self._current_char and (self._current_char.isdigit() or self._current_char == '.'):
-            result += self._current_char
-            self._forward()
-        return "".join(result)
+        self._lexer = Lexer()
 
 
     def _check_token_type(self, type_: TokenType):
     def _check_token_type(self, type_: TokenType):
         if self._current_token.type_ == type_:
         if self._current_token.type_ == type_:
-            self._current_token = self._next_token()
+            self._current_token = self._lexer.next()
         else:
         else:
             raise InterpreterException("invalid token order")
             raise InterpreterException("invalid token order")
 
 
     def _expr(self) -> float:
     def _expr(self) -> float:
-        self._current_token = self._next_token()  # берём первый токен
+        self._current_token = self._lexer.next()  # берём первый токен
         left = self._current_token
         left = self._current_token
         self._check_token_type(TokenType.FLOAT)
         self._check_token_type(TokenType.FLOAT)
         op = self._current_token
         op = self._current_token
@@ -77,8 +37,6 @@ class Interpreter():
     def __call__(self, text: str):
     def __call__(self, text: str):
         return self.interpret(text)
         return self.interpret(text)
 
 
-    def interpret(self, text: str):
-        self._text = text
-        self._pos = -1
-        self._forward()
+    def interpret(self, text: str) -> float:
+        self._lexer.init(text)
         return self._expr()
         return self._expr()

+ 56 - 0
interpreter/lexer.py

@@ -0,0 +1,56 @@
+from .tokens import TokenType, Token
+
+
+class LexerException(Exception):
+    pass
+
+
+class Lexer():
+
+    def __init__(self):
+        self._pos: int = -1
+        self._current_char: str = None
+        self._text: str = ""
+
+    def next(self) -> Token:
+        main_part = ''
+        while self._current_char is not None:
+            # self._current_char: str = self._text[self._pos]
+            if self._current_char == " ":
+                self._skip()
+                continue
+            if self._current_char.isdigit():
+                return Token(TokenType.FLOAT, self._float())
+            if self._current_char == "+":
+                char = self._current_char
+                self._forward()
+                return Token(TokenType.PLUS, char)
+            if self._current_char == "-":
+                char = self._current_char
+                self._forward()
+                return Token(TokenType.MINUS, char)
+            raise LexerException(f"bad token {self._current_char}")
+        return Token(TokenType.EOS, None)
+
+    def _forward(self):
+        self._pos += 1
+        if self._pos >= len(self._text):
+            self._current_char = None
+        else:
+            self._current_char = self._text[self._pos]
+
+    def _skip(self):
+        while self._current_char and self._current_char == " ":
+            self._forward()
+
+    def _float(self):
+        result: list = []
+        while self._current_char and (self._current_char.isdigit() or self._current_char == '.'):
+            result += self._current_char
+            self._forward()
+        return "".join(result)
+
+    def init(self, text: str):
+        self._text: text
+        self._pos: -1
+        self._forward()