comparison dmeval.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children 05eb24a608f0
comparison
equal deleted inserted replaced
-1:000000000000 0:32250b436bca
1 #ifndef DMEVAL_H
2 #define DMEVAL_H
3
4 #include "dmlib.h"
5
6
7 typedef double DMValue;
8 #define DMCONVTYPE (int)
9
10
11 enum
12 {
13 OP_NONE,
14
15 OP_ADD,
16 OP_SUB,
17 OP_MUL,
18 OP_DIV,
19 OP_MOD,
20
21 OP_LSHIFT,
22 OP_RSHIFT,
23
24 OP_AND,
25 OP_OR,
26 OP_XOR,
27
28 OP_FUNC,
29 OP_VAR,
30 OP_SUBEXPR,
31 OP_CONST,
32
33 OP_NOPERS
34 } DMOperType;
35
36 enum
37 {
38 ID_FUNC,
39 ID_VAR
40 } DMEvalIdType;
41
42
43 typedef struct
44 {
45 char *name;
46 int type;
47 DMValue (*func)(DMValue);
48 DMValue *var;
49 } DMEvalId;
50
51
52 typedef struct DMEvalNode
53 {
54 int op;
55 DMValue val;
56 DMEvalId *id;
57
58 struct DMEvalNode *subexpr, *next, *prev;
59 } DMEvalNode;
60
61
62 typedef struct
63 {
64 BOOL err;
65 char *errStr;
66
67 int nids;
68 DMEvalId *ids;
69
70 int mode, prev, expect;
71 } DMEvalContext;
72
73
74 DMEvalId *dm_eval_find_id(DMEvalContext *ev, const char *name);
75 DMEvalId *dm_eval_add_var(DMEvalContext *ev, const char *name, DMValue *var);
76 DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue));
77
78 DMEvalContext *dm_eval_new(void);
79 void dm_eval_close(DMEvalContext *ev);
80 void dm_eval_free(DMEvalNode *node);
81 void dm_eval_clear_err(DMEvalContext *ev);
82
83 int dm_eval_parse_expr(DMEvalContext *ev, char *expr, DMEvalNode **result);
84 int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result);
85 int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult);
86
87 void dm_print_optree(DMEvalContext *ev, DMEvalNode *node);
88
89
90 #endif // DMEVAL_H