Пример #1
0
    def test_to_string(self):
        position = Position(self.source)

        position.go_to_end_of_line(2)
        self.assertEqual(position.to_string(), ("\nPosition:"
                                                "\n\tLine number: 2"
                                                "\n\tLine position: 20"
                                                "\n\tIndex: 39"))
Пример #2
0
 def __init__(self,
              parent: 'Scope',
              open_statement_position: Position,
              close_statement_position: Position = None,
              type: Header.Type = Header.Type.UNKNOWN):
   self.id = next(Scope.STATIC_ID)
   self.blocks_of_instructions = BlocksOfInstructions()
   self.header = Header(open_statement_position.get_index(), type)
   self.parent = parent
   self.childs = []
   self.open_statement_position = Position(position=open_statement_position)
   if close_statement_position == None:
     self.close_statement_position = Position(position=open_statement_position)
   else:
     self.close_statement_position = Position(
         position=close_statement_position)
Пример #3
0
  def process_close(self, close_statement_position: Position) -> 'Scope':
    """ Close this scope and return parent scope.

    Args:     
      open_statement_position: this scope close statement position.  

    Returns:
      string: Parent scope.
    """
    self.close_statement_position = Position(position=close_statement_position)
    return self.parent
Пример #4
0
    def _create_scopes_by_brackets(self):
        """ Create scope by brackets '{}'. 
    
    Raises:
      Exception: When occure problem while creating scopes.
    """
        current_position = Position(self.source)
        current_scope = self.root_scope
        is_open = False

        while True:
            if current_position.get_character() == '{':
                current_scope = current_scope.process_open(current_position)
                is_open = True
            if current_position.get_character() == '}':
                current_scope = current_scope.process_close(current_position)
                is_open = False
            if not current_position.move(): break

        current_scope.process_close(current_position)

        if is_open: raise Exception("One or more brackets missing.")
Пример #5
0
    def test_open_and_close(self):
        source = Source(self.test_source_path)

        root_scope = Scope(None, Position(source))
        # 1# child
        scope = root_scope.process_open(Position(source))
        scope = scope.process_close(Position(source))
        # 2# child
        scope = scope.process_open(Position(source))
        scope = scope.process_close(Position(source))
        # 3# child
        scope = scope.process_open(Position(source))
        scope = scope.process_close(Position(source))
        # 4# child
        scope = scope.process_open(Position(source))
        scope = scope.process_close(Position(source))

        self.assertEqual(len(root_scope.childs), 4)
        if __name__ == '__main__':
            self.assertEqual(root_scope.id, 0)
            self.assertEqual(root_scope.childs[0].id, 1)
            self.assertEqual(root_scope.childs[1].id, 2)
            self.assertEqual(root_scope.childs[2].id, 3)
            self.assertEqual(root_scope.childs[3].id, 4)
Пример #6
0
    def test_init(self):
        with self.assertRaises(Exception):
            Position(None)
        with self.assertRaises(Exception):
            Position(None, None)

        position = Position(self.source)

        self.assertEqual(position.get_index(), position._index)
        self.assertEqual(position.get_line_number(), position._line_number)
        self.assertEqual(position.get_line_position(), position._line_position)

        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        self.assertTrue(position.move(5))
        position_2 = Position(position=position)
        self.assertEqual(position.get_index(), position_2.get_index())
        self.assertEqual(position.get_line_number(),
                         position_2.get_line_number())
        self.assertEqual(position.get_line_position(),
                         position_2.get_line_position())
