diff dmeval.h @ 761:7be7c7c5deaa

Large cleanup, breaking everything. Yay.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 09 May 2013 06:21:36 +0300
parents faf43d8aa841
children 181d659bba39
line wrap: on
line diff
--- a/dmeval.h	Thu May 09 06:18:52 2013 +0300
+++ b/dmeval.h	Thu May 09 06:21:36 2013 +0300
@@ -2,6 +2,7 @@
 #define DMEVAL_H
 
 #include "dmlib.h"
+#include <stdio.h>
 
 
 typedef double DMValue;
@@ -11,8 +12,8 @@
 
 enum
 {
-    // No-op
-    OP_NONE,
+    OP_SUB_UNARY,
+    OP_BIT_COMPLEMENT,
 
     OP_ADD,
     OP_SUB,
@@ -20,9 +21,6 @@
     OP_DIV,
     OP_MOD,
 
-    OP_SUB_UNARY,
-    OP_BIT_COMPLEMENT,
-
     OP_BIT_LSHIFT,
     OP_BIT_RSHIFT,
 
@@ -38,20 +36,31 @@
     // Special ops
     OP_FUNC,
     OP_VAR,
+    OP_CONST,
     OP_SUBEXPR,
-    OP_CONST,
 
     // Total number of operators
-    OP_NOPERS
-} DMOper;
+    OP_NOPERS,
+
+    OP_INVALID
+} DMEvalOperId;
 
 
 enum
 {
+    OT_NONE,
+
     OT_LEFT,      // Left-associative
     OT_RIGHT,     // Right-associative
     OT_UNARY,
-} DMOperType;
+} DMEvalOperType;
+
+
+typedef struct
+{
+    char *name;
+    int type;
+} DMEvalOper;
 
 
 enum
@@ -59,7 +68,7 @@
     ID_FUNC,
     ID_VAR,
     ID_CVAR,
-} DMEvalIdType;
+} DMEvalSymbolType;
 
 
 typedef struct
@@ -69,7 +78,7 @@
     int nargs;
     DMValue (*func)(DMValue arg[DM_MAX_ARGS]);
     DMValue *var, cvalue;
-} DMEvalId;
+} DMEvalSymbol;
 
 
 typedef struct DMEvalNode
@@ -77,9 +86,10 @@
     BOOL ok;
     int op;
     DMValue val;
-    DMEvalId *id;
+    DMEvalSymbol *id;
 
     struct DMEvalNode *args[DM_MAX_ARGS];
+
     struct DMEvalNode *subexpr, *next, *prev;
 } DMEvalNode;
 
@@ -89,26 +99,35 @@
     BOOL err;
     char *errStr;
     
-    int nids;
-    DMEvalId *ids;
+    int nsymbols;
+    DMEvalSymbol *symbols;
 
     int mode, prev, expect;
 } DMEvalContext;
 
 
-DMEvalId *dm_eval_find_id(DMEvalContext *ev, const char *name);
-DMEvalId *dm_eval_add_var(DMEvalContext *ev, const char *name, DMValue *var);
-DMEvalId *dm_eval_add_const(DMEvalContext *ev, const char *name, DMValue value);
-DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *), int nargs);
+// Evaluation context management
+DMEvalContext * dmEvalContextNew(void);
+void            dmEvalContextClose(DMEvalContext *ev);
+void            dmEvalContextClear(DMEvalContext *ev);
+
 
-DMEvalContext *dm_eval_new(void);
-void dm_eval_close(DMEvalContext *ev);
-void dm_eval_free(DMEvalNode *node);
-void dm_eval_clear_err(DMEvalContext *ev);
-
-int dm_eval_parse_expr(DMEvalContext *ev, char *expr, DMEvalNode **result);
-int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result);
-int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult);
+// Symbol management
+DMEvalSymbol *  dmEvalContextFindSymbol(DMEvalContext *ev, const char *name);
+DMEvalSymbol *  dmEvalContextAddVar(DMEvalContext *ev, const char *name, DMValue *var);
+DMEvalSymbol *  dmEvalContextAddConst(DMEvalContext *ev, const char *name, DMValue value);
+DMEvalSymbol *  dmEvalContextAddFunc(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *), int nargs);
 
 
+// Evaluation trees, tokenization, parsing
+int   dmEvalParseExpr(DMEvalContext *ev, char *expr, DMEvalNode **plist);
+int   dmEvalTreeExecute(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult);
+void  dmEvalTreeFree(DMEvalNode *node);
+
+
+void dmEvalPrintOpTree(FILE *out, DMEvalContext *ev, DMEvalNode *node);
+
+
+extern const DMEvalOper dmEvalOpers[OP_NOPERS];
+
 #endif // DMEVAL_H