from itertools import chain from log import log class Chart: def __init__(self, tokens_length): self.open_edges = [[] for _ in range(tokens_length + 1)] self.closed_edges = [[] for _ in range(tokens_length + 1)] def append(self, edge): if edge.closed: self.closed_edges[edge.begin].append(edge) else: self.open_edges[edge.end].append(edge) def print(self): for edge in self.all_closed_edges(): # vypisuju i částečně uplatněné hrany a dokonce hrany s ε-pravidly # TODO: rozdělit výpis na hotové hrany (včetně ε-pravidel, ale tam # přeskakovat ty s příznakem „hidden“) a částečné (ale z těch asi # vybrat ty, které jsou zahrnuté v uzavřených hranách) # if edge.position == 0 and edge.rule: if edge: log.info('chart %s', edge) def all_closed_edges(self): return chain.from_iterable(self.closed_edges)