Code4UHub / server

MIT License
1 stars 0 forks source link

Create Python compiler #19

Open Di-az opened 1 year ago

Di-az commented 1 year ago

User story: Contar con un compilador de código integrado en la plataforma#5

VictorCast2 commented 1 year ago

Aquí te dejo, Este intérprete de Python utiliza el módulo ast para analizar el código fuente de Python y luego recorre el árbol sintáctico generado para interpretar y ejecutar el código. Ten en cuenta que este es solo un ejemplo simple y no admite todas las características y construcciones de Python. Puedes agregar más funciones y características según tus necesidades.

Recuerda que este intérprete utiliza la última versión de Python instalada en tu sistema, ya que no implementa su propio intérprete o compilador.

Un ejemplo de código bien estructurado para un intérprete de Python:


import ast
import builtins

class PythonInterpreter(ast.NodeVisitor):
    def __init__(self):
        self.globals = {}
        self.locals = {}

    def visit_Module(self, node):
        for stmt in node.body:
            self.visit(stmt)

    def visit_Expr(self, node):
        value = self.visit(node.value)
        if value is not None:
            print(value)

    def visit_Num(self, node):
        return node.n

    def visit_Str(self, node):
        return node.s

    def visit_Name(self, node):
        if node.id in self.locals:
            return self.locals[node.id]
        elif node.id in self.globals:
            return self.globals[node.id]
        elif node.id in dir(builtins):
            return getattr(builtins, node.id)
        else:
            raise NameError(f"Name '{node.id}' is not defined")

    def visit_Assign(self, node):
        target = node.targets[0].id
        value = self.visit(node.value)
        self.locals[target] = value

    def visit_BinOp(self, node):
        left = self.visit(node.left)
        right = self.visit(node.right)
        op = node.op

        if isinstance(op, ast.Add):
            return left + right
        elif isinstance(op, ast.Sub):
            return left - right
        elif isinstance(op, ast.Mult):
            return left * right
        elif isinstance(op, ast.Div):
            return left / right
        elif isinstance(op, ast.Mod):
            return left % right
        else:
            raise TypeError(f"Unsupported operator: {op}")

def interpret(code):
    tree = ast.parse(code)
    interpreter = PythonInterpreter()
    interpreter.visit(tree)

# Ejemplo de uso
codigo_ejemplo = '''
x = 5
y = 3
resultado = x + y
resultado
'''

interpret(codigo_ejemplo)

____________________________________________________