101 lines
2.4 KiB
Python
101 lines
2.4 KiB
Python
#!/usr/bin/env python3.9
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
JFinal Expr - Expression Evaluation Base Class
|
|
"""
|
|
|
|
from typing import Any
|
|
from ...stat.Scope import Scope
|
|
from ...Env import Env
|
|
|
|
class Expr:
|
|
"""Base class for expression AST nodes"""
|
|
|
|
def eval(self, scope: Scope) -> Any:
|
|
"""
|
|
Evaluate expression
|
|
|
|
Args:
|
|
scope: Execution scope
|
|
|
|
Returns:
|
|
Expression result
|
|
"""
|
|
raise NotImplementedError("Expr.eval() must be implemented by subclasses")
|
|
|
|
def eval_expr_list(self, scope: Scope) -> list:
|
|
"""
|
|
Evaluate as expression list
|
|
|
|
Args:
|
|
scope: Execution scope
|
|
|
|
Returns:
|
|
List of expression results
|
|
"""
|
|
return [self.eval(scope)]
|
|
|
|
def __repr__(self) -> str:
|
|
return f"Expr({self.__class__.__name__})"
|
|
|
|
|
|
class ExprList(Expr):
|
|
"""Expression list containing multiple expressions"""
|
|
|
|
def __init__(self, expressions: list = None):
|
|
"""
|
|
Initialize expression list
|
|
|
|
Args:
|
|
expressions: List of expressions
|
|
"""
|
|
self._expressions = expressions or []
|
|
|
|
def add_expr(self, expr: Expr):
|
|
"""
|
|
Add expression to list
|
|
|
|
Args:
|
|
expr: Expression to add
|
|
"""
|
|
if expr:
|
|
self._expressions.append(expr)
|
|
|
|
def eval(self, scope: Scope) -> Any:
|
|
"""
|
|
Evaluate all expressions and return last result
|
|
|
|
Args:
|
|
scope: Execution scope
|
|
|
|
Returns:
|
|
Last expression result
|
|
"""
|
|
result = None
|
|
for expr in self._expressions:
|
|
result = expr.eval(scope)
|
|
return result
|
|
|
|
def eval_expr_list(self, scope: Scope) -> list:
|
|
"""
|
|
Evaluate all expressions and return list of results
|
|
|
|
Args:
|
|
scope: Execution scope
|
|
|
|
Returns:
|
|
List of results
|
|
"""
|
|
return [expr.eval(scope) for expr in self._expressions]
|
|
|
|
def get_expressions(self) -> list:
|
|
"""Get all expressions"""
|
|
return self._expressions.copy()
|
|
|
|
def __len__(self) -> int:
|
|
"""Get number of expressions"""
|
|
return len(self._expressions)
|
|
|
|
def __repr__(self) -> str:
|
|
return f"ExprList({len(self._expressions)} expressions)"
|