示例#1
0
def new_grammar(
    concept: grammar.Concept,
    model: NameWithGenderWithFormatting,
    value_type: ValueType,
    simple_expressions: Sequence[NameAndValue[grammar.Primitive[
        MatcherSdv[MODEL]]]],
    model_freezer: Callable[[MODEL], MODEL],
    description: Callable[[], SectionContents] = SectionContents.empty
) -> grammar.Grammar[MatcherSdv[MODEL]]:
    tp = TextParser({
        'model': model,
    })

    all_simple_expressions = list(simple_expressions) + [
        parse_constant.CONSTANT_PRIMITIVE
    ]

    def mk_reference(symbol_name: str) -> MatcherSdv[MODEL]:
        return symbol_reference.MatcherReferenceSdv(symbol_name, value_type)

    def mk_conjunction(operands: Sequence[MODEL]) -> MODEL:
        return combinator_sdvs.Conjunction(operands, model_freezer)

    def mk_disjunction(operands: Sequence[MODEL]) -> MODEL:
        return combinator_sdvs.Disjunction(operands, model_freezer)

    return grammar.Grammar(
        concept,
        description=description,
        mk_reference=mk_reference,
        primitives=all_simple_expressions,
        prefix_operators=[
            NameAndValue(
                logic.NOT_OPERATOR_NAME,
                grammar.PrefixOperator(
                    combinator_sdvs.Negation,
                    OperatorDescriptionFromFunctions(
                        tp.fnap__fun(_NOT_SED_DESCRIPTION))))
        ],
        infix_operators_in_order_of_increasing_precedence=(
            (NameAndValue(
                logic.OR_OPERATOR_NAME,
                grammar.InfixOperator(
                    mk_disjunction,
                    InfixOperatorDescriptionFromFunctions(
                        tp.fnap__fun(_OR_SED_DESCRIPTION),
                        operand_evaluation__lazy__left_to_right=True,
                    ))), ),
            (NameAndValue(
                logic.AND_OPERATOR_NAME,
                grammar.InfixOperator(
                    mk_conjunction,
                    InfixOperatorDescriptionFromFunctions(
                        tp.fnap__fun(_AND_SED_DESCRIPTION),
                        operand_evaluation__lazy__left_to_right=True,
                    ))), ),
        ),
    )
示例#2
0
def _name_part_description(
    part_primitive: str,
    get_part: Callable[[FileNames], str],
) -> Callable[[], List[ParagraphItem]]:
    tp = TextParser({
        'MODEL': matcher_model.FILE_MATCHER_MODEL,
        'name': file_matcher.NAME_MATCHER_NAME,
        'part': part_primitive,
        'example_name': _FILE_NAMES_EXAMPLE.name,
        'example_part': get_part(_FILE_NAMES_EXAMPLE),
    })

    return tp.fnap__fun(_NAME_PART_DESCRIPTION)
示例#3
0
        return self._references

    def resolve(self, symbols: SymbolTable) -> StringTransformerDdv:
        num_transformers = len(self.transformers)
        if num_transformers == 0:
            return StringTransformerConstantDdv(IdentityStringTransformer())
        elif num_transformers == 1:
            return self.transformers[0].resolve(symbols)
        else:
            return StringTransformerSequenceDdv([
                transformer.resolve(symbols)
                for transformer in self.transformers
            ])


_SEQUENCE_TRANSFORMER_SED_DESCRIPTION = """\
Composition of {_TRANSFORMER_:s}.


The output of the {_TRANSFORMER_} to the left is given as input to
the {_TRANSFORMER_} to the right.
"""

_TEXT_PARSER = TextParser({
    '_TRANSFORMER_':
    types.STRING_TRANSFORMER_TYPE_INFO.name,
})

SYNTAX_DESCRIPTION = InfixOperatorDescriptionFromFunctions(
    _TEXT_PARSER.fnap__fun(_SEQUENCE_TRANSFORMER_SED_DESCRIPTION))
                ],
                _TP.fnap(DIR_CONTENTS_RECURSION_DESCRIPTION),
            )
        ], _TP.fnap(_DIR_FILE_SET_OPTIONS_MAIN))


REGULAR_FILE_DOCUMENTATION_SETUP = file_contents_utils.DocumentationSetup(
    NAMES, ())

SPECIAL_DIR_ENTRIES = """\
The '.' and '..' directory entries are not included in the set of matched files.
"""

DIR_DOCUMENTATION = file_contents_utils.DocumentationSetup(
    dir_contents.NAMES, TRAVERSAL_OPTION_USAGES, get_dir_syntax_descriptions,
    _TP.fnap__fun(SPECIAL_DIR_ENTRIES))

_ERROR_WHEN_INVALID_FILE__OUTCOME = """\
The result is {HARD_ERROR} if {checked_file} is not an existing {file_type}.
"""

_NOTES = """\
{SYMBOLIC_LINKS_ARE_FOLLOWED}.
"""

MATCHER_FILE_HANDLING_DESCRIPTION = file_contents_utils.MATCHER_FILE_HANDLING_DESCRIPTION

_DIR_FILE_SET_OPTIONS_MAIN = """\
By default, only the direct contents of the tested directory is included -
sub directory contents is excluded.
"""