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; }
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 }
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); }