|
@@ -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()
|