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, ))), ), ), )
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)
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. """