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;