core.python_expression_dsl package¶
Submodules¶
core.python_expression_dsl.ast module¶
- class core.python_expression_dsl.ast.BinaryArithmeticExpression(operator, left_argument, right_argument)[source]¶
Bases:
BinaryExpression
Represents a binary arithmetic expression.
- class core.python_expression_dsl.ast.BinaryBooleanExpression(operator, left_argument, right_argument)[source]¶
Bases:
BinaryExpression
Represents a binary boolean expression.
- class core.python_expression_dsl.ast.BinaryExpression(operator, left_argument, right_argument)[source]¶
Bases:
Expression
Represents a binary expression.
- property left_argument¶
Return the expression’s left argument.
- Returns:
Expression’s left argument
- Return type:
- property operator¶
Return the expression’s operator.
- Returns:
Expression’s operator
- Return type:
- class core.python_expression_dsl.ast.ComparisonExpression(operator, left_argument, right_argument)[source]¶
Bases:
BinaryExpression
Represents a comparison expression.
- class core.python_expression_dsl.ast.DotExpression(expressions)[source]¶
Bases:
Expression
Represents a dotted expression.
- property expressions¶
Return the list of nested expressions.
- Returns:
List of nested expressions
- Return type:
List[Expression]
- class core.python_expression_dsl.ast.Expression[source]¶
Bases:
Node
Base class for AST nodes representing different types of expressions.
- class core.python_expression_dsl.ast.FunctionCallExpression(function, arguments)[source]¶
Bases:
Expression
Represents a function call expression.
- property arguments¶
Return a list of arguments.
- Returns:
List of arguments
- Return type:
List[Expression]
- property function¶
Return the identifier representing the function.
- Returns:
Identifier representing the function
- Return type:
- class core.python_expression_dsl.ast.Identifier(value)[source]¶
Bases:
ScalarValue
Represents an identifier.
- class core.python_expression_dsl.ast.Number(value)[source]¶
Bases:
ScalarValue
Represents a number.
- class core.python_expression_dsl.ast.Operator(value)[source]¶
Bases:
Enum
Enumeration containing different types of available operators.
- ADDITION = 'ADDITION'¶
- CONJUNCTION = 'CONJUNCTION'¶
- DISJUNCTION = 'DISJUNCTION'¶
- DIVISION = 'DIVISION'¶
- EQUAL = 'EQUAL'¶
- EXPONENTIATION = 'EXPONENTIATION'¶
- GREATER = 'GREATER'¶
- GREATER_OR_EQUAL = 'GREATER_OR_EQUAL'¶
- IN = 'IN'¶
- INVERSION = 'INVERSION'¶
- LESS = 'LESS'¶
- LESS_OR_EQUAL = 'LESS_OR_EQUAL'¶
- MULTIPLICATION = 'MULTIPLICATION'¶
- NEGATION = 'NEGATION'¶
- NOT_EQUAL = 'NOT_EQUAL'¶
- SUBTRACTION = 'SUBTRACTION'¶
- class core.python_expression_dsl.ast.ScalarValue(value)[source]¶
Bases:
Node
Represents a scalar value.
- property value¶
Return the value.
- Returns:
Value
- Return type:
Any
- class core.python_expression_dsl.ast.SliceExpression(array, slice_expression)[source]¶
Bases:
Expression
Represents a slice expression.
- property slice¶
Return the slice expression.
- Returns:
Slice expression
- Return type:
- class core.python_expression_dsl.ast.String(value)[source]¶
Bases:
ScalarValue
Represents an string.
- class core.python_expression_dsl.ast.UnaryArithmeticExpression(operator, argument)[source]¶
Bases:
UnaryExpression
Represents an unary arithmetic expression.
- class core.python_expression_dsl.ast.UnaryBooleanExpression(operator, argument)[source]¶
Bases:
UnaryExpression
Represents an unary boolean expression.
- class core.python_expression_dsl.ast.UnaryExpression(operator, argument)[source]¶
Bases:
Expression
Represents an unary expression.
- property argument¶
Return the expression’s argument.
- Returns:
Expression’s argument
- Return type:
core.python_expression_dsl.evaluator module¶
- exception core.python_expression_dsl.evaluator.DSLEvaluationError(message=None, inner_exception=None)[source]¶
Bases:
BaseError
Raised when evaluation of a DSL expression fails.
- class core.python_expression_dsl.evaluator.DSLEvaluationVisitor(context=None, safe_classes=None)[source]¶
Bases:
Visitor
Visitor traversing expression’s AST and evaluating it.
- ARITHMETIC_OPERATORS = {<Operator.NEGATION: 'NEGATION'>: <built-in function neg>, <Operator.ADDITION: 'ADDITION'>: <built-in function add>, <Operator.SUBTRACTION: 'SUBTRACTION'>: <built-in function sub>, <Operator.MULTIPLICATION: 'MULTIPLICATION'>: <built-in function mul>, <Operator.DIVISION: 'DIVISION'>: <built-in function truediv>, <Operator.EXPONENTIATION: 'EXPONENTIATION'>: <built-in function pow>}¶
- BOOLEAN_OPERATORS = {<Operator.INVERSION: 'INVERSION'>: <built-in function not_>, <Operator.CONJUNCTION: 'CONJUNCTION'>: <built-in function and_>, <Operator.DISJUNCTION: 'DISJUNCTION'>: <built-in function or_>}¶
- BUILTIN_CLASSES = [<class 'float'>, <class 'int'>, <class 'str'>, <class 'module'>]¶
- BUILTIN_FUNCTIONS = {'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'float': <class 'float'>, 'int': <class 'int'>, 'len': <built-in function len>, 'max': <built-in function max>, 'min': <built-in function min>, 'str': <class 'str'>}¶
- COMPARISON_OPERATORS = {<Operator.EQUAL: 'EQUAL'>: <built-in function eq>, <Operator.NOT_EQUAL: 'NOT_EQUAL'>: <built-in function ne>, <Operator.GREATER: 'GREATER'>: <built-in function gt>, <Operator.GREATER_OR_EQUAL: 'GREATER_OR_EQUAL'>: <built-in function ge>, <Operator.LESS: 'LESS'>: <built-in function lt>, <Operator.LESS_OR_EQUAL: 'LESS_OR_EQUAL'>: <built-in function le>, <Operator.IN: 'IN'>: <function DSLEvaluationVisitor.<lambda>>}¶
- property context¶
Return the evaluation context.
- Returns:
Evaluation context
- Return type:
Union[Dict, object]
- property safe_classes¶
Return a list of classes which methods can be called.
- Returns:
List of safe classes which methods can be called
- Return type:
List[type]
- visit¶
Dispatch methods based on type signature
- See Also:
Dispatcher
- class core.python_expression_dsl.evaluator.DSLEvaluator(parser, visitor)[source]¶
Bases:
object
Evaluates the expression.
- evaluate(expression, context=None, safe_classes=None)[source]¶
Evaluate the expression and return the resulting value.
- Parameters:
expression (str) – String containing the expression
context (Union[Dict, object]) – Evaluation context
safe_classes (List[type]) – List of classes which methods can be called
- Returns:
Evaluation result
- Return type:
Any
core.python_expression_dsl.parser module¶
- exception core.python_expression_dsl.parser.DSLParseError(message=None, inner_exception=None)[source]¶
Bases:
BaseError
Raised when expression has an incorrect format.
- class core.python_expression_dsl.parser.DSLParser[source]¶
Bases:
object
Parses expressions into AST objects.
- ADDITION_OPERATOR = "+"¶
- ADDITIVE_OPERATOR = {"+" | "-"}¶
- COMMA = Suppress:(",")¶
- COMPARISON_OPERATOR = {{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"}¶
- CONJUNCTION_OPERATOR = "and"¶
- DEFAULT_ERROR_MESSAGE = 'Could not parse the expression'¶
- DISJUNCTION_OPERATOR = "or"¶
- DIVISION_OPERATOR = "/"¶
- EQUAL_OPERATOR = "=="¶
- FULL_STOP = Suppress:(".")¶
- GREATER_OPERATOR = ">"¶
- GREATER_OR_EQUAL_OPERATOR = ">="¶
- IDENTIFIER = W:(ABCD..., ABCD...)¶
- INVERSION_OPERATOR = "not"¶
- IN_OPERATOR = "in"¶
- LEFT_BRACKET = Suppress:("[")¶
- LEFT_PAREN = Suppress:("(")¶
- LESS_OPERATOR = "<"¶
- LESS_OR_EQUAL_OPERATOR = "<="¶
- MULTIPLICATION_OPERATOR = "*"¶
- MULTIPLICATIVE_OPERATOR = {"*" | "/"}¶
- NEGATION_OPERATOR = "-"¶
- NOT_EQUAL_OPERATOR = "!="¶
- NUMBER = Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?')¶
- PARSE_ERROR_MESSAGE_REGEX = re.compile("Expected\\s+(\\{.+\\}),\\s+found\\s+('.+')\\s+\\(at\\s+char\\s+(\\d+)\\)")¶
- POWER_OPERATOR = "**"¶
- RIGHT_BRACKET = Suppress:("]")¶
- RIGHT_PAREN = Suppress:(")")¶
- STRING = {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}¶
- SUBTRACTION_OPERATOR = "-"¶
- arithmetic_expression = Forward: {{Forward: {{["-"]... {{{{{{Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?') | {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}} | Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})} | Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{¶
- atom = {["-"]... {{{{{{Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?') | {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}} | Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})} | Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:(")")})} | Group:({{{W:(ABCD..., ABCD...) Suppress:("(")} [{{{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...} [{Suppress:(",") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}}]...}]...} Suppress:(")")})} | Group:({W:(ABCD..., ABCD...) [{Suppress:(".") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}}]...})} | W:(ABCD..., ABCD...)}}¶
- comparison_expression = {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}¶
- conjunction_expression = {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}¶
- disjunction_expression = {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}¶
- dot_expression = Group:({W:(ABCD..., ABCD...) [{Suppress:(".") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}}]...})¶
- expression = {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}¶
- factor = Forward: {{["-"]... {{{{{{Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?') | {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}} | Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})} | Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" ¶
- function_call_arguments = [{{{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...} [{Suppress:(",") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}}]...}]...¶
- function_call_expression = Group:({{{W:(ABCD..., ABCD...) Suppress:("(")} [{{{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...} [{Suppress:(",") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}}]...}]...} Suppress:(")")})¶
- inversion_expression = {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}¶
- parenthesized_expression = Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:(")")})¶
- parse(expression)[source]¶
Parse the expression and transform it into AST.
- Parameters:
expression (str) – String containing the expression
- Returns:
AST node
- Return type:
- slice = {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}¶
- slice_expression = Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})¶
- term = {Forward: {{["-"]... {{{{{{Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?') | {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}} | Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})} | Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" [{{"*" | "/"} Forward: {{["-"]... {{{{{{Re:('[+-]?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?') | {quoted string, starting with ' ending with ' | quoted string, starting with " ending with "}} | Group:({{{W:(ABCD..., ABCD...) Suppress:("[")} {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...}}]...}} Suppress:("]")})} | Group:({{Suppress:("(") {{{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}}}]...} [{"or" {{["not"]... {: ... [{{{{{{{"==" | "!="} | ">="} | ">"} | "<="} | "<"} | "in"} : ...}]...}} [{"and" {["not"]... {: ... [{{{{{{{"==" }]...}¶