Mercurial > hg > dmlib
changeset 704:3d9e7c5c4046
Fix bitshift << >> operator precedence reordering.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 16 Apr 2013 22:01:16 +0300 |
parents | fae0900fc9e9 |
children | 39c03b7dd853 |
files | dmeval.c |
diffstat | 1 files changed, 24 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/dmeval.c Tue Apr 16 21:42:28 2013 +0300 +++ b/dmeval.c Tue Apr 16 22:01:16 2013 +0300 @@ -919,32 +919,44 @@ DMEvalNode *tmp, *sub; int res; - while (node != NULL) + for (; node != NULL; node = node->next) switch (node->op) { case OP_LSHIFT: case OP_RSHIFT: - // Bitshift operator precedence is .. different - if (dm_eval_push_node(result, node) == NULL) - return -32; - + if (node->ok) + { + if (dm_eval_push_node(result, node) == NULL) + return -32; + break; + } + + // Pop previous node, f.e. 5*3 -> 5 + if ((tmp = dm_eval_pop_node(result)) == NULL) + return -24; + + // Add subexpression node if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL) return -3; - if (node->next == NULL) - return -14; + // Add popped node into subexpression + dm_eval_push_node(&(sub->subexpr), tmp); + + // Add this operator into subexpression + DMEvalNode *foo = dm_eval_add_node(&(sub->subexpr), node->op); + foo->ok = TRUE; - if ((res = dm_eval_reorder_pass3(ev, node->next, &(sub->subexpr))) != 0) - return res; + // Next node + node = node->next; + if (node == NULL) + return -72; - node = NULL; + dm_eval_push_node(&(sub->subexpr), node); break; default: if (dm_eval_push_node(result, node) == NULL) return -32; - - node = node->next; break; }