222 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			222 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from collections.abc import Callable, Mapping
							 | 
						||
| 
								 | 
							
								from enum import Enum
							 | 
						||
| 
								 | 
							
								from typing import Any, Generic, ParamSpec, Self, TypeAlias, overload
							 | 
						||
| 
								 | 
							
								from typing import Literal as L
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from typing_extensions import TypeVar
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__all__ = ["Expr"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								###
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_Tss = ParamSpec("_Tss")
							 | 
						||
| 
								 | 
							
								_ExprT = TypeVar("_ExprT", bound=Expr)
							 | 
						||
| 
								 | 
							
								_ExprT1 = TypeVar("_ExprT1", bound=Expr)
							 | 
						||
| 
								 | 
							
								_ExprT2 = TypeVar("_ExprT2", bound=Expr)
							 | 
						||
| 
								 | 
							
								_OpT_co = TypeVar("_OpT_co", bound=Op, default=Op, covariant=True)
							 | 
						||
| 
								 | 
							
								_LanguageT_co = TypeVar("_LanguageT_co", bound=Language, default=Language, covariant=True)
							 | 
						||
| 
								 | 
							
								_DataT_co = TypeVar("_DataT_co", default=Any, covariant=True)
							 | 
						||
| 
								 | 
							
								_LeftT_co = TypeVar("_LeftT_co", default=Any, covariant=True)
							 | 
						||
| 
								 | 
							
								_RightT_co = TypeVar("_RightT_co", default=Any, covariant=True)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_RelCOrPy: TypeAlias = L["==", "!=", "<", "<=", ">", ">="]
							 | 
						||
| 
								 | 
							
								_RelFortran: TypeAlias = L[".eq.", ".ne.", ".lt.", ".le.", ".gt.", ".ge."]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_ToExpr: TypeAlias = Expr | complex | str
							 | 
						||
| 
								 | 
							
								_ToExprN: TypeAlias = _ToExpr | tuple[_ToExprN, ...]
							 | 
						||
| 
								 | 
							
								_NestedString: TypeAlias = str | tuple[_NestedString, ...] | list[_NestedString]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								###
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class OpError(Exception): ...
							 | 
						||
| 
								 | 
							
								class ExprWarning(UserWarning): ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Language(Enum):
							 | 
						||
| 
								 | 
							
								    Python = 0
							 | 
						||
| 
								 | 
							
								    Fortran = 1
							 | 
						||
| 
								 | 
							
								    C = 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Op(Enum):
							 | 
						||
| 
								 | 
							
								    INTEGER = 10
							 | 
						||
| 
								 | 
							
								    REAL = 12
							 | 
						||
| 
								 | 
							
								    COMPLEX = 15
							 | 
						||
| 
								 | 
							
								    STRING = 20
							 | 
						||
| 
								 | 
							
								    ARRAY = 30
							 | 
						||
| 
								 | 
							
								    SYMBOL = 40
							 | 
						||
| 
								 | 
							
								    TERNARY = 100
							 | 
						||
| 
								 | 
							
								    APPLY = 200
							 | 
						||
| 
								 | 
							
								    INDEXING = 210
							 | 
						||
| 
								 | 
							
								    CONCAT = 220
							 | 
						||
| 
								 | 
							
								    RELATIONAL = 300
							 | 
						||
| 
								 | 
							
								    TERMS = 1_000
							 | 
						||
| 
								 | 
							
								    FACTORS = 2_000
							 | 
						||
| 
								 | 
							
								    REF = 3_000
							 | 
						||
| 
								 | 
							
								    DEREF = 3_001
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RelOp(Enum):
							 | 
						||
| 
								 | 
							
								    EQ = 1
							 | 
						||
| 
								 | 
							
								    NE = 2
							 | 
						||
| 
								 | 
							
								    LT = 3
							 | 
						||
| 
								 | 
							
								    LE = 4
							 | 
						||
| 
								 | 
							
								    GT = 5
							 | 
						||
| 
								 | 
							
								    GE = 6
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def fromstring(cls, s: _RelCOrPy, language: L[Language.C, Language.Python] = ...) -> RelOp: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def fromstring(cls, s: _RelFortran, language: L[Language.Fortran]) -> RelOp: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def tostring(self, /, language: L[Language.C, Language.Python] = ...) -> _RelCOrPy: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def tostring(self, /, language: L[Language.Fortran]) -> _RelFortran: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ArithOp(Enum):
							 | 
						||
| 
								 | 
							
								    POS = 1
							 | 
						||
| 
								 | 
							
								    NEG = 2
							 | 
						||
| 
								 | 
							
								    ADD = 3
							 | 
						||
| 
								 | 
							
								    SUB = 4
							 | 
						||
| 
								 | 
							
								    MUL = 5
							 | 
						||
| 
								 | 
							
								    DIV = 6
							 | 
						||
| 
								 | 
							
								    POW = 7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Precedence(Enum):
							 | 
						||
| 
								 | 
							
								    ATOM = 0
							 | 
						||
| 
								 | 
							
								    POWER = 1
							 | 
						||
| 
								 | 
							
								    UNARY = 2
							 | 
						||
| 
								 | 
							
								    PRODUCT = 3
							 | 
						||
| 
								 | 
							
								    SUM = 4
							 | 
						||
| 
								 | 
							
								    LT = 6
							 | 
						||
| 
								 | 
							
								    EQ = 7
							 | 
						||
| 
								 | 
							
								    LAND = 11
							 | 
						||
| 
								 | 
							
								    LOR = 12
							 | 
						||
| 
								 | 
							
								    TERNARY = 13
							 | 
						||
| 
								 | 
							
								    ASSIGN = 14
							 | 
						||
| 
								 | 
							
								    TUPLE = 15
							 | 
						||
| 
								 | 
							
								    NONE = 100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Expr(Generic[_OpT_co, _DataT_co]):
							 | 
						||
| 
								 | 
							
								    op: _OpT_co
							 | 
						||
| 
								 | 
							
								    data: _DataT_co
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @staticmethod
							 | 
						||
| 
								 | 
							
								    def parse(s: str, language: Language = ...) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __init__(self, /, op: Op, data: _DataT_co) -> None: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __lt__(self, other: Expr, /) -> bool: ...
							 | 
						||
| 
								 | 
							
								    def __le__(self, other: Expr, /) -> bool: ...
							 | 
						||
| 
								 | 
							
								    def __gt__(self, other: Expr, /) -> bool: ...
							 | 
						||
| 
								 | 
							
								    def __ge__(self, other: Expr, /) -> bool: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __pos__(self, /) -> Self: ...
							 | 
						||
| 
								 | 
							
								    def __neg__(self, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __add__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    def __radd__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __sub__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    def __rsub__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __mul__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    def __rmul__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __pow__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __truediv__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    def __rtruediv__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __floordiv__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    def __rfloordiv__(self, other: Expr, /) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def __call__(
							 | 
						||
| 
								 | 
							
								        self,
							 | 
						||
| 
								 | 
							
								        /,
							 | 
						||
| 
								 | 
							
								        *args: _ToExprN,
							 | 
						||
| 
								 | 
							
								        **kwargs: _ToExprN,
							 | 
						||
| 
								 | 
							
								    ) -> Expr[L[Op.APPLY], tuple[Self, tuple[Expr, ...], dict[str, Expr]]]: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def __getitem__(self, index: _ExprT | tuple[_ExprT], /) -> Expr[L[Op.INDEXING], tuple[Self, _ExprT]]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def __getitem__(self, index: _ToExpr | tuple[_ToExpr], /) -> Expr[L[Op.INDEXING], tuple[Self, Expr]]: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> Expr: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def traverse(self, /, visit: Callable[_Tss, None], *args: _Tss.args, **kwargs: _Tss.kwargs) -> Expr: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def traverse(self, /, visit: Callable[_Tss, _ExprT], *args: _Tss.args, **kwargs: _Tss.kwargs) -> _ExprT: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def contains(self, /, other: Expr) -> bool: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def symbols(self, /) -> set[Expr]: ...
							 | 
						||
| 
								 | 
							
								    def polynomial_atoms(self, /) -> set[Expr]: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def linear_solve(self, /, symbol: Expr) -> tuple[Expr, Expr]: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def tostring(self, /, parent_precedence: Precedence = ..., language: Language = ...) -> str: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class _Pair(Generic[_LeftT_co, _RightT_co]):
							 | 
						||
| 
								 | 
							
								    left: _LeftT_co
							 | 
						||
| 
								 | 
							
								    right: _RightT_co
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, /, left: _LeftT_co, right: _RightT_co) -> None: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def substitute(self: _Pair[_ExprT1, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Expr]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def substitute(self: _Pair[_ExprT1, object], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Any]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def substitute(self: _Pair[object, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Any, Expr]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> _Pair: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class _FromStringWorker(Generic[_LanguageT_co]):
							 | 
						||
| 
								 | 
							
								    language: _LanguageT_co
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    original: str | None
							 | 
						||
| 
								 | 
							
								    quotes_map: dict[str, str]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def __init__(self: _FromStringWorker[L[Language.C]], /, language: L[Language.C] = ...) -> None: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def __init__(self, /, language: _LanguageT_co) -> None: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def finalize_string(self, /, s: str) -> str: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    def parse(self, /, inp: str) -> Expr | _Pair: ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def process(self, /, s: str, context: str = "expr") -> Expr | _Pair: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def process(self, /, s: list[str], context: str = "expr") -> list[Expr | _Pair]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def process(self, /, s: tuple[str, ...], context: str = "expr") -> tuple[Expr | _Pair, ...]: ...
							 | 
						||
| 
								 | 
							
								    @overload
							 | 
						||
| 
								 | 
							
								    def process(self, /, s: _NestedString, context: str = "expr") -> Any: ...  # noqa: ANN401
							 |