Skip to content

binary

binary

Arithmetic expression token.

BinaryOperator

Bases: MacroExpressionToken

Operation with two operands.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
class BinaryOperator(MacroExpressionToken):
    """Operation with two operands."""

    def __init__(
        self,
        string: str,
        location: int,
        left: MacroExpressionToken,
        right: MacroExpressionToken,
    ) -> None:
        super().__init__(string, location)
        self.left = left
        self.right = right
        self.operator: Callable[[Any, Any], Any] = add
        self.sign = "+"

    @classmethod
    def new(
        cls,
        string: str,
        location: int,
        tokens: ParseResults,
    ) -> Self:
        """Create instance of this class.

        Created to be used as callback in `ParserElement.set_parse_action()`.
        """
        left, right = tokens[0]
        return cls(
            string,
            location,
            MacroExpressionToken.ensure_type(left),
            MacroExpressionToken.ensure_type(right),
        )

    def to_parser2_expression(self, context: Parser2Context) -> Expression2:
        """Convert to `Expression2` descendant class."""
        raise NotImplementedError

    def evaluate_numeric(self, macro_context: MacroContext, state: State) -> Offset:
        """Evaluate numeric value of this macro expression."""
        left = self.left.evaluate_numeric(macro_context, state)
        right = self.right.evaluate_numeric(macro_context, state)
        output = self.operator(left, right)

        if not isinstance(output, Offset):
            raise InvalidArithmeticExpressionError

        return output

    def get_gerber_code(
        self,
        indent: str = "",
        endline: str = "\n",
    ) -> str:
        """Get gerber code from iterable of tokens."""
        return (
            f"{self.left.get_gerber_code(indent=indent, endline=endline)}{self.sign}"
            f"{self.right.get_gerber_code(indent=indent, endline=endline)}"
        )

    def __str__(self) -> str:
        return f"{super().__str__()}::[{self.left}, {self.right}]"

new classmethod

new(
    string: str, location: int, tokens: ParseResults
) -> Self

Create instance of this class.

Created to be used as callback in ParserElement.set_parse_action().

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
@classmethod
def new(
    cls,
    string: str,
    location: int,
    tokens: ParseResults,
) -> Self:
    """Create instance of this class.

    Created to be used as callback in `ParserElement.set_parse_action()`.
    """
    left, right = tokens[0]
    return cls(
        string,
        location,
        MacroExpressionToken.ensure_type(left),
        MacroExpressionToken.ensure_type(right),
    )

to_parser2_expression

to_parser2_expression(
    context: Parser2Context,
) -> Expression2

Convert to Expression2 descendant class.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def to_parser2_expression(self, context: Parser2Context) -> Expression2:
    """Convert to `Expression2` descendant class."""
    raise NotImplementedError

evaluate_numeric

evaluate_numeric(
    macro_context: MacroContext, state: State
) -> Offset

Evaluate numeric value of this macro expression.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def evaluate_numeric(self, macro_context: MacroContext, state: State) -> Offset:
    """Evaluate numeric value of this macro expression."""
    left = self.left.evaluate_numeric(macro_context, state)
    right = self.right.evaluate_numeric(macro_context, state)
    output = self.operator(left, right)

    if not isinstance(output, Offset):
        raise InvalidArithmeticExpressionError

    return output

get_gerber_code

get_gerber_code(
    indent: str = "", endline: str = "\n"
) -> str

Get gerber code from iterable of tokens.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def get_gerber_code(
    self,
    indent: str = "",
    endline: str = "\n",
) -> str:
    """Get gerber code from iterable of tokens."""
    return (
        f"{self.left.get_gerber_code(indent=indent, endline=endline)}{self.sign}"
        f"{self.right.get_gerber_code(indent=indent, endline=endline)}"
    )

MultiplicationOperator

Bases: BinaryOperator

Operation with two operands.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
class MultiplicationOperator(BinaryOperator):
    """Operation with two operands."""

    def __init__(
        self,
        string: str,
        location: int,
        left: MacroExpressionToken,
        right: MacroExpressionToken,
    ) -> None:
        super().__init__(string, location, left, right)
        self.operator: Callable[[Any, Any], Any] = mul
        self.sign = "x"

    def to_parser2_expression(self, context: Parser2Context) -> Expression2:
        """Convert to `Expression2` descendant class."""
        return context.macro_expressions.multiplication(
            lhs=self.left.to_parser2_expression(context),
            rhs=self.right.to_parser2_expression(context),
        )

