예제 #1
0
파일: mode.py 프로젝트: xxyzzzq/quex
    def __init__(self, Origin):
        """Translate a ModeDescription into a real Mode. Here is the place were 
        all rules of inheritance mechanisms and pattern precedence are applied.
        """
        assert isinstance(Origin, ModeDescription)
        self.name = Origin.name
        self.sr   = Origin.sr   # 'SourceRef' -- is immutable

        base_mode_sequence  = self.__determine_base_mode_sequence(Origin, [], [])
        # At least the mode itself must be there
        # The mode itself is base_mode_sequence[-1]
        assert len(base_mode_sequence) >= 1 \
               and base_mode_sequence[-1].name == self.name

        # Collect Options
        # (A finalized Mode does not contain an option_db anymore).
        options_db   = OptionDB.from_BaseModeSequence(base_mode_sequence)
        incidence_db = IncidenceDB.from_BaseModeSequence(base_mode_sequence)

        if (    E_IncidenceIDs.INDENTATION_DEDENT   in incidence_db \
            and E_IncidenceIDs.INDENTATION_N_DEDENT in incidence_db):
             error.log("After deriving from base mode, mode '%s' contains 'on_dedent'\n" % self.name
                       + "and 'on_n_dedent' handler. Both are mutually exclusive.", self.sr)

        # Determine Line/Column Counter Database
        counter_db   = options_db.value("counter")

        # Intermediate Step: Priority-Pattern-Terminal List (PPT list)
        #
        # The list is developed so that patterns can be sorted and code 
        # fragments are prepared.
        self.__pattern_list, \
        self.__terminal_db,  \
        self.__default_character_counter_required_f, \
        self.__doc_history_deletion, \
        self.__doc_history_reprioritization = \
                                      patterns_and_terminals.get(base_mode_sequence, 
                                                                 options_db, 
                                                                 counter_db, 
                                                                 incidence_db)
        
        # (*) Misc
        self.__abstract_f           = self.__is_abstract(Origin.incidence_db, 
                                                         Origin.option_db)
        self.__base_mode_sequence   = base_mode_sequence
        self.__entry_mode_name_list = options_db.value_list("entry") # Those can enter this mode.
        self.__exit_mode_name_list  = options_db.value_list("exit")  # This mode can exit to those.
        self.__incidence_db         = incidence_db
        self.__counter_db           = counter_db
        self.__on_after_match_code  = incidence_db.get(E_IncidenceIDs.AFTER_MATCH)
        self.__indentation_setup    = options_db.value("indentation")
예제 #2
0
파일: mode.py 프로젝트: dkopecek/amplify
    def __init__(self, Origin):
        """Translate a ModeDescription into a real Mode. Here is the place were 
        all rules of inheritance mechanisms and pattern precedence are applied.
        """
        assert isinstance(Origin, ModeDescription)
        self.name = Origin.name
        self.sr   = Origin.sr   # 'SourceRef' -- is immutable

        base_mode_sequence  = self.__determine_base_mode_sequence(Origin, [], [])
        # At least the mode itself must be there
        # The mode itself is base_mode_sequence[-1]
        assert len(base_mode_sequence) >= 1 \
               and base_mode_sequence[-1].name == self.name

        # Collect Options
        # (A finalized Mode does not contain an option_db anymore).
        options_db   = OptionDB.from_BaseModeSequence(base_mode_sequence)
        incidence_db = IncidenceDB.from_BaseModeSequence(base_mode_sequence)

        # Determine Line/Column Counter Database
        counter_db   = options_db.value("counter")

        # Intermediate Step: Priority-Pattern-Terminal List (PPT list)
        #
        # The list is developed so that patterns can be sorted and code 
        # fragments are prepared.
        self.__pattern_list, \
        self.__terminal_db,  \
        self.__default_character_counter_required_f, \
        self.__doc_history_deletion, \
        self.__doc_history_reprioritization = \
                                      patterns_and_terminals.get(base_mode_sequence, 
                                                                 options_db, 
                                                                 counter_db, 
                                                                 incidence_db)
        
        # (*) Misc
        self.__abstract_f           = self.__is_abstract(Origin.incidence_db, 
                                                         Origin.option_db)
        self.__base_mode_sequence   = base_mode_sequence
        self.__entry_mode_name_list = options_db.value_list("entry") # Those can enter this mode.
        self.__exit_mode_name_list  = options_db.value_list("exit")  # This mode can exit to those.
        self.__incidence_db         = incidence_db
        self.__counter_db           = counter_db
        self.__on_after_match_code  = incidence_db.get(E_IncidenceIDs.AFTER_MATCH)
        self.__indentation_setup    = options_db.value("indentation")
예제 #3
0
파일: mode.py 프로젝트: smmckay/quex3
    def finalize(self, ModePrepPrepDb):
        """REQUIRES: All Mode_PrepPrep-s have been defined.
           TASK:     Collect loopers, options, and incidence_db from base
                     mode list.
                     Finalize all patterns and loopers!
        """
        self._check_inheritance_relationships(ModePrepPrepDb)
        base_mode_name_sequence = \
                self._determine_base_mode_name_sequence(ModePrepPrepDb)

        assert len(base_mode_name_sequence) >= 1
        assert base_mode_name_sequence[-1] == self.name
        base_mode_sequence = [
            ModePrepPrepDb[name] for name in base_mode_name_sequence
        ]

        # Collect Options
        # (A finalized Mode does not contain an option_db anymore).
        collected_options_db = OptionDB.from_BaseModeSequence(
            base_mode_sequence)
        inheritable,           \
        exit_mode_name_list,   \
        entry_mode_name_list,  \
        loopers,               \
        ca_map                 = collected_options_db.finalize()
        abstract_f = (inheritable == "only")

        collected_incidence_db = IncidenceDB.from_BaseModeSequence(
            base_mode_sequence)

        pap_list = [
            PatternActionPair(pap.pattern().finalize(ca_map), pap.action())
            for pap in self.pattern_action_pair_list
        ]

        # At this stage, no information is aggregated from base types.
        return Mode_Prep(self.name, self.sr, base_mode_name_sequence, pap_list,
                         loopers, abstract_f, collected_incidence_db, ca_map,
                         entry_mode_name_list, exit_mode_name_list,
                         self.deletion_info_list,
                         self.reprioritization_info_list)