Exemple #1
0
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]