def closure_1(grammar, state_set): assert False result = StateSet() # Step 1 for state in state_set.elements: result.add(state) # Step 2 for state in result: symbol = state.next_symbol() if isinstance(symbol, Nonterminal): f = set() for l in state.lookahead: betaL = [] betaL.extend(state.remaining_symbols()) betaL.append(l) f |= old2_first(grammar, betaL) alternatives = grammar[symbol].alternatives for a in alternatives: # create epsilon symbol if alternative is empty if a == []: a = [Epsilon()] p = Production(symbol, a) s = LR1Element(p, 0, f) if a == [epsilon]: s.d = 1 result.add(s) # merge states that only differ in their lookahead result.merge() return result
def closure_1(grammar, state_set): assert False result = StateSet() # Step 1 for state in state_set.elements: result.add(state) # Step 2 for state in result: symbol = state.next_symbol() if isinstance(symbol, Nonterminal): f = set() for l in state.lookahead: betaL = [] betaL.extend(state.remaining_symbols()) betaL.append(l) f |= old2_first(grammar, betaL) alternatives = grammar[symbol].alternatives for a in alternatives: # create epsilon symbol if alternative is empty if a == []: a = [Epsilon()] p = Production(symbol, a) s = LR1Element(p, 0, f) if a == [epsilon]: s.d = 1 result.add(s) # merge states that only differ in their lookahead result.merge() return result