def compute_follow(grammar, first): follow_list = [] follow_0 = Follow(0) for n in grammar.get_nonterminals(): if n != grammar.get_start_symbol(): follow_0.set_value_symbol(n, []) else: follow_0.set_value_symbol(n, ["epsilon"]) follow_list.append(follow_0) idx = 0 while True: idx += 1 follow = Follow(idx) for n in grammar.get_nonterminals(): f_list = [] for e in follow_list[idx - 1].get_values_for_symbol(n): f_list.append(e) for lhs, rhs in get_prod_with_n_rhs(n, grammar).items(): for p in rhs: x = get_first(n, p, first) for i in x: if i == "epsilon": for e in follow_list[idx - 1].get_values_for_symbol(lhs): if e not in f_list: f_list.append(e) else: if i not in f_list: f_list.append(i) follow.set_value_symbol(n, f_list) follow_list.append(follow) if compare_follows(follow_list[idx - 1], follow): break return follow_list[-1]