def goto(g, itms, trans_token): ret = set() for itm in itms.item_set: if itm.get_token_after_dot() == trans_token: new_itm = express_factory.create_lr1(itm.left_token, \ itm.get_right_tokens(), itm.dot_pos + 1, itm.acc_tokens) ret.add(new_itm) retset = itemset_factory.create_lr1_itemset(ret) return closure(g, retset)
def merge(item_list): #TODO: debug mode assert item_list are same_core ? item_list_sample = item_list[0].to_acc_merged_form().get_sorted_items() item_list_merged = [item.to_acc_merged_form().get_sorted_items() for item in item_list] new_item_set = set() for i in xrange(len(item_list_sample)): acc_tokens_set = set() for j in xrange(len(item_list_merged)): acc_tokens_set = acc_tokens_set.union(item_list_merged[j][i].acc_tokens) new_item_set.add(express_factory.create_lr1(item_list_sample[i].left_token, \ item_list_sample[i].get_right_tokens(), \ item_list_sample[i].dot_pos, \ acc_tokens_set)) ret = itemset_factory.create_lr1_itemset(new_item_set) return ret
def merge(item_list): #TODO: debug mode assert item_list are same_core ? item_list_sample = item_list[0].to_acc_merged_form().get_sorted_items() item_list_merged = [ item.to_acc_merged_form().get_sorted_items() for item in item_list ] new_item_set = set() for i in xrange(len(item_list_sample)): acc_tokens_set = set() for j in xrange(len(item_list_merged)): acc_tokens_set = acc_tokens_set.union( item_list_merged[j][i].acc_tokens) new_item_set.add(express_factory.create_lr1(item_list_sample[i].left_token, \ item_list_sample[i].get_right_tokens(), \ item_list_sample[i].dot_pos, \ acc_tokens_set)) ret = itemset_factory.create_lr1_itemset(new_item_set) return ret
def to_acc_merged_form(self): exp_list = list(self.item_set) new_exps = set() visited = set() for i in xrange(len(exp_list)): if exp_list[i] in visited: continue lst = [exp_list[i]] acc_tokens = set(exp_list[i].acc_tokens) visited.add(exp_list[i]) for j in xrange(i + 1, len(exp_list)): if express.is_same_core(exp_list[i], exp_list[j]): lst.append(exp_list[j]) acc_tokens = acc_tokens.union(exp_list[j].acc_tokens) visited.add(exp_list[j]) new_exps.add(express_factory.create_lr1(exp_list[i].left_token, \ exp_list[i].get_right_tokens(), \ exp_list[i].dot_pos, acc_tokens)) return itemset_factory.create_lr1_itemset(new_exps)
def closure(g, itms): visited = set() q = list() for itm in itms.item_set: visited.add(itm) q.append(itm) while len(q) > 0: tmp = q[0] q = q[1 : ] token = tmp.get_token_after_dot() look_ahead = tmp.get_token_lookahead_dot() exps = g.get_expresses_by_left(token) for exp in exps: for acc in tmp.acc_tokens: terminal_tokens = grammar.get_first_set_multi(g, [look_ahead, acc]) for term in terminal_tokens: new_exp = express_factory.create_lr1(token, exp.right_tokens_list[0], 0, set([term])) if new_exp not in visited: visited.add(new_exp) q.append(new_exp) return itemset_factory.create_lr1_itemset(visited)
def get_lr1_relation(g): exp = g.get_first_express() lr1_exp = express_factory.create_lr1(exp.left_token, exp.right_tokens_list[0], 0, \ set([fact.create_acc()])) c = closure(g, itemset_factory.create_lr1_itemset(set([lr1_exp]))) q = [c] visited = set([c]) goto_dict = dict() all_tokens = fact.get_all_tokens() while len(q) > 0: tmp = q[0] q = q[1: ] for token in all_tokens: reached = goto(g, tmp, token) if len(reached.item_set) > 0 and reached not in visited: visited.add(reached) q.append(reached) if len(reached.item_set) == 0: continue if tmp not in goto_dict: goto_dict[tmp] = dict() goto_dict[tmp][token] = reached return visited, goto_dict
def closure(g, itms): visited = set() q = list() for itm in itms.item_set: visited.add(itm) q.append(itm) while len(q) > 0: tmp = q[0] q = q[1:] token = tmp.get_token_after_dot() look_ahead = tmp.get_token_lookahead_dot() exps = g.get_expresses_by_left(token) for exp in exps: for acc in tmp.acc_tokens: terminal_tokens = grammar.get_first_set_multi( g, [look_ahead, acc]) for term in terminal_tokens: new_exp = express_factory.create_lr1( token, exp.right_tokens_list[0], 0, set([term])) if new_exp not in visited: visited.add(new_exp) q.append(new_exp) return itemset_factory.create_lr1_itemset(visited)
def get_lr1_relation(g): exp = g.get_first_express() lr1_exp = express_factory.create_lr1(exp.left_token, exp.right_tokens_list[0], 0, \ set([fact.create_acc()])) c = closure(g, itemset_factory.create_lr1_itemset(set([lr1_exp]))) q = [c] visited = set([c]) goto_dict = dict() all_tokens = fact.get_all_tokens() while len(q) > 0: tmp = q[0] q = q[1:] for token in all_tokens: reached = goto(g, tmp, token) if len(reached.item_set) > 0 and reached not in visited: visited.add(reached) q.append(reached) if len(reached.item_set) == 0: continue if tmp not in goto_dict: goto_dict[tmp] = dict() goto_dict[tmp][token] = reached return visited, goto_dict