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