From 719b598e98baff2cf5ea34bb6d36eddd8fd29f38 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Thu, 28 Sep 2023 00:09:06 +0800 Subject: feat(src): delete `src` dir & rename `psi` dir feat(frame): 添加`Lib` `Grammar` `Modules` 目录 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- psi/interpreter.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 psi/interpreter.py (limited to 'psi/interpreter.py') diff --git a/psi/interpreter.py b/psi/interpreter.py new file mode 100644 index 0000000..8aa8fad --- /dev/null +++ b/psi/interpreter.py @@ -0,0 +1,75 @@ +from psi.lexer import Token + + +__all__ = ['Interpreter'] + +class Interpreter: + """ + A class representing an interpreter for Psi code. + + Args: + ast: The abstract syntax tree (AST) of the code to be interpreted. + + Returns: + None + + Example: + ```python + interpreter = Interpreter(ast) + interpreter.interpret() + ``` + """ + + def __init__(self, ast): + """ + Initializes an Interpreter object. + + Args: + ast: The abstract syntax tree (AST) of the code to be interpreted. + + Returns: + None + """ + self.ast = ast + + def interpret(self): + """ + Interprets the code represented by the AST. + + Returns: + The result of the interpretation. + """ + return self.interpret_expr(self.ast) + + def interpret_expr(self, node): + """ + Interprets an expression node in the AST. + + Args: + node: The expression node to be interpreted. + + Returns: + The result of the interpretation. + """ + if isinstance(node, Token): + return node.value + elif isinstance(node, list): + for expr in node: + result = self.interpret_expr(expr) + if result is not None: + return result + + def interpret_condition(self, node): + """ + Interprets a condition node in the AST. + + Args: + node: The condition node to be interpreted. + + Returns: + The result of the interpretation. + """ + variable = self.interpret_expr(node[0]) + value = self.interpret_expr(node[2]) + + return variable == value -- cgit v1.2.3-70-g09d2