Mercurial > hg > dmlib
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