Example #1
0
def framework(txt, PWState, TheAnalyzer):
    """Implement the Pathwalker's framework. The scheme for a path-walker
       is the following:

           Pathwalker Head:

              Compares the current 'input' character if it is still
              on the path or not. If it is on the path we increment
              the 'path_iterator' and re-enter the path walker. If
              not, then the thread of control enters the transition
              map.

           Pathwalker Transition Map:

             The transition map is the common transition map that all
             implemented states had in common. Now, transitions to 
             states outside the path may happen.
    """
    LanguageDB = Setup.language_db
    input_do(txt, PWState, TheAnalyzer, ForceInputDereferencingF=True)
    LanguageDB.STATE_DEBUG_INFO(txt, PWState)

    # Three Versions of PathWalker Heads:
    if PWState.uniform_entry_command_list_along_all_paths is not None:
        # UNIFORM PATHS: Along the path, always the same (or no) commands are executed.
        #
        # PathWalker Head Implementation:
        #
        #        if input == *path_iterator:
        #           path_iterator += 1
        #           if *path_iterator != TerminationCode: goto CommonPathWalkerDoor
        #           else:                                 goto TerminalDoor
        #
        # -- "goto CommonPathWalkerDoor"
        uniform_entry_door_id = PWState.entry.get_door_id(PWState.index, PWState.index)
        goto_next_door = "            %s\n" % LanguageDB.GOTO_BY_DOOR_ID(uniform_entry_door_id)

        # -- "goto TerminalDoor"
        uniform_terminal_entry_door_id = PWState.get_uniform_terminal_entry_door_id(TheAnalyzer.state_db)
        if uniform_terminal_entry_door_id is not None:
            # All path have same terminal state and enter it at the same door
            goto_terminal_door = "            %s\n" % LanguageDB.GOTO_BY_DOOR_ID(uniform_terminal_entry_door_id)
        else:
            # The terminals of the paths are different
            #
            # The "goto TerminalDoor" is implemented for each path. The single
            # goto is split into a sequence:
            #
            #      if      path_iterator == path_0_end:  goto TerminalDoorOfPath0
            #      else if path_iterator == path_1_end:  goto TerminalDoorOfPath1
            #      else if path_iterator == path_2_end:  goto TerminalDoorOfPath2
            #      ...
            tmp = ""
            for path_id, sequence in enumerate(PWState.path_list):
                terminal_door_id = PathWalkerState.get_terminal_door_id(sequence, TheAnalyzer.state_db)
                tmp += "            %s" % LanguageDB.IF(
                    "path_iterator",
                    "==",
                    "path_walker_%i_path_%i + %s" % (PWState.index, path_id, len(sequence) - 1),
                    FirstF=(path_id == 0),
                ) + "                %s\n" % LanguageDB.GOTO_BY_DOOR_ID(terminal_door_id)
            tmp += "            %s" % LanguageDB.ELSE
            tmp += "                %s\n" % LanguageDB.UNREACHABLE
            tmp += "            %s\n" % LanguageDB.END_IF()
            goto_terminal_door = tmp

        path_walker_head = [
            "    %s" % LanguageDB.IF_INPUT("==", "*path_iterator"),
            "        %s\n" % LanguageDB.PATH_ITERATOR_INCREMENT,
            "        %s" % LanguageDB.IF("*path_iterator", "!=", "QUEX_SETTING_PATH_TERMINATION_CODE"),
            goto_next_door,
            "        %s" % LanguageDB.ELSE,
            goto_terminal_door,
            "        %s\n" % LanguageDB.END_IF(),
            "    %s\n" % LanguageDB.END_IF(),
        ]
    else:
        # NON UNIFORM PATHS
        #
        # PathWalker Head Implementation:
        #
        #     if input == *path_iterator:
        #        path_iterator += 1
        #        goto NextDoor(path_iterator)
        #
        # Here, the "goto TerminalDoor" results from NextDoor(path_iterator)
        # automatically, when the path_iterator stands on the last element.
        #
        label = "path_walker_%i_state_base[path_iterator - path_walker_%i_reference]" % (PWState.index, PWState.index)
        goto_next_door = "%s" % (LanguageDB.GOTO_BY_VARIABLE(label))

        path_walker_head = [
            "    %s" % LanguageDB.IF_INPUT("==", "*path_iterator"),
            "        %s\n" % LanguageDB.PATH_ITERATOR_INCREMENT,
            "        %s\n" % goto_next_door,
            "    %s\n" % LanguageDB.END_IF(),
        ]

    txt.extend(path_walker_head)
    return
