Ejemplo n.º 1
0
 def to_fsm_sub(self, limits: Tuple[int, List[int]], counter: int, fsm: FSM,
                is_final: bool):
     """to_fsm_sub
     Transforms a node into a FSM
     :param limits: Limits of the FSM, of the form (first node, lasts nodes)
     :type limits: Tuple[int, List[int]]
     :param counter: A counter to prevent duplication of states
     :type counter: int
     :param fsm: The FSM which is beeing built
     :type fsm: FSM
     :param is_final: Whether the node is final or not
     :type is_final: bool
     :return: A new counter, to prevent duplication
     :rtype: int
     """
     first = limits[0]
     lasts = limits[1]
     if self.head.is_function():
         l_f = self.head.get_function().to_list()
         prev_state = first
         for i in range(len(l_f) - 1):
             fsm.add_transition(prev_state, counter, l_f[i])
             prev_state = counter
             counter += 1
         for last in lasts:
             fsm.add_transition(prev_state, last, l_f[-1])
             if is_final:
                 fsm.add_final(last)
     elif self.head.get_str() == ".":
         return self.to_fsm_sub_dot((first, lasts), counter, fsm, is_final)
     elif self.head.get_str() == "*":
         new_lasts = lasts[:]
         new_lasts.append(first)
         for son in self.sons:
             counter = son.to_fsm_sub((first, new_lasts), counter, fsm,
                                      is_final)
     elif self.head.get_str() == "|":
         for son in self.sons:
             if son.or_star():
                 fsm.add_transition(first, counter, "$")
                 counter = son.to_fsm_sub((counter, lasts), counter + 1,
                                          fsm, is_final)
             else:
                 counter = son.to_fsm_sub((first, lasts), counter + 1, fsm,
                                          is_final)
     return counter