Source code for pytrnsys_process.deck.visitor_helpers

import collections.abc as _cabc
import typing as _tp

import lark as _lark

_T = _tp.TypeVar("_T")


[docs] def get_child_token_value( token_type: str, tree: _lark.Tree, conversion_function: _cabc.Callable[[str], _T], ) -> _T: token = get_child_token_value_or_none( token_type, tree, conversion_function ) if not token: raise ValueError( f"`{tree.data}` doesn't contain a direct child token of type `{token_type}`." ) token_value = token return token_value
[docs] def get_child_token_value_or_none( token_type: str, tree: _lark.Tree, conversion_function: _tp.Callable[[str], _T], ) -> _T | None: token_or_none = get_child_token_or_none(token_type, tree) if not token_or_none: return None converted_value = conversion_function(token_or_none.value) return converted_value
[docs] def get_child_token_or_none( token_type: str, tree: _lark.Tree ) -> _lark.Token | None: tokens = get_child_tokens_or_empty_sequence(token_type, tree) n_tokens = len(tokens) if n_tokens == 0: return None if n_tokens > 1: raise ValueError(f"More than one token of type `{token_type}` found.") token = tokens[0] return token
[docs] def get_child_token_values_or_empty_sequence( token_type: str, tree: _lark.Tree ) -> _cabc.Sequence[str]: return [ t.value for t in get_child_tokens_or_empty_sequence(token_type, tree) ]
[docs] def get_child_token(token_type: str, tree: _lark.Tree) -> _lark.Token: token_or_none = get_child_token_or_none(token_type, tree) if not token_or_none: raise ValueError( f"`{tree.data}` doesn't contain a direct child token of type `{token_type}`." ) token = token_or_none return token
[docs] def get_child_tokens_or_empty_sequence( token_type: str, tree: _lark.Tree ) -> _cabc.Sequence[_lark.Token]: return [ c for c in tree.children if isinstance(c, _lark.Token) and c.type == token_type ]