Example #2
0
def framework(txt, PWState, TheAnalyzer):
    """Implement the Pathwalker's framework. The scheme for a path-walker
       is the following:

           Pathwalker Head:

              Compares the current 'input' character if it is still
              on the path or not. If it is on the path we increment
              the 'path_iterator' and re-enter the path walker. If
              not, then the thread of control enters the transition
              map.

           Pathwalker Transition Map:

             The transition map is the common transition map that all
             implemented states had in common. Now, transitions to 
             states outside the path may happen.
    """
    LanguageDB = Setup.language_db
    input_do(txt, PWState, TheAnalyzer, ForceInputDereferencingF=True)
    LanguageDB.STATE_DEBUG_INFO(txt, PWState)

    # Three Versions of PathWalker Heads:
    if PWState.uniform_entry_command_list_along_all_paths is not None:
        # UNIFORM PATHS: Along the path, always the same (or no) commands are executed.
        #
        # PathWalker Head Implementation:
        #
        #        if input == *path_iterator:
        #           path_iterator += 1
        #           if *path_iterator != TerminationCode: goto CommonPathWalkerDoor
        #           else:                                 goto TerminalDoor
        #
        # -- "goto CommonPathWalkerDoor"
        uniform_entry_door_id = PWState.entry.get_door_id(
            PWState.index, PWState.index)
        goto_next_door = "            %s\n" % LanguageDB.GOTO_BY_DOOR_ID(
            uniform_entry_door_id)

        # -- "goto TerminalDoor"
        uniform_terminal_entry_door_id = PWState.get_uniform_terminal_entry_door_id(
            TheAnalyzer.state_db)
        if uniform_terminal_entry_door_id is not None:
            # All path have same terminal state and enter it at the same door
            goto_terminal_door = "            %s\n" % LanguageDB.GOTO_BY_DOOR_ID(
                uniform_terminal_entry_door_id)
        else:
            # The terminals of the paths are different
            #
            # The "goto TerminalDoor" is implemented for each path. The single
            # goto is split into a sequence:
            #
            #      if      path_iterator == path_0_end:  goto TerminalDoorOfPath0
            #      else if path_iterator == path_1_end:  goto TerminalDoorOfPath1
            #      else if path_iterator == path_2_end:  goto TerminalDoorOfPath2
            #      ...
            tmp = ""
            for path_id, sequence in enumerate(PWState.path_list):
                terminal_door_id = PathWalkerState.get_terminal_door_id(
                    sequence, TheAnalyzer.state_db)
                tmp +=  "            %s"       % LanguageDB.IF("path_iterator", "==", "path_walker_%i_path_%i + %s" %  \
                                                               (PWState.index, path_id, len(sequence)-1),              \
                                                               FirstF=(path_id == 0))                                  \
                       + "                %s\n" % LanguageDB.GOTO_BY_DOOR_ID(terminal_door_id)
            tmp += "            %s" % LanguageDB.ELSE
            tmp += "                %s\n" % LanguageDB.UNREACHABLE
            tmp += "            %s\n" % LanguageDB.END_IF()
            goto_terminal_door = tmp

        path_walker_head = [
            "    %s" % LanguageDB.IF_INPUT("==", "*path_iterator"),
            "        %s\n" % LanguageDB.PATH_ITERATOR_INCREMENT,
            "        %s" % LanguageDB.IF("*path_iterator", "!=",
                                         "QUEX_SETTING_PATH_TERMINATION_CODE"),
            goto_next_door,
            "        %s" % LanguageDB.ELSE, goto_terminal_door,
            "        %s\n" % LanguageDB.END_IF(),
            "    %s\n" % LanguageDB.END_IF()
        ]
    else:
        # NON UNIFORM PATHS
        #
        # PathWalker Head Implementation:
        #
        #     if input == *path_iterator:
        #        path_iterator += 1
        #        goto NextDoor(path_iterator)
        #
        # Here, the "goto TerminalDoor" results from NextDoor(path_iterator)
        # automatically, when the path_iterator stands on the last element.
        #
        label          = "path_walker_%i_state_base[path_iterator - path_walker_%i_reference]" \
                         % (PWState.index, PWState.index)
        goto_next_door = "%s" % (LanguageDB.GOTO_BY_VARIABLE(label))

        path_walker_head = [
            "    %s" % LanguageDB.IF_INPUT("==", "*path_iterator"),
            "        %s\n" % LanguageDB.PATH_ITERATOR_INCREMENT,
            "        %s\n" % goto_next_door,
            "    %s\n" % LanguageDB.END_IF()
        ]

    txt.extend(path_walker_head)
    return
Example #3
0
def framework(txt, TState, TheAnalyzer):
    input_do(txt, TState, TheAnalyzer) 
    LanguageDB = Setup.language_db
    LanguageDB.STATE_DEBUG_INFO(txt, TState)
Example #4
0
def framework(txt, TState, TheAnalyzer):
    input_do(txt, TState, TheAnalyzer)
    LanguageDB = Setup.language_db
    LanguageDB.STATE_DEBUG_INFO(txt, TState)