own expression compiler in Python

own expression compiler in Python

Writing your own expression compiler in Python can be a challenging but rewarding task. An expression compiler takes an input expression in some form (e.g., mathematical, logical, or a custom domain-specific language) and generates executable code or performs computations based on that expression. Here’s a simplified example of how you might write a basic expression compiler in Python:

import ast

class ExpressionCompiler:
    def __init__(self):
        self.variables = {}

    def compile_expression(self, expression):
        try:
            # Parse the expression into an abstract syntax tree (AST)
            parsed_expression = ast.parse(expression, mode='eval')

            # Visit the AST to perform operations
            result = self.visit(parsed_expression.body)

            return result
        except Exception as e:
            return f"Error: {e}"

    def visit(self, node):
        if isinstance(node, ast.BinOp):
            left = self.visit(node.left)
            right = self.visit(node.right)
            operator = node.op

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

        elif isinstance(node, ast.Name):
            variable_name = node.id
            if variable_name in self.variables:
                return self.variables[variable_name]
            else:
                raise ValueError(f"Undefined variable: {variable_name}")

        elif isinstance(node, ast.Num):
            return node.n

        else:
            raise ValueError(f"Unsupported node type: {type(node)}")

    def set_variable(self, name, value):
        self.variables[name] = value

# Example usage:
if __name__ == "__main__":
    compiler = ExpressionCompiler()
    expression = "x + 2 * y"

    compiler.set_variable("x", 5)
    compiler.set_variable("y", 3)

    result = compiler.compile_expression(expression)
    print(result)

This simplified example can handle basic arithmetic expressions, but you can extend it to support more complex expressions, functions, and additional features as needed.

Keep in mind that building a full-featured expression compiler for a specific domain or language can be much more complex, and you might need to delve into parsing, semantic analysis, and code generation. You may also want to consider using existing parsing libraries like pyparsing or antlr if your requirements become more complex.