Esempio n. 1
0
int main()
{
    struct Stack * s = Stack_create(true);

    Stack_push(s, Obj_bool_create(true));
    Stack_push(s, Obj_char_create('A'));
    Stack_push(s, Obj_int_create(42));
    Stack_push(s, Obj_double_create(1234.5678));
    printf("POP %f\n", *(double*)Stack_pop(s));
    printf("POP %d\n", *(int*)Stack_pop(s));
    printf("TOP %c\n", *(char*)Stack_top(s));
    printf("TOP %c\n", *(char*)Stack_top(s));

    Stack_clear(s);

    printf("EMPTY? %d\n", (int)Stack_isEmpty(s));

    Stack_push(s, Obj_bool_create(false));
    printf("EMPTY? %d\n", (int)Stack_isEmpty(s));
    Stack_push(s, Obj_char_create('B'));
    printf("POP %c\n", *(char*)Stack_pop(s));
    Stack_push(s, Obj_int_create(666));
    printf("POP %d\n", *(int*)Stack_pop(s));
    Stack_push(s, Obj_double_create(321.654));
    printf("TOP %f\n", *(double*)Stack_top(s));

    Stack_delete(s);
    s = NULL;

    return EXIT_SUCCESS;
}
Esempio n. 2
0
File: IoLexer.c Progetto: Akiyah/io
TEST_INLINE void IoLexer_popPosBack(IoLexer *self)
{
	intptr_t i = (intptr_t)Stack_pop(self->tokenStack);
	intptr_t topIndex = (intptr_t)Stack_top(self->tokenStack);

	if (i > -1)
	{
		List_setSize_(self->tokenStream, i + 1);

		if (i != topIndex) // ok to io_free token
		{
			IoToken *parent = IoLexer_currentToken(self);

			if (parent)
			{
				IoToken_nextToken_(parent, NULL);
			}
		}
	}

	self->current = Stack_pop(self->posStack);
#ifdef LEXER_DEBUG
	printf("back: "); IoLexer_print(self);
#endif
}
Esempio n. 3
0
File: IoLexer.c Progetto: Akiyah/io
char *IoLexer_lastPos(IoLexer *self)
{
	return Stack_top(self->posStack);
}
/*                  EVALUATE THE EXPRESSION:                         */
static void evaluate(Token_T* oTokens, int length) {
    Stack_T oStack1;
    Stack_T oStack2;
    int i;
    /* Create and use a Stack of tokens. */
    assert(oTokens != NULL);
    oStack1 = Stack_new();
    oStack2 = Stack_new();
    for (i = 0; i < length; i++) {
        if (Token_getType(oTokens[i]) == VALUE)
            Stack_push(oStack1, oTokens[i]);
        else if (Stack_isEmpty(oStack2))
            Stack_push(oStack2, oTokens[i]);
        else if (precedence(oTokens[i], Stack_top(oStack2)))
            Stack_push(oStack2, oTokens[i]);
        else { /*ERROR HANDLING?*/
            int result;
            Token_T value_1 = (Token_T)Stack_top(oStack1);
            Stack_pop(oStack1);
            Token_T operator = (Token_T)Stack_top(oStack2);
            Stack_pop(oStack2);
            Token_T value_2 = (Token_T)Stack_top(oStack1);
            Stack_pop(oStack1);
            switch (Token_getType(operator))
            {   /*LEFT TO RIGHT EVALUATION*/
            case MULT:
                result = Token_getValue(value_1) * Token_getValue(value_2);
                break;
            case DIV:
                result = Token_getValue(value_2) / Token_getValue(value_1);
                break;
            case PLUS:
                result = Token_getValue(value_1) + Token_getValue(value_2);
                break;
            case MINUS:
                result = Token_getValue(value_2) - Token_getValue(value_1);
                break;
            default:
                assert(0);
            }
            Stack_push(oStack1, Token_newToken(VALUE, result));
            Stack_push(oStack2, oTokens[i]);
        }
    }
    while (!Stack_isEmpty(oStack2)) { /*ERROR HANDLING? + MODULARITY MUCH????*/
        int result;
        Token_T value_1 = (Token_T)Stack_top(oStack1);
        Stack_pop(oStack1);
        Token_T operator = (Token_T)Stack_top(oStack2);
        Stack_pop(oStack2);
        Token_T value_2 = (Token_T)Stack_top(oStack1);
        Stack_pop(oStack1);
        switch (Token_getType(operator))
        {   /*LEFT TO RIGHT EVALUATION*/
        case MULT:
            result = Token_getValue(value_1) * Token_getValue(value_2);
            break;
        case DIV:
            result = Token_getValue(value_2) / Token_getValue(value_1);
            break;
        case PLUS:
            result = Token_getValue(value_1) + Token_getValue(value_2);
            break;
        case MINUS:
            result = Token_getValue(value_2) - Token_getValue(value_1);
            break;
        default:
            assert(1);
        }
        Stack_push(oStack1, Token_newToken(VALUE, result));
    }
    printf("%d\n", Token_getValue((Token_T)Stack_top(oStack1)));
    Stack_free(oStack1);
    Stack_free(oStack2);
}