def is_pending_reduce(self): if self.dot_pos == len(self.right_tokens_list[0]): return True #easy to ignore: if all tokens after dot are eps, the exp is also pending reduce for i in xrange(self.dot_pos, len(self.right_tokens_list[0])): if not tokens.is_epsilon(self.right_tokens_list[0][i]): return False return True
def get_first_set(gram, t): ret = set() g = gram.normalized_mode if tokens.is_terminal(t) or tokens.is_epsilon(t): ret.add(t) return ret eps_token = fact.create_epsilon() exps = g.get_expresses_by_left(t) for exp in exps: for _tokens in exp.right_tokens_list: tmp = get_first_set_multi(gram, _tokens) ret = ret.union(tmp) return ret