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:

Node

property operator

Return the expression’s operator.

Returns:

Expression’s operator

Return type:

Operator

property right_argument

Return the expression’s right argument.

Returns:

Expression’s right argument

Return type:

Node

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:

core.python_expression_dsl.ast.Identifier

class core.python_expression_dsl.ast.Identifier(value)[source]

Bases: ScalarValue

Represents an identifier.

class core.python_expression_dsl.ast.Node[source]

Bases: Visitable

Base class for all AST nodes.

accept(visitor)[source]

Accept the specified visitor.

Parameters:

visitor (Visitor) – Visitor object

Returns:

Evaluated result

Return type:

Any

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 array

Return the array node.

Returns:

Array node

Return type:

Node

property slice

Return the slice expression.

Returns:

Slice expression

Return type:

Expression

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:

Node

property operator

Return the expression’s operator.

Returns:

Expression’s operator

Return type:

Operator

class core.python_expression_dsl.ast.Visitable[source]

Bases: object

Interface for objects walkable by AST visitors.

abstract accept(visitor)[source]

Accept the specified visitor.

Parameters:

visitor (Visitor) – Visitor object

Returns:

Evaluated result

Return type:

Any

class core.python_expression_dsl.ast.Visitor[source]

Bases: object

Interface for visitors walking through abstract syntax trees (AST).

abstract visit(node)[source]

Process the specified node.

Parameters:

node (Node) – AST node

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

property parser

Return the parser used by this evaluator.

Returns:

Parser used by this evaluator

Return type:

DSLParser

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:

core.python_expression_dsl.ast.Node

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"]... {: ... [{{{{{{{"==" }]...}

Module contents