예제 #1
0
파일: symbol-pool.c 프로젝트: rcoacci/nuvm
NValue
n_symbol_pool_get_symbol(const char* contents, NError* error) {
    n_error_clear(error);
    if (contents != NULL) {
        int32_t index = _find_symbol(contents);
        if (index < 0) {
            const char* dup_contents = duplicate_string(contents);
            if (dup_contents == NULL) {
                n_error_set(error, N_E_BAD_ALLOCATION);
                n_error_set_msg(error, "contents");
                return N_UNDEFINED;
            }
            index = n_symbol_array_append(&_pool, dup_contents);
            if (index < 0) {
                n_error_set(error, N_E_BAD_ALLOCATION);
                n_error_set_msg(error, "inner-pool");
                return N_UNDEFINED;
            }
        }
        return n_wrap_symbol(index);
    }
    else {
        n_error_set(error, N_E_INVALID_ARGUMENT);
        n_error_set_msg(error, "contents");
        return N_UNDEFINED;
    }
}
예제 #2
0
var_info Symbol_Table::insert_symbol(std::string s, oper_type o){
	//find variable 
	int level;
	var_info result = _find_symbol(s, &level);

	if (result.type != EMP && level == 0){
		return{ USD, result.name };
	}
	else{
		std::stringstream var_name;
		var_name << "var" << var_count++;
		scopes.back().insert(std::pair<std::string, var_info>(s, { o, var_name.str() }));
		return{ o, var_name.str() };
	}

}
예제 #3
0
var_info Symbol_Table::find_symbol(std::string s){
	int level;
	return _find_symbol(s, &level);

}