Exemplo n.º 1
0
struct math_node *treeify(struct math_node **stack, int *size)
{
        if (!stack || !size) { return 0; }
        struct math_node *parent;
        (*size)--;
        parent = *(stack + *size);
        if (*(parent->op) == '-' &&
                *(parent->op + 1) >= 48 &&
                *(parent->op + 1) <= 57) {
                return parent;
        }
        if (isOperator(parent->op)) {
                parent->right = treeify(stack, size);
                parent->left = treeify(stack, size);
        }
        return parent;
}
Exemplo n.º 2
0
int main()
{
        int i;
        char buffer[101];
        struct math_node **stack;
        int stack_size;
        struct math_node *tree;

        // get string
        printf("Enter the postfix expression to be evaluated: ");
        fgets(buffer, 100, stdin);

        // stackify
        stack = stackify(buffer, &stack_size);
        // test stackify:
        // printf("stack_size:%i\n", stack_size);
        // for (i=0; i<stack_size; i++) {
        //         printf("%s\n", (*(stack + i))->op);
        // }

        // treeify
        tree = treeify(stack, &stack_size);

        // evaluate the tree
        int value;
        value = evaluate_tree(tree);
        printf("The tree evaluates to: %d\n", value);

        // print various forms
        char* exp;
        int length;
        length = 0;
        exp = getexp_prefix(tree, &length);
        printf("Prefix Notation:   %s\n", exp);
        free(exp);
        exp = 0;
        length = 0;
        exp = getexp_infix(tree, &length);
        printf("Infix Notation:    %s\n", exp);
        free(exp);
        exp = 0;
        length = 0;
        exp = getexp_postfix(tree, &length);
        printf("Postfix Notation:  %s\n", exp);
        free(exp);
        exp = 0;

        // cleanup
        tree_destructor(tree);
        free(stack);
        stack = 0;
        return 0;
}
Exemplo n.º 3
0
QueryOperator *
rewriteProvenanceComputation (ProvenanceComputation *op)
{
    // for a sequence of updates of a transaction merge the sequence into a single
    // query before rewrite.
    if (op->inputType == PROV_INPUT_UPDATE_SEQUENCE
            || op->inputType == PROV_INPUT_TRANSACTION)
    {
        START_TIMER("rewrite - merge update reenactments");
        mergeUpdateSequence(op);
        STOP_TIMER("rewrite - merge update reenactments");

        // need to restrict to updated rows?
        if (op->inputType == PROV_INPUT_TRANSACTION
                && HAS_STRING_PROP(op,PROP_PC_ONLY_UPDATED))
        {
            START_TIMER("rewrite - restrict to updated rows");
            restrictToUpdatedRows(op);
            STOP_TIMER("rewrite - restrict to updated rows");
        }
    }

    if (isRewriteOptionActivated(OPTION_TREEIFY_OPERATOR_MODEL))
    {
        treeify((QueryOperator *) op);
        INFO_LOG("treeifyed operator model:\n\n%s", operatorToOverviewString((Node *) op));
        DEBUG_LOG("treeifyed operator model:\n\n%s", beatify(nodeToString(op)));
        ASSERT(isTree((QueryOperator *) op));
    }

    switch(op->provType)
    {
        case PROV_PI_CS:
            if (isRewriteOptionActivated(OPTION_PI_CS_USE_COMPOSABLE))
                return rewritePI_CSComposable(op);
            else
                return rewritePI_CS(op);
        case PROV_TRANSFORMATION:
            return rewriteTransformationProvenance((QueryOperator *) op);
    }
    return NULL;
}