def test_right_recursive(self): expected = first(self.right_recursive, ['T']) self.assertTrue(len(expected) == 2) self.assertTrue('id' in expected) self.assertTrue('(' in expected) expected = first(self.right_recursive, ['E']) self.assertTrue(len(expected) == 2) self.assertTrue('id' in expected) self.assertTrue('(' in expected)
def test_right_recursive_epsilon(self): expected = first(self.right_recursive_epsilon, ['T']) self.assertTrue(len(expected) == 3) self.assertTrue('id' in expected) self.assertTrue('(' in expected) self.assertTrue(self.right_recursive_epsilon.EMPTY in expected) expected = first(self.right_recursive_epsilon, ['E']) self.assertTrue(len(expected) == 5) self.assertTrue('id' in expected) self.assertTrue('(' in expected) self.assertTrue('+' in expected) self.assertTrue('-' in expected) self.assertTrue(self.right_recursive_epsilon.EMPTY in expected)
def test_functions_twolevels_grammar(self): expected = first(self.twolevels, ['A']) self.assertTrue(len(expected) == 1) self.assertTrue('c' in expected) expected = first(self.twolevels, ['B']) self.assertTrue(len(expected) == 1) self.assertTrue(self.twolevels.EMPTY in expected) expected = follow(self.twolevels, 'B') self.assertTrue(len(expected) == 1) self.assertTrue('c' in expected) expected = follow(self.twolevels, 'M') self.assertTrue(expected == follow(self.twolevels, 'B'))
def test_simple(self): expected = first(self.simple, ['A']) self.assertTrue(len(expected) == 2) self.assertTrue('a' in expected) self.assertTrue(self.simple.EMPTY in expected) expected = first(self.simple, ['B']) self.assertTrue(len(expected) == 2) self.assertTrue('b' in expected) self.assertTrue(self.simple.EMPTY in expected) expected = first(self.simple, ['S']) self.assertTrue(len(expected) == 3) self.assertTrue('s' in expected) self.assertTrue('b' in expected) self.assertTrue('a' in expected)
def test_lr_value_with_actions(self): expected = first(self.lrvalue_with_actions, ['S']) self.assertTrue(len(expected) == 3) self.assertTrue('(' in expected) self.assertTrue('*' in expected) self.assertTrue('id' in expected) expected = first(self.lrvalue_with_actions, ['L']) self.assertTrue(len(expected) == 2) self.assertTrue('*' in expected) self.assertTrue('id' in expected) expected = first(self.lrvalue_with_actions, ['R']) self.assertTrue(len(expected) == 3) self.assertTrue('(' in expected) self.assertTrue('*' in expected) self.assertTrue('id' in expected)
def test_functions_simple_grammar(self): expected = first(self.simple, ['A']) self.assertTrue(len(expected) == 1) self.assertTrue('a' in expected) expected = follow(self.simple, 'M') self.assertTrue(len(expected) == 1) self.assertTrue('a' in expected)
def test_more_complex(self): expected = first(self.more_complex, ['A']) self.assertTrue(len(expected) == 3) self.assertTrue('a' in expected) self.assertTrue('c' in expected) self.assertTrue(self.more_complex.EMPTY in expected) expected = first(self.more_complex, ['B']) self.assertTrue(len(expected) == 2) self.assertTrue('d' in expected) self.assertTrue('b' in expected) expected = first(self.more_complex, ['S']) self.assertTrue(len(expected) == 5) self.assertTrue('d' in expected) self.assertTrue('b' in expected) self.assertTrue('a' in expected) self.assertTrue('c' in expected) self.assertTrue('q' in expected)
def next_items(self, grammar): '''Given the item A -> abc*Bd [x], where x is the lookahead terminal, return each alternative of B -> *efg [y], for each 'y' in first(dx). Return a empty list if B is not a production or not exist B.''' alternative = grammar[self.sym_production][self.alternative] if self.at_the_end(alternative, grammar): # No exist 'next' return [] next_sym_production = alternative[self.position] if grammar.is_a_nonterminal(next_sym_production): result = [] first_set = first(grammar, alternative[self.position + 1:] + \ (self.lookahead,)) for terminal in first_set: result.extend([LR1(next_sym_production, i, 0, terminal) for i in range(len(grammar[next_sym_production]))]) return result else: return []