Ejemplo n.º 1
0
 def __restore_previous_state(self, grammar: Grammar) -> None:
     to_remove = set(grammar.get_rules())
     for rule in to_remove:
         grammar.remove_rule(rule)
         self.iteration.remove_crowding_rule(rule)
     for rule in self.__last_rules:
         grammar.add_rule(rule)
         self.iteration.add_rule(rule)
Ejemplo n.º 2
0
 def __replace_all_symbols_in_rules(self, replacement: Symbol,
                                    replaced: Symbol,
                                    grammar: Grammar) -> None:
     rules: Set[Rule] = grammar.get_rules()
     rules_copy = set(rules)
     for rule in rules_copy:
         if self.__rule_contains_replaced_symbol(rule, replaced):
             new_rule = self.__replace_symbols_in_rule(
                 replacement, replaced, rule)
             grammar.remove_rule(rule)
             grammar.add_rule(new_rule)
Ejemplo n.º 3
0
    def split(self, grammar: Grammar) -> None:
        replaced: Symbol = self.__find_nonterminal(grammar)
        replacement: Tuple[Symbol,
                           Symbol] = self.__find_unused_symbols_pair(grammar)
        print("[split] replaced = {} replacement = {}".format(
            replaced, replacement))
        if replacement is not None:
            rules: Set[Rule] = grammar.get_rules()
            rules_copy = set(rules)
            for rule in rules_copy:
                if rule.left == replaced:
                    first_rule = self.__create_rule(replacement[0],
                                                    rule.right1, rule.right2)
                    second_rule = self.__create_rule(replacement[1],
                                                     rule.right1, rule.right2)
                    grammar.remove_rule(rule)
                    grammar.add_rule(first_rule)
                    grammar.add_rule(second_rule)
                    self.iteration.remove_crowding_rule(rule)
                    self.iteration.add_rule(first_rule)
                    self.iteration.add_rule(second_rule)

            rules: Set[Rule] = grammar.get_rules()
            rules_copy = set(rules)
            for rule in rules_copy:
                if rule.right1 == replaced:
                    grammar.remove_rule(rule)
                    first_rule = self.__create_rule(rule.left, replacement[0],
                                                    rule.right2)
                    second_rule = self.__create_rule(rule.left, replacement[1],
                                                     rule.right2)
                    grammar.add_rule(first_rule)
                    grammar.add_rule(second_rule)
                    self.iteration.remove_crowding_rule(rule)
                    self.iteration.add_rule(first_rule)
                    self.iteration.add_rule(second_rule)

            rules: Set[Rule] = grammar.get_rules()
            rules_copy = set(rules)
            for rule in rules_copy:
                if rule.right2 == replaced:
                    first_rule = self.__create_rule(rule.left, rule.right1,
                                                    replacement[0])
                    second_rule = self.__create_rule(rule.left, rule.right1,
                                                     replacement[1])
                    grammar.remove_rule(rule)
                    grammar.add_rule(first_rule)
                    grammar.add_rule(second_rule)
                    self.iteration.remove_crowding_rule(rule)
                    self.iteration.add_rule(first_rule)
                    self.iteration.add_rule(second_rule)