Пример #7
0
    def test_set_positions(self):
        position = Position(self.source)

        self.assertTrue(position.move(7))
        self.assertEqual(position.get_character(), " ")

        # When there's no characters after spaces
        self.source.str = " " * 5
        position = Position(self.source)
        self.assertFalse(position.set_after_spaces())
        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        # When there's no characters before spaces
        self.assertTrue(position.go_to_end_of_line())
        self.assertFalse(position.set_before_spaces())
        self.assertEqual(position.get_index(), 4)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 5)

        # When there's are characters after spaces
        self.source.restore()
        position = Position(self.source)
        self.assertTrue(position.move(7))
        self.assertTrue(position.set_after_spaces())
        self.assertEqual(position.get_index(), 13)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 14)
        self.assertEqual(position.get_character(), "s")

        # When there's are characters before spaces
        self.assertTrue(position.set_before_spaces())
        self.assertEqual(position.get_index(), 6)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 7)
        self.assertEqual(position.get_character(), "s")

        # With default argument
        self.assertTrue(position.go_to_begin_of_line())
        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        # With default argument
        self.assertTrue(position.go_to_end_of_line())
        self.assertEqual(position.get_index(), 19)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 20)

        # With given arguments, go through some different variations
        self.assertTrue(position.go_to_begin_of_line(6))
        self.assertEqual(position.get_character(), "T")
        self.assertEqual(position.get_index(), 61)
        self.assertEqual(position.get_line_number(), 6)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.go_to_begin_of_line(10))
        self.assertEqual(position.get_index(), 157)
        self.assertEqual(position.get_line_number(), 10)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.go_to_begin_of_line(2))
        self.assertEqual(position.get_character(), "T")
        self.assertEqual(position.get_index(), 20)
        self.assertEqual(position.get_line_number(), 2)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.go_to_begin_of_line(5))
        self.assertEqual(position.get_index(), 60)
        self.assertEqual(position.get_line_number(), 5)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.go_to_begin_of_line(1))
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        # With given arguments, go through some different variations
        self.assertTrue(position.go_to_end_of_line(1))
        self.assertEqual(position.get_index(), 19)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 20)
        #
        self.assertTrue(position.go_to_end_of_line(5))
        self.assertEqual(position.get_index(), 60)
        self.assertEqual(position.get_line_number(), 5)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.go_to_end_of_line(10))
        self.assertEqual(position.get_index(), 178)
        self.assertEqual(position.get_line_number(), 10)
        self.assertEqual(position.get_line_position(), 22)

        # Go to not exist lines
        self.assertFalse(position.go_to_begin_of_line(200))
        self.assertEqual(position.get_index(), 178)
        self.assertEqual(position.get_line_number(), 10)
        self.assertEqual(position.get_line_position(), 22)
        #
        self.assertFalse(position.go_to_end_of_line(1011))
        self.assertEqual(position.get_index(), 178)
        self.assertEqual(position.get_line_number(), 10)
        self.assertEqual(position.get_line_position(), 22)

        # Find bound right parenthesis containing others bounded parentheses
        self.assertTrue(position.go_to_begin_of_line(9))
        self.assertTrue(position.move(5))
        self.assertEqual(position.get_line_position(), 6)
        self.assertEqual(position.get_character(), "(")
        #
        self.assertTrue(position.set_at_right_bound_parenthesis())
        self.assertEqual(position.get_line_position(), 27)
        self.assertEqual(position.get_character(), ")")

        # Find bound left parenthesis containing others bounded parentheses
        self.assertTrue(position.set_at_left_bound_parenthesis())
        self.assertEqual(position.get_line_position(), 6)
        self.assertEqual(position.get_character(), "(")

        # When bound parenthesis not exist
        self.assertTrue(position.go_to_begin_of_line(8))
        self.assertTrue(position.move(16))
        self.assertFalse(position.set_at_left_bound_parenthesis())
        self.assertEqual(position.get_line_position(), 17)
        #
        self.assertTrue(position.go_to_begin_of_line(10))
        self.assertTrue(position.move(16))
        self.assertFalse(position.set_at_right_bound_parenthesis())
        self.assertEqual(position.get_line_position(), 17)

        # When index is not set at parenthesis
        self.assertTrue(position.go_to_begin_of_line(6))
        self.assertFalse(position.set_at_left_bound_parenthesis())
        self.assertFalse(position.set_at_right_bound_parenthesis())
Пример #8
0
    def test_move_and_rmove(self):
        position = Position(self.source)

        first_line_data = "This is test string\n"
        first_line_lenght = len(first_line_data)

        # Move with default parameter
        self.assertTrue(position.move())
        self.assertEqual(position.get_index(), 1)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 2)

        # Move with given parameter
        self.assertTrue(position.move(2))
        self.assertEqual(position.get_index(), 3)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 4)

        # Move throught new line
        self.assertTrue(position.move(first_line_lenght))
        self.assertEqual(position.get_index(), first_line_lenght + 3)
        self.assertEqual(position.get_line_number(), 2)
        self.assertEqual(position.get_line_position(), 4)

        # Rmove throught new line
        self.assertTrue(position.rmove(first_line_lenght))
        self.assertEqual(position.get_index(), 3)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 4)

        # Rmove with given parameter
        self.assertTrue(position.rmove(2))
        self.assertEqual(position.get_index(), 1)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 2)

        # Rmove with default parameter
        self.assertTrue(position.rmove())
        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        # Test move throught many new lines
        self.assertTrue(position.move(61))
        self.assertEqual(position.get_index(), 61)
        self.assertEqual(position.get_line_number(), 6)
        self.assertEqual(position.get_line_position(), 1)

        # Test rmove throught many new lines
        self.assertTrue(position.rmove())
        self.assertEqual(position.get_line_number(), 5)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.rmove())
        self.assertEqual(position.get_line_number(), 4)
        self.assertEqual(position.get_line_position(), 1)
        #
        self.assertTrue(position.rmove())
        self.assertEqual(position.get_line_number(), 3)
        self.assertEqual(position.get_line_position(), 19)
        #
        self.assertTrue(position.rmove(58))
        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)

        # Test move outside source range
        position = Position(self.source)
        self.assertFalse(position.rmove())
        self.assertEqual(position.get_index(), 0)
        self.assertEqual(position.get_line_number(), 1)
        self.assertEqual(position.get_line_position(), 1)
        self.assertTrue(position.go_to_end_of_line(10))
        #
        self.assertFalse(position.move())
        self.assertEqual(position.get_index(), 178)
        self.assertEqual(position.get_line_number(), 10)
        self.assertEqual(position.get_line_position(), 22)
