def compute_local_first(firsts, alpha): first_alpha = ContainerSet() try: alpha_is_epsilon = alpha.IsEpsilon except: alpha_is_epsilon = False if alpha_is_epsilon: first_alpha.set_epsilon() else: for symbol in alpha: first_alpha.update(firsts[symbol]) if not firsts[symbol].contains_epsilon: break else: first_alpha.set_epsilon() return first_alpha
def closure_lr1(items, firsts): closure = ContainerSet(*items) changed = True while changed: changed = False new_items = ContainerSet() for item in closure: exp = expand(item, firsts) new_items.extend(exp) changed = closure.update(new_items) return compress(closure)