示例#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 项目: smmckay/quex3
    def __init__(self, Name, SourceReference):
        # Register Mode_PrepPrep at the mode database
        self.name = Name
        self.sr = SourceReference

        self.direct_base_mode_name_list = []

        self.pattern_action_pair_list = []
        self.option_db = OptionDB()  # map: option_name    --> OptionSetting
        self.incidence_db = IncidenceDB(
        )  # map: incidence_name --> CodeFragment

        self.reprioritization_info_list = []
        self.deletion_info_list = []
示例#3
0
文件: mode.py 项目: xxyzzzq/quex
    def __init__(self, Name, SourceReference):
        # Register ModeDescription at the mode database
        blackboard.mode_description_db[Name] = self
        self.name  = Name
        self.sr    = SourceReference

        self.derived_from_list          = []

        self.pattern_action_pair_list   = []  
        self.option_db                  = OptionDB()    # map: option_name    --> OptionSetting
        self.incidence_db               = IncidenceDB() # map: incidence_name --> CodeFragment

        self.reprioritization_info_list = []  
        self.deletion_info_list         = [] 
示例#4
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")
示例#5
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)
示例#6
0
def create_state_machine_function(PatternActionPairList,
                                  PatternDictionary,
                                  BufferLimitCode,
                                  SecondModeF=False):
    global dial_db
    incidence_db = IncidenceDB()

    if not SecondModeF: sm_name = "M"
    else: sm_name = "M2"

    Setup.analyzer_class_name = "TestAnalyzer"
    Setup.analyzer_name_safe = "TestAnalyzer"

    # (*) Initialize address handling
    dial_db = DialDB()  # BEFORE constructor of generator;
    variable_db.variable_db.init(
    )  # because constructor creates some addresses.
    blackboard.required_support_begin_of_line_set()
    terminal_factory = TerminalFactory(sm_name, incidence_db, dial_db)

    # -- Display Setup: Patterns and the related Actions
    print "(*) Lexical Analyser Patterns:"
    for pair in PatternActionPairList:
        print "%20s --> %s" % (pair[0], pair[1])

    def action(ThePattern, PatternName):
        txt = []
        if ThePattern.sm_bipd_to_be_reversed is not None:
            terminal_factory.do_bipd_entry_and_return(txt, pattern)

        txt.append("%s\n" % Lng.STORE_LAST_CHARACTER(
            blackboard.required_support_begin_of_line()))
        txt.append("%s\n" % Lng.LEXEME_TERMINATING_ZERO_SET(True))
        txt.append('printf("%19s  \'%%s\'\\n", Lexeme); fflush(stdout);\n' %
                   PatternName)

        if "->1" in PatternName:
            txt.append(
                "me->current_analyzer_function = QUEX_NAME(M_analyzer_function);\n"
            )
        elif "->2" in PatternName:
            txt.append(
                "me->current_analyzer_function = QUEX_NAME(M2_analyzer_function);\n"
            )

        if "CONTINUE" in PatternName: txt.append("")
        elif "STOP" in PatternName:
            txt.append(
                "QUEX_NAME(MF_error_code_set_if_first)(me, E_Error_UnitTest_Termination); return;\n"
            )
        else:
            txt.append("return;\n")

        txt.append(
            "%s\n" %
            Lng.GOTO(DoorID.continue_with_on_after_match(dial_db), dial_db))
        ## print "#", txt
        return CodeTerminal(txt)

    pattern_action_list = [
        (regex.do(pattern_str, PatternDictionary), action_str)
        for pattern_str, action_str in PatternActionPairList
    ]

    ca_map = LineColumnCount_Default()
    pattern_list = []
    terminal_db = {}
    for pattern, action_str in pattern_action_list:
        pattern = pattern.finalize(ca_map)
        name = Lng.SAFE_STRING(pattern.pattern_string())
        terminal = Terminal(action(pattern, action_str), name, dial_db=dial_db)
        terminal.set_incidence_id(pattern.incidence_id)

        pattern_list.append(pattern)
        terminal_db[pattern.incidence_id] = terminal

    # -- PatternList/TerminalDb
    #    (Terminals can only be generated after the 'mount procedure', because,
    #     the bipd_sm is generated through mounting.)
    on_failure = CodeTerminal([
        "QUEX_NAME(MF_error_code_set_if_first)(me, E_Error_UnitTest_Termination); return;\n"
    ])
    terminal_db.update({
        E_IncidenceIDs.MATCH_FAILURE:
        Terminal(on_failure,
                 "FAILURE",
                 E_IncidenceIDs.MATCH_FAILURE,
                 dial_db=dial_db),
        E_IncidenceIDs.END_OF_STREAM:
        Terminal(on_failure,
                 "END_OF_STREAM",
                 E_IncidenceIDs.END_OF_STREAM,
                 dial_db=dial_db),
        E_IncidenceIDs.BAD_LEXATOM:
        Terminal(on_failure,
                 "BAD_LEXATOM",
                 E_IncidenceIDs.BAD_LEXATOM,
                 dial_db=dial_db),
        E_IncidenceIDs.LOAD_FAILURE:
        Terminal(on_failure,
                 "LOAD_FAILURE",
                 E_IncidenceIDs.LOAD_FAILURE,
                 dial_db=dial_db),
    })

    mode = Mode(sm_name,
                SourceRef_VOID,
                pattern_list,
                terminal_db, [],
                incidence_db,
                RunTimeCounterDb=None,
                ReloadStateForward=None,
                RequiredRegisterSet=set(),
                dial_db=dial_db,
                Documentation=ModeDocumentation([], [], [], [], []))

    print "## (1) code generation"

    txt = engine_generator.do_with_counter(mode, ["M", "M2"])
    assert all_isinstance(txt, str)

    return "#define  QUEX_OPTION_UNIT_TEST_EXT\n" + "".join(txt)