Пример #9
0
 def test_all(self):
   source = Source(self.test_source_path)
   root_scope = Scope(None, Position(source))
   python_source = PythonSource(root_scope)
Пример #10
0
 def __init__(self, file_path: str):
     self.source = Source(file_path)
     self.root_scope = Scope(parent=None,
                             open_statement_position=Position(self.source),
                             type=Header.Type.ROOT)
     self.python_source = None
Пример #11
0
    def _set_header_to_scope(self, scope: Scope):
        """ Set header to scope

    Args:
      scope: scope to set header.

    Raises:
      Exception: When occure problem while settup header.
    """
        current_position = Position(position=scope.open_statement_position)

        #  *  <-     *
        # ')' <- ')  {'
        current_position.set_before_spaces()

        scope_type = Header.Type.UNKNOWN
        scope_header_start = 0
        scope_header_size = 0

        its_not_function = False

        if current_position.get_character() == ')':
            # Possible: [function] or [while] or [if]

            #               * <-*
            # 'while( (a) > (b) )'
            found = util.rfind(self.source.str, '(',
                               current_position.get_index())
            if found == -1:
                raise Exception("Not found left parenthesis: '('. %s" %
                                (current_position.to_string()))

            #  '( )'  33 % is function
            # '( (a) > (b) )' 100% is NOT function
            if (current_position.get_index() - found > 1 and (util.find(
                (util.substr(self.source.str, found + 1,
                             current_position.get_index() - found - 1)),
                    ")") != -1)):  # Possible: [while] or [if]
                current_position.set_at_left_bound_parenthesis()
                its_not_function = True
            else:  # Possible: [function] or [while] or [if]
                current_position.rmove(current_position.get_index() - found)

            #   * <- *
            # 'if    (a)'
            current_position.set_before_spaces()

            if_statement = "if"
            while_statement = "while"
            start_index_of_if_statement = (current_position.get_index() -
                                           len(if_statement) + 1)
            start_index_of_while_statement = (current_position.get_index() -
                                              len(while_statement) + 1)

            if (util.substr(self.source.str, start_index_of_if_statement,
                            len(if_statement)) == if_statement):  # [IF]
                scope_type = Header.Type.IF_STATEMENT
                scope_header_start = start_index_of_if_statement
                scope_header_size = (
                    scope.open_statement_position.get_index() -
                    start_index_of_if_statement)
            elif (util.substr(
                    self.source.str, start_index_of_while_statement,
                    len(while_statement)) == while_statement):  # [WHILE]
                scope_type = Header.Type.LOOP_WHILE
                scope_header_start = start_index_of_while_statement
                scope_header_size = (
                    scope.open_statement_position.get_index() -
                    start_index_of_while_statement)
            else:  # [FUNCTION]
                if its_not_function:
                    raise Exception(
                        "Wrong statement. Its not 'while' and not 'if': '('. "
                        + current_position.to_string())

                start_index_of_function = -1
                if current_position.get_line_number() == 1:
                    start_index_of_function = 0
                else:
                    new_line_character = "\n"
                    start_index_of_function = (
                        util.rfind(self.source.str, new_line_character,
                                   current_position.get_index()) +
                        len(new_line_character))
                    if start_index_of_function == -1:
                        raise Exception("No function type: '('. %s" %
                                        (current_position.to_string()))

                scope_type = Header.Type.FUNCTION
                scope_header_start = start_index_of_function
                scope_header_size = (
                    scope.open_statement_position.get_index() -
                    start_index_of_function)

            # TODO
            # Check if position of '(' is outsdie of possile range like parent
            # openStatementPosition or previous child
            # closeStatementPosition
        else:  # [struct]
            # TODO
            # Check if position of 'struct' is outsdie of possile range like parent
            # openStatementPosition or previous child
            # closeStatementPosition

            scope_type = Header.Type.STRUCT

            found = util.rfind(self.source.str, "struct",
                               current_position.get_index())
            if found == -1:
                raise Exception(
                    "Not found struct statement: 'struct'. {}".format(
                        current_position.to_string()))

            scope_header_start = found
            scope_header_size = (scope.open_statement_position.get_index() -
                                 found)

        if scope_type == Header.Type.UNKNOWN:
            raise Exception("Unknown scope type")

        scope.header.set(
            scope_type,
            util.substr(self.source.str, scope_header_start,
                        scope_header_size), scope_header_start)