def get_first_set_multi(gram, tokens): g = gram.normalized_mode ret = set() eps_token = fact.create_epsilon() for token in tokens: token_set = get_first_set(gram, token) ret = ret.union(token_set) if eps_token not in token_set: if eps_token in ret: ret.remove(eps_token) return ret return ret
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
def eliminate_left_recursive(self): if not self.is_left_recursive(): return (self, None) ill_tokens_list = [itms for itms in self.right_tokens_list \ if itms[0] == self.left_token] healthy_tokens_list = [itms for itms in self.right_tokens_list \ if itms[0] != self.left_token] if len(ill_tokens_list) > 0: assert len(healthy_tokens_list) > 0, 'eliminate left recursive failed' owned_tokens_list = [] new_left_token = fact.create_unterminal(self.left_token.text + "'") for tokens in healthy_tokens_list: owned_tokens_list.append(tokens + [new_left_token]) self_cpy = express_factory.create_simple(self.left_token, owned_tokens_list) new_tokens_list = [] for tokens in ill_tokens_list: new_tokens_list.append(tokens[1 : ] + [new_left_token]) new_tokens_list.append([fact.create_epsilon()]) new_exp = express_factory.create_simple(new_left_token, new_tokens_list) return (self_cpy, new_exp)
def eliminate_left_recursive(self): if not self.is_left_recursive(): return (self, None) ill_tokens_list = [itms for itms in self.right_tokens_list \ if itms[0] == self.left_token] healthy_tokens_list = [itms for itms in self.right_tokens_list \ if itms[0] != self.left_token] if len(ill_tokens_list) > 0: assert len( healthy_tokens_list) > 0, 'eliminate left recursive failed' owned_tokens_list = [] new_left_token = fact.create_unterminal(self.left_token.text + "'") for tokens in healthy_tokens_list: owned_tokens_list.append(tokens + [new_left_token]) self_cpy = express_factory.create_simple(self.left_token, owned_tokens_list) new_tokens_list = [] for tokens in ill_tokens_list: new_tokens_list.append(tokens[1:] + [new_left_token]) new_tokens_list.append([fact.create_epsilon()]) new_exp = express_factory.create_simple(new_left_token, new_tokens_list) return (self_cpy, new_exp)
def get_token_lookahead_dot(self): if self.dot_pos >= len(self.right_tokens_list[0]) - 1: return fact.create_epsilon() return self.right_tokens_list[0][self.dot_pos + 1]
def get_token_after_dot(self): if self.dot_pos == len(self.right_tokens_list[0]): return fact.create_epsilon() return self.right_tokens_list[0][self.dot_pos]