Skip to content

Parsers

build_operand_parser(number_parser)

Builds the operand parser by removing the = sign at the beginning of the formula

Parameters:

Name Type Description Default
number_parser Callable[[], ParserElement]

number parser like decimal_parser or regular_number_parser

required

Returns:

Type Description
ParserElement

pp.ParserElement: full formula parser for pyparsing

Source code in configcalc/parsers.py
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
def build_operand_parser(
    number_parser: Callable[[], pp.ParserElement],
) -> pp.ParserElement:
    """Builds the operand parser by removing the = sign at the beginning of the formula

    Args:
        number_parser (Callable[[], pp.ParserElement]): number parser like decimal_parser or regular_number_parser

    Returns:
        pp.ParserElement: full formula parser for pyparsing
    """
    operator_operand = operator_operand_expr(number_parser)
    return pp.Suppress("=") + operator_operand

decimal_parser()

Parse numbers as Decimal

Returns:

Type Description
ParserElement

pp.ParserElement: Decimal ParserElement for pyparsing

Source code in configcalc/parsers.py
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def decimal_parser() -> pp.ParserElement:
    """Parse numbers as Decimal

    Returns:
        pp.ParserElement: Decimal ParserElement for pyparsing
    """

    def convert_to_decimal(token: pp.ParseResults) -> Decimal:
        return Decimal(str(token[0]))

    int_part = pp.Opt(pp.one_of("- +")) + pp.Word(pp.nums)
    mantissa = int_part + pp.Opt("." + pp.Opt(pp.Word(pp.nums)))
    exponent_part = pp.Opt(
        pp.one_of("e E") + pp.Opt(pp.one_of("- +")) + pp.Word(pp.nums)
    )
    number = pp.Combine(mantissa + exponent_part)
    number.set_parse_action(convert_to_decimal)
    return number

operator_operand_expr(number_parser)

Parse an operator operand with priority. In order (most priority to least) the minus sign (-), exponent (^), multiply/divide (* /) and add/substract (+ -)

Parameters:

Name Type Description Default
number_parser Callable[[], ParserElement]

number parser like decimal_parser or regular_number_parser

required

Returns:

Type Description
ParserElement

pp.ParserElement: operand parser for pyparsing

Source code in configcalc/parsers.py
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
def operator_operand_expr(
    number_parser: Callable[[], pp.ParserElement],
) -> pp.ParserElement:
    """Parse an operator operand with priority. In order (most priority to least) the minus sign (-), exponent (^), multiply/divide (* /) and add/substract (+ -)

    Args:
        number_parser (Callable[[], pp.ParserElement]): number parser like decimal_parser or regular_number_parser

    Returns:
        pp.ParserElement: operand parser for pyparsing
    """
    operator_operand = pp.Forward()
    number = number_parser()
    var_name = var_name_parser()
    function_struct = (
        pp.common.identifier + pp.Suppress("(") + operator_operand + pp.Suppress(")")
    )

    operand = function_struct | number | var_name
    operator_operand <<= pp.infix_notation(
        operand,
        [
            ("-", 1, pp.OpAssoc.RIGHT),
            ("^", 2, pp.OpAssoc.LEFT),
            (pp.one_of("* /"), 2, pp.OpAssoc.LEFT),
            (pp.one_of("+ -"), 2, pp.OpAssoc.LEFT),
        ],
    )
    return operator_operand

regular_number_parser()

Parse numbers as default from pyparsing

Returns:

Type Description
ParserElement

pp.ParserElement: Common number ParserElement for pyparsing

Source code in configcalc/parsers.py
29
30
31
32
33
34
35
def regular_number_parser() -> pp.ParserElement:
    """Parse numbers as default from pyparsing

    Returns:
        pp.ParserElement: Common number ParserElement for pyparsing
    """
    return pp.common.number

var_name_parser()

Parse a variable number composed of a base name and a tree like structure using dots (.) or a list like structure using square brackets ([]), or a combination of both.

Returns:

Type Description
ParserElement

pp.ParserElement: var name ParserElement for pyparsing

Source code in configcalc/parsers.py
44
45
46
47
48
49
50
51
52
53
54
def var_name_parser() -> pp.ParserElement:
    """Parse a variable number composed of a base name and a tree like structure
    using dots (.) or a list like structure using square brackets ([]), or a combination of both.

    Returns:
        pp.ParserElement: var name ParserElement for pyparsing
    """
    dict_like_key = pp.Suppress(".") + pp.common.identifier
    list_like_index = pp.Suppress("[") + pp.common.integer + pp.Suppress("]")
    subvar_element = dict_like_key ^ list_like_index
    return pp.Group(pp.common.identifier + subvar_element[...], aslist=True)