Mercurial > hg > dmlib
changeset 766:11fba703014f
Some more work. Still broken.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 09 May 2013 19:15:59 +0300 |
parents | c68258fd81a1 |
children | 339f6c95605c |
files | dmeval.c dmeval.h dmevalw.c |
diffstat | 3 files changed, 75 insertions(+), 74 deletions(-) [+] |
line wrap: on
line diff
--- a/dmeval.c Thu May 09 08:38:52 2013 +0300 +++ b/dmeval.c Thu May 09 19:15:59 2013 +0300 @@ -8,33 +8,33 @@ */ const DMEvalOper dmEvalOpers[OP_NOPERS] = { - { "-" , OT_UNARY }, - { "~" , OT_UNARY }, + { "-" , OT_UNARY , FALSE }, + { "~" , OT_UNARY , TRUE }, - { "+" , OT_LEFT }, - { "-" , OT_LEFT }, - { "*" , OT_LEFT }, - { "/" , OT_LEFT }, - { "%" , OT_LEFT }, + { "+" , OT_LEFT , TRUE }, + { "-" , OT_LEFT , TRUE }, + { "*" , OT_LEFT , TRUE }, + { "/" , OT_LEFT , TRUE }, + { "%" , OT_LEFT , TRUE }, - { "<<", OT_LEFT }, - { ">>", OT_LEFT }, + { "<<" , OT_LEFT , TRUE }, + { ">>" , OT_LEFT , TRUE }, - { "&" , OT_LEFT }, - { "|" , OT_LEFT }, - { "^" , OT_LEFT }, + { "&" , OT_LEFT , TRUE }, + { "|" , OT_LEFT , TRUE }, + { "^" , OT_LEFT , TRUE }, - { ">" , OT_LEFT }, - { "<" , OT_LEFT }, - { ">=", OT_LEFT }, - { "<=", OT_LEFT }, + { ">=" , OT_LEFT , TRUE }, + { "<=" , OT_LEFT , TRUE }, + { ">" , OT_LEFT , TRUE }, + { "<" , OT_LEFT , TRUE }, - { "FUNC" , OT_NONE }, - { "VAR" , OT_NONE }, - { "CONST" , OT_NONE }, + { "FUNC" , OT_NONE , FALSE }, + { "VAR" , OT_NONE , FALSE }, + { "CONST" , OT_NONE , FALSE }, - { "SUBEXPR", OT_NONE }, + { "SUBEXPR", OT_NONE , FALSE }, }; @@ -366,50 +366,6 @@ while (ev->mode != PARSE_ERROR && ev->mode != PARSE_END) switch (ev->mode) { - case PARSE_SUBEXPR_START: - tmp = c + 1; - - ev->expect = PARSE_NORMAL; - - if ((node = dmEvalAddNode(list, OP_SUBEXPR)) == NULL) - dmEvalSetMode(ev, PARSE_ERROR); - else - if (dmEvalTokenizeExpr(ev, &(node->subexpr), &tmp, depth + 1) != 0) - { - dmEvalError(ev, "Subexpression starting at '%s' contained errors.\n", c); - dmEvalSetMode(ev, PARSE_ERROR); - } - - if (ev->mode != PARSE_ERROR) - { - dmEvalSetMode(ev, PARSE_START); - ev->expect = PARSE_OPER | PARSE_SUBEXPR_END; - c = tmp; - } - break; - - case PARSE_ARGS: - tmp = c + 1; - - for (argIndex = 0; argIndex < func->symbol->nargs; argIndex++) - { - if (dmEvalTokenizeExpr(ev, &(func->args[argIndex]), &tmp, depth + 1) != 0) - { - dmEvalError(ev, "Function argument subexpression starting at '%s' contained errors.\n", c); - dmEvalSetMode(ev, PARSE_ERROR); - } - } - - func = NULL; - - if (ev->mode != PARSE_ERROR) - { - dmEvalSetMode(ev, PARSE_START); - ev->expect = PARSE_OPER | PARSE_END; - c = tmp; - } - break; - case PARSE_START: // Start if (*c == 0) @@ -458,6 +414,50 @@ first = TRUE; break; + case PARSE_SUBEXPR_START: + tmp = c + 1; + + ev->expect = PARSE_NORMAL; + + if ((node = dmEvalAddNode(list, OP_SUBEXPR)) == NULL) + dmEvalSetMode(ev, PARSE_ERROR); + else + if (dmEvalTokenizeExpr(ev, &(node->subexpr), &tmp, depth + 1) != 0) + { + dmEvalError(ev, "Subexpression starting at '%s' contained errors.\n", c); + dmEvalSetMode(ev, PARSE_ERROR); + } + + if (ev->mode != PARSE_ERROR) + { + dmEvalSetMode(ev, PARSE_START); + ev->expect = PARSE_OPER | PARSE_SUBEXPR_END; + c = tmp; + } + break; + + case PARSE_ARGS: + tmp = c + 1; + + for (argIndex = 0; argIndex < func->symbol->nargs; argIndex++) + { + if (dmEvalTokenizeExpr(ev, &(func->args[argIndex]), &tmp, depth + 1) != 0) + { + dmEvalError(ev, "Function argument subexpression starting at '%s' contained errors.\n", c); + dmEvalSetMode(ev, PARSE_ERROR); + } + } + + func = NULL; + + if (ev->mode != PARSE_ERROR) + { + dmEvalSetMode(ev, PARSE_START); + ev->expect = PARSE_OPER | PARSE_END; + c = tmp; + } + break; + case PARSE_CONST: if (first) {
--- a/dmeval.h Thu May 09 08:38:52 2013 +0300 +++ b/dmeval.h Thu May 09 19:15:59 2013 +0300 @@ -28,10 +28,10 @@ OP_BIT_OR, OP_BIT_XOR, + OP_GT_EQ, + OP_LT_EQ, OP_GT, OP_LT, - OP_GT_EQ, - OP_LT_EQ, // Special ops OP_FUNC, @@ -53,13 +53,14 @@ OT_LEFT, // Left-associative OT_RIGHT, // Right-associative OT_UNARY, -} DMEvalOperType; +} DMEvalOperAssoc; typedef struct { - char *name; - int type; + char *name; // Token + int assoc; // Associativity type (DMEvalOperAssoc) + BOOL tokenize; // Automatically tokenize? } DMEvalOper;
--- a/dmevalw.c Thu May 09 08:38:52 2013 +0300 +++ b/dmevalw.c Thu May 09 19:15:59 2013 +0300 @@ -9,21 +9,21 @@ switch (node->op) { case OP_FUNC: - fprintf(out, "%s(", node->id != NULL ? node->id->name : "?ERROR"); - for (i = 0; i < node->id->nargs; i++) + fprintf(out, "%s(", node->symbol != NULL ? node->symbol->name : "?ERROR"); + for (i = 0; i < node->symbol->nargs; i++) { dmDoEvalPrintOpTree(out, ev, node->args[i], level + 1); - if (i < node->id->nargs - 1) + if (i < node->symbol->nargs - 1) fprintf(out, ","); } fprintf(out, ")"); break; case OP_VAR: - fprintf(out, "%s", node->id != NULL ? node->id->name : "?ERROR"); + fprintf(out, "%s", node->symbol != NULL ? node->symbol->name : "?ERROR"); break; - case OP_CONST: + case OP_VALUE: fprintf(out, "%.1f", node->val); break;