def test_first_empty_in_rhs(): """ Test FIRST calculation when there are empty derivations in RHS of a production. """ grammar = """ S: A C; A: B | EMPTY; terminals B: "b"; C: "c"; """ g = Grammar.from_string(grammar) first_set = first(g) A = g.get_nonterminal('A') B = g.get_terminal('B') C = g.get_terminal('C') S = g.get_nonterminal('S') assert EMPTY in first_set[A] assert B in first_set[A] assert B in first_set[S] # 'A' can derive empty, thus 'C' must be in firsts of 'S'. assert C in first_set[S]
def test_first(): """ Tests FIRST function. FIRST function returns a set of terminals that could start the sentence derived from the given non-terminal. """ expression_grammar = get_grammar() first_set = first(expression_grammar) assert OPEN in first_set[T] assert ID in first_set[T]
def test_first_empty_in_rhs(): """ Test FIRST calculation when there are empty derivations in RHS of a production. """ grammar = """ S: A C; A: B | EMPTY; B: "b"; C: "c"; """ g = Grammar.from_string(grammar) first_set = first(g) assert EMPTY in first_set[NonTerminal('A')] assert Terminal('B') in first_set[NonTerminal('A')] assert Terminal('B') in first_set[NonTerminal('S')] # 'A' can derive empty, thus 'C' must be in firsts of 'S'. assert Terminal('C') in first_set[NonTerminal('S')]