Example #1
0
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)
Example #2
0
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)
Example #3
0
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
Example #4
0
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
Example #5
0
	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)
Example #6
0
 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)
Example #7
0
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)
Example #8
0
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
Example #9
0
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)
Example #10
0
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