初始提交,未完全测试
This commit is contained in:
138
template/expr/ast/Compare.py
Normal file
138
template/expr/ast/Compare.py
Normal file
@@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3.9
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
JFinal Compare - Comparison Expression
|
||||
"""
|
||||
|
||||
from .Expr import Expr
|
||||
|
||||
class Compare(Expr):
|
||||
"""Comparison expression"""
|
||||
|
||||
EQ = "=="
|
||||
NE = "!="
|
||||
GT = ">"
|
||||
GTE = ">="
|
||||
LT = "<"
|
||||
LTE = "<="
|
||||
|
||||
def __init__(self, left: Expr, operator: str, right: Expr):
|
||||
"""
|
||||
Initialize comparison
|
||||
|
||||
Args:
|
||||
left: Left expression
|
||||
operator: Comparison operator
|
||||
right: Right expression
|
||||
"""
|
||||
self._left = left
|
||||
self._operator = operator
|
||||
self._right = right
|
||||
|
||||
def eval(self, scope):
|
||||
"""Evaluate comparison"""
|
||||
left_val = self._left.eval(scope)
|
||||
right_val = self._right.eval(scope)
|
||||
|
||||
# Handle None comparisons
|
||||
if left_val is None and right_val is None:
|
||||
return self._operator == Compare.EQ
|
||||
if left_val is None or right_val is None:
|
||||
return self._operator == Compare.NE
|
||||
|
||||
# Perform comparison based on operator
|
||||
if self._operator == Compare.EQ:
|
||||
return left_val == right_val
|
||||
elif self._operator == Compare.NE:
|
||||
return left_val != right_val
|
||||
elif self._operator == Compare.GT:
|
||||
return left_val > right_val
|
||||
elif self._operator == Compare.GTE:
|
||||
return left_val >= right_val
|
||||
elif self._operator == Compare.LT:
|
||||
return left_val < right_val
|
||||
elif self._operator == Compare.LTE:
|
||||
return left_val <= right_val
|
||||
else:
|
||||
raise ValueError(f"Unknown operator: {self._operator}")
|
||||
|
||||
@property
|
||||
def operator(self) -> str:
|
||||
"""Get operator"""
|
||||
return self._operator
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"Compare({self._left} {self._operator} {self._right})"
|
||||
|
||||
|
||||
class Logic(Expr):
|
||||
"""Logical expression (and, or, not)"""
|
||||
|
||||
AND = "&&"
|
||||
OR = "||"
|
||||
NOT = "!"
|
||||
|
||||
def __init__(self, operator: str, *expressions: Expr):
|
||||
"""
|
||||
Initialize logical expression
|
||||
|
||||
Args:
|
||||
operator: Logical operator
|
||||
expressions: Expressions to operate on
|
||||
"""
|
||||
self._operator = operator
|
||||
self._expressions = expressions
|
||||
|
||||
def eval(self, scope):
|
||||
"""Evaluate logical expression"""
|
||||
if self._operator == Logic.NOT:
|
||||
# Unary NOT
|
||||
if not self._expressions:
|
||||
return True
|
||||
return not self._expressions[0].eval(scope)
|
||||
else:
|
||||
# Binary AND/OR
|
||||
results = [expr.eval(scope) for expr in self._expressions]
|
||||
|
||||
if self._operator == Logic.AND:
|
||||
return all(results)
|
||||
elif self._operator == Logic.OR:
|
||||
return any(results)
|
||||
else:
|
||||
raise ValueError(f"Unknown operator: {self._operator}")
|
||||
|
||||
def __repr__(self) -> str:
|
||||
expr_str = f" {self._operator} ".join(str(expr) for expr in self._expressions)
|
||||
if self._operator == Logic.NOT:
|
||||
return f"NOT({expr_str})"
|
||||
return f"({expr_str})"
|
||||
|
||||
|
||||
class Ternary(Expr):
|
||||
"""Ternary conditional expression (condition ? true_val : false_val)"""
|
||||
|
||||
def __init__(self, condition: Expr, true_expr: Expr, false_expr: Expr):
|
||||
"""
|
||||
Initialize ternary expression
|
||||
|
||||
Args:
|
||||
condition: Condition expression
|
||||
true_expr: Expression when condition is true
|
||||
false_expr: Expression when condition is false
|
||||
"""
|
||||
self._condition = condition
|
||||
self._true_expr = true_expr
|
||||
self._false_expr = false_expr
|
||||
|
||||
def eval(self, scope):
|
||||
"""Evaluate ternary expression"""
|
||||
cond_val = self._condition.eval(scope)
|
||||
|
||||
# Convert to boolean (handle None, 0, empty strings, etc.)
|
||||
if cond_val:
|
||||
return self._true_expr.eval(scope)
|
||||
else:
|
||||
return self._false_expr.eval(scope)
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"Ternary({self._condition} ? {self._true_expr} : {self._false_expr})"
|
||||
Reference in New Issue
Block a user