コード例 #1
0
void run_scp_program(sc_memory_context *context, scp_operand *scp_program)
{
    scp_operand arc1, arc2, quest, params;
    MAKE_DEFAULT_ARC_ASSIGN(arc1);
    MAKE_DEFAULT_ARC_ASSIGN(arc2);
    MAKE_DEFAULT_NODE_ASSIGN(quest);
    scp_program->param_type = SCP_FIXED;
    genElStr5(context, &quest, &arc1, scp_program, &arc2, ordinal_rrels + 1);
    quest.param_type = SCP_FIXED;
    MAKE_DEFAULT_NODE_ASSIGN(params);
    genElStr5(context, &quest, &arc1, &params, &arc2, ordinal_rrels + 2);
    set_author(context, &quest, &abstract_scp_machine);
    genElStr3(context, &question_scp_interpretation_request, &arc1, &quest);
    genElStr3(context, &question_initiated, &arc1, &quest);
}
コード例 #2
0
scp_result resolve_operator_type(sc_memory_context *context, scp_operand *oper, scp_operand *type)
{
    scp_operand arc;
    MAKE_DEFAULT_ARC_ASSIGN(arc);
    MAKE_DEFAULT_NODE_ASSIGN((*type));

    oper->param_type = SCP_FIXED;
    scp_iterator3 *it = scp_iterator3_new(context, type, &arc, oper);
    while (SCP_RESULT_TRUE == scp_iterator3_next(context, it, type, &arc, oper))
    {
        //! TODO Remove temporary check
        if (SCP_RESULT_TRUE != ifVarAssign(context, type))
            continue;

        type->param_type = SCP_FIXED;
        if (SCP_RESULT_TRUE == searchElStr3(context, &scp_operator_atomic_type, &arc, type))
        {
            scp_iterator3_free(it);
            return SCP_RESULT_TRUE;
        }
        type->param_type = SCP_ASSIGN;
    }
    scp_iterator3_free(it);
    return SCP_RESULT_FALSE;
}
コード例 #3
0
void set_author(sc_memory_context *context, scp_operand *quest, scp_operand *author)
{
    scp_operand authors, arc1, arc3;
    MAKE_DEFAULT_ARC_ASSIGN(arc1);
    MAKE_COMMON_ARC_ASSIGN(arc3);
    MAKE_DEFAULT_NODE_ASSIGN(authors);
    genElStr5(context, &authors, &arc3, quest, &arc1, &nrel_authors);
    authors.param_type = SCP_FIXED;
    genElStr3(context, &authors, &arc1, author);
}
コード例 #4
0
scp_result resolve_ordinal_set_rrel(sc_memory_context *context, scp_operand *arc_param, scp_operand *result)
{
    scp_operand arc;
    scp_iterator3 *it;
    MAKE_DEFAULT_ARC_ASSIGN(arc);
    MAKE_DEFAULT_NODE_ASSIGN((*result));
    arc_param->param_type = SCP_FIXED;
    it = scp_iterator3_new(context, result, &arc, arc_param);
    while (SCP_RESULT_TRUE == scp_iterator3_next(context, it, result, &arc, arc_param))
    {
        result->param_type = SCP_FIXED;
        if (SCP_RESULT_TRUE == searchElStr3(context, &ordinal_set_rrel, &arc, result))
        {
            scp_iterator3_free(it);
            return SCP_RESULT_TRUE;
        }
        result->param_type = SCP_ASSIGN;
    }
    scp_iterator3_free(it);
    return SCP_RESULT_FALSE;
}
コード例 #5
0
sc_result preprocess_scp_procedure(const sc_event *event, sc_addr arg)
{
    scp_operand arc1, arc2, arc3, scp_procedure_node, node1, scp_procedure_params,
                scp_procedure_consts, scp_procedure_copying_consts, scp_procedure_vars, scp_procedure_operators, scp_procedure_operators_copying_pattern;
    MAKE_DEFAULT_OPERAND_FIXED(arc1);
    MAKE_DEFAULT_ARC_ASSIGN(arc2);

    arc1.addr = arg;
    arc1.element_type = scp_type_arc_pos_const_perm;

    MAKE_DEFAULT_NODE_ASSIGN(node1);
    MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_node);
    if (SCP_RESULT_TRUE != ifVarAssign(s_default_ctx, &arc1))
    {
        return SC_RESULT_ERROR;
    }
    if (SCP_RESULT_TRUE != ifType(s_default_ctx, &arc1))
    {
        return SC_RESULT_OK;
    }

    if (SCP_RESULT_TRUE != searchElStr3(s_default_ctx, &node1, &arc1, &scp_procedure_node))
    {
        return SCP_RESULT_ERROR;
    }
    scp_procedure_node.param_type = SCP_FIXED;
    if (SCP_RESULT_TRUE != ifVarAssign(s_default_ctx, &scp_procedure_node))
    {
        return SC_RESULT_ERROR;
    }
    arc1.erase = SCP_TRUE;
    eraseEl(s_default_ctx, &arc1);

    MAKE_DEFAULT_ARC_ASSIGN(arc1);
    MAKE_COMMON_ARC_ASSIGN(arc3);

    if (SCP_RESULT_TRUE == searchElStr3(s_default_ctx, &prepared_scp_program, &arc1, &scp_procedure_node))
    {
        return SC_RESULT_OK;
    }

    //Debug info
    printf("PREPROCESSING: ");
    MAKE_DEFAULT_OPERAND_ASSIGN(node1);
    searchElStr5(s_default_ctx, &scp_procedure_node, &arc3, &node1, &arc2, &nrel_system_identifier);
    printNl(s_default_ctx, &node1);

    MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_operators);
    searchElStr5(s_default_ctx, &scp_procedure_node, &arc1, &scp_procedure_operators, &arc2, &rrel_operators);
    scp_procedure_operators.param_type = SCP_FIXED;
    MAKE_DEFAULT_OPERAND_ASSIGN(scp_procedure_params);
    searchElStr5(s_default_ctx, &scp_procedure_node, &arc1, &scp_procedure_params, &arc2, &rrel_params);
    scp_procedure_params.param_type = SCP_FIXED;

    MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_consts);
    genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_consts, &arc2, &nrel_scp_program_const);
    scp_procedure_consts.param_type = SCP_FIXED;
    MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_copying_consts);
    genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_copying_consts, &arc2, &nrel_scp_program_copied_const);
    scp_procedure_copying_consts.param_type = SCP_FIXED;
    MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_vars);
    genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_vars, &arc2, &nrel_scp_program_var);
    scp_procedure_vars.param_type = SCP_FIXED;
    MAKE_DEFAULT_NODE_ASSIGN(scp_procedure_operators_copying_pattern);
    genElStr5(s_default_ctx, &scp_procedure_node, &arc3, &scp_procedure_operators_copying_pattern, &arc2, &nrel_template_of_scp_process_creation);
    scp_procedure_operators_copying_pattern.param_type = SCP_FIXED;
    if (SCP_RESULT_TRUE == gen_system_structures(s_default_ctx, &scp_procedure_operators, &scp_procedure_params, &scp_procedure_vars, &scp_procedure_consts, &scp_procedure_copying_consts, &scp_procedure_operators_copying_pattern))
    {
        genElStr3(s_default_ctx, &prepared_scp_program, &arc1, &scp_procedure_node);
        //printf("PREPROCESSING FINISHED\n");
        return SC_RESULT_OK;
    }
    else
    {
        return SC_RESULT_ERROR;
    }
}
コード例 #6
0
sc_result destroy_scp_process(const sc_event *event, sc_addr arg)
{
    scp_operand arc1, arc2, node1, curr_operator, node3, scp_process_node, operator_type, question_node, call_parameters;
    scp_iterator3 *it;
    GHashTable *params = nullptr;
    scp_result params_found;
    MAKE_DEFAULT_OPERAND_FIXED(arc1);
    MAKE_DEFAULT_NODE_ASSIGN(scp_process_node);
    arc1.addr = arg;
    arc1.element_type = scp_type_arc_pos_const_perm;
    if (SCP_RESULT_TRUE != ifType(s_default_ctx, &arc1))
    {
        return SC_RESULT_OK;
    }

    MAKE_DEFAULT_OPERAND_ASSIGN(node1);
    if (SCP_RESULT_TRUE != searchElStr3(s_default_ctx, &node1, &arc1, &scp_process_node))
    {
        return SC_RESULT_ERROR;
    }

    MAKE_DEFAULT_ARC_ASSIGN(arc1);
    scp_process_node.param_type = SCP_FIXED;

    MAKE_DEFAULT_ARC_ASSIGN(arc2);
    MAKE_DEFAULT_OPERAND_ASSIGN(curr_operator);
    MAKE_DEFAULT_OPERAND_ASSIGN(question_node);
    MAKE_DEFAULT_OPERAND_ASSIGN(call_parameters);
    MAKE_DEFAULT_OPERAND_ASSIGN(node3);
    node1.erase = SCP_TRUE;
    curr_operator.erase = SCP_TRUE;
    node3.erase = SCP_TRUE;

    MAKE_DEFAULT_OPERAND_ASSIGN(question_node);
    MAKE_COMMON_ARC_ASSIGN(arc1);
    params_found = searchElStr5(s_default_ctx, &question_node, &arc1, &scp_process_node, &arc2, &nrel_scp_process);
    question_node.param_type = SCP_FIXED;

    MAKE_DEFAULT_ARC_ASSIGN(arc1);
    if (params_found == SCP_RESULT_TRUE)
    {
        MAKE_DEFAULT_OPERAND_ASSIGN(call_parameters);
        params_found = searchElStr5(s_default_ctx, &question_node, &arc1, &call_parameters, &arc2, &ordinal_rrels[2]);
        call_parameters.param_type = SCP_FIXED;
        if (params_found == SCP_RESULT_TRUE)
        {
            params = g_hash_table_new(NULL, NULL);
            load_set_to_hash(s_default_ctx, &call_parameters, params);
        }
    }

    MAKE_DEFAULT_NODE_ASSIGN(operator_type);

    it = scp_iterator3_new(s_default_ctx, &scp_process_node, &arc1, &curr_operator);
    while (SCP_RESULT_TRUE == scp_iterator3_next(s_default_ctx, it, &scp_process_node, &arc1, &curr_operator))
    {
        curr_operator.param_type = SCP_FIXED;
        if (SCP_RESULT_TRUE != resolve_operator_type(s_default_ctx, &curr_operator, &operator_type))
        {
            curr_operator.param_type = SCP_ASSIGN;
            delete_vars_from_set(s_default_ctx, &curr_operator, params);
            eraseEl(s_default_ctx, &curr_operator);
            continue;
        }
        operator_type.param_type = SCP_FIXED;

        if (SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_call))
        {
            //printf("OPERATOR CALL\n");
            if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[2])))
            {
                node3.param_type = SCP_FIXED;
                delete_vars_from_set(s_default_ctx, &node3, params);
                eraseEl(s_default_ctx, &node3);
                node3.param_type = SCP_ASSIGN;
            }
            delete_vars_from_set(s_default_ctx, &curr_operator, params);
            eraseEl(s_default_ctx, &curr_operator);
            operator_type.param_type = SCP_ASSIGN;
            curr_operator.param_type = SCP_ASSIGN;
            continue;
        }

        if (SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_sys_gen) ||
            SCP_RESULT_TRUE == ifCoin(s_default_ctx, &operator_type, &op_sys_search))
        {
            if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[2])))
            {
                node3.param_type = SCP_FIXED;
                delete_vars_from_relation(s_default_ctx, &node3, params);
                eraseEl(s_default_ctx, &node3);
                node3.param_type = SCP_ASSIGN;
            }
            if (SCP_RESULT_TRUE == searchElStr5(s_default_ctx, &curr_operator, &arc1, &node3, &arc2, &(ordinal_rrels[3])))
            {
                node3.param_type = SCP_FIXED;
                delete_vars_from_relation(s_default_ctx, &node3, params);
                eraseEl(s_default_ctx, &node3);
                node3.param_type = SCP_ASSIGN;
            }
            delete_vars_from_set(s_default_ctx, &curr_operator, params);
            eraseEl(s_default_ctx, &curr_operator);
            operator_type.param_type = SCP_ASSIGN;
            curr_operator.param_type = SCP_ASSIGN;
            continue;
        }
        delete_vars_from_set(s_default_ctx, &curr_operator, params);
        eraseEl(s_default_ctx, &curr_operator);
        operator_type.param_type = SCP_ASSIGN;
        curr_operator.param_type = SCP_ASSIGN;
    }
    scp_iterator3_free(it);
    scp_process_node.erase = SCP_TRUE;
    eraseEl(s_default_ctx, &scp_process_node);

    if (SCP_RESULT_TRUE == params_found)
    {
        g_hash_table_destroy(params);
    }

    //printf("PROCESS DESTROYED SUCCESSFULLY\n");
    return SC_RESULT_OK;
}