to_parser2_expression

to_parser2_expression(
    context: Parser2Context,
) -> Expression2

Convert to Expression2 descendant class.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def to_parser2_expression(self, context: Parser2Context) -> Expression2:
    """Convert to `Expression2` descendant class."""
    return context.macro_expressions.multiplication(
        lhs=self.left.to_parser2_expression(context),
        rhs=self.right.to_parser2_expression(context),
    )

DivisionOperator

Bases: BinaryOperator

Operation with two operands.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
class DivisionOperator(BinaryOperator):
    """Operation with two operands."""

    def __init__(
        self,
        string: str,
        location: int,
        left: MacroExpressionToken,
        right: MacroExpressionToken,
    ) -> None:
        super().__init__(string, location, left, right)
        self.operator: Callable[[Any, Any], Any] = truediv
        self.sign = "/"

    def to_parser2_expression(self, context: Parser2Context) -> Expression2:
        """Convert to `Expression2` descendant class."""
        return context.macro_expressions.division(
            lhs=self.left.to_parser2_expression(context),
            rhs=self.right.to_parser2_expression(context),
        )

to_parser2_expression

to_parser2_expression(
    context: Parser2Context,
) -> Expression2

Convert to Expression2 descendant class.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def to_parser2_expression(self, context: Parser2Context) -> Expression2:
    """Convert to `Expression2` descendant class."""
    return context.macro_expressions.division(
        lhs=self.left.to_parser2_expression(context),
        rhs=self.right.to_parser2_expression(context),
    )

AdditionOperator

Bases: BinaryOperator

Operation with two operands.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
class AdditionOperator(BinaryOperator):
    """Operation with two operands."""

    def __init__(
        self,
        string: str,
        location: int,
        left: MacroExpressionToken,
        right: MacroExpressionToken,
    ) -> None:
        super().__init__(string, location, left, right)
        self.operator: Callable[[Any, Any], Any] = add
        self.sign = "+"

    def to_parser2_expression(self, context: Parser2Context) -> Expression2:
        """Convert to `Expression2` descendant class."""
        return context.macro_expressions.addition(
            lhs=self.left.to_parser2_expression(context),
            rhs=self.right.to_parser2_expression(context),
        )

to_parser2_expression

to_parser2_expression(
    context: Parser2Context,
) -> Expression2

Convert to Expression2 descendant class.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def to_parser2_expression(self, context: Parser2Context) -> Expression2:
    """Convert to `Expression2` descendant class."""
    return context.macro_expressions.addition(
        lhs=self.left.to_parser2_expression(context),
        rhs=self.right.to_parser2_expression(context),
    )

SubtractionOperator

Bases: BinaryOperator

Operation with two operands.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
class SubtractionOperator(BinaryOperator):
    """Operation with two operands."""

    def __init__(
        self,
        string: str,
        location: int,
        left: MacroExpressionToken,
        right: MacroExpressionToken,
    ) -> None:
        super().__init__(string, location, left, right)
        self.operator: Callable[[Any, Any], Any] = sub
        self.sign = "-"

    def to_parser2_expression(self, context: Parser2Context) -> Expression2:
        """Convert to `Expression2` descendant class."""
        return context.macro_expressions.subtraction(
            lhs=self.left.to_parser2_expression(context),
            rhs=self.right.to_parser2_expression(context),
        )

to_parser2_expression

to_parser2_expression(
    context: Parser2Context,
) -> Expression2

Convert to Expression2 descendant class.

Source code in src/pygerber/gerberx3/tokenizer/tokens/macro/expressions/binary.py
def to_parser2_expression(self, context: Parser2Context) -> Expression2:
    """Convert to `Expression2` descendant class."""
    return context.macro_expressions.subtraction(
        lhs=self.left.to_parser2_expression(context),
        rhs=self.right.to_parser2_expression(context),
    )