Source code for grammarinator.runtime.dispatching_model

# Copyright (c) 2020-2026 Renata Hodovan, Akos Kiss.
#
# Licensed under the BSD 3-Clause License
# <LICENSE.rst or https://opensource.org/licenses/BSD-3-Clause>.
# This file may not be copied, modified, or distributed except
# according to those terms.

from .default_model import DefaultModel
from .rule import Rule


[docs] class DispatchingModel(DefaultModel): """ Base class of custom models that aim to override the decisions in specific rules. To override a decision point, the subclass must define methods in the form of ``choice_{rule_name}``, ``quantify_{rule_name}`` or ``charset_{rule_name}`` - with the same signature as their counterparts in :class:`DefaultModel` - in case of overriding an alternation, quantifier or charset decision, respectively. """
[docs] def choice(self, node: Rule, idx: int, weights: list[float]) -> int: """ Trampoline to the ``choice_{node.name}`` method of the subclassed model, if it exists. Otherwise, it calls the default implementation (:meth:`DefaultModel.choice`). """ name = 'choice_' + node.name return (getattr(self, name) if hasattr(self, name) else super().choice)(node, idx, weights)
[docs] def quantify(self, node: Rule, idx: int, cnt: int, start: int, stop: int | float, prob: float = 0.5) -> bool: """ Trampoline to the ``quantify_{node.name}`` method of the subclassed model, if it exists. Otherwise, it calls the default implementation (:meth:`DefaultModel.quantify`). """ name = 'quantify_' + node.name return (getattr(self, name) if hasattr(self, name) else super().quantify)(node, idx, cnt, start, stop, prob)
[docs] def charset(self, node: Rule, idx: int, chars: tuple[int, ...]) -> str: """ Trampoline to the ``charset_{node.name}`` method of the subclassed model, if it exists. Otherwise, it calls the default implementation (:meth:`DefaultModel.charset`). """ name = 'charset_' + node.name return (getattr(self, name) if hasattr(self, name) else super().charset)(node, idx, chars)