comparison src/expr.h @ 17:df0c4a46af8f

Started adding expression handling infrastructure
author lost
date Thu, 01 Jan 2009 02:26:26 +0000
parents 1f598d89b9b0
children 218aabbc3b1a
comparison
equal deleted inserted replaced
16:4f14eae64d38 17:df0c4a46af8f
23 */ 23 */
24 24
25 #ifndef __expr_h_seen__ 25 #ifndef __expr_h_seen__
26 #define __expr_h_seen__ 26 #define __expr_h_seen__
27 27
28 #include "lwval.h"
29
30 #ifndef __expr_c_seen__ 28 #ifndef __expr_c_seen__
31 #define __expr_E__ extern 29 #define __expr_E__ extern
32 #else 30 #else
33 #define __expr_E__ 31 #define __expr_E__
34 #endif 32 #endif
35 33
36 // parse an expression 34 // term types
37 __expr_E__ LWVAL *lwasm_parse_expr(char **ptr); 35 #define LWASM_TERM_NONE 0
36 #define LWASM_TERM_OPER 1 // an operator
37 #define LWASM_TERM_INT 2 // 32 bit signed integer
38 #define LWASM_TERM_SYM 3 // symbol reference
38 39
39 // attempt to evaluate/simplify expression 40 // operator types
40 __expr_E__ int lwasm_eval_expr(LWVAL *expr); 41 #define LWASM_OPER_NONE 0
42 #define LWASM_OPER_PLUS 1 // +
43 #define LWASM_OPER_MINUS 2 // -
44 #define LWASM_OPER_TIMES 3 // *
45 #define LWASM_OPER_DIVIDE 4 // /
46 #define LWASM_OPER_MOD 5 // %
47 #define LWASM_OPER_INTDIV 6 // \
48 #define LWASM_OPER_BWAND 7 // bitwise AND
49 #define LWASM_OPER_BWOR 8 // bitwise OR
50 #define LWASM_OPER_BWXOR 9 // bitwise XOR
51 #define LWASM_OPER_AND 10 // boolean AND
52 #define LWASM_OPER_OR 11 // boolean OR
53 #define LWASM_OPER_NEG 12 // unary negation (2's complement)
54 #define LWASM_OPER_COM 13 // unary 1's complement
55
56
57 // term structure
58 typedef struct lwasm_expr_term_s
59 {
60 int term_type; // type of term (see above)
61 char *symbol; // name of a symbol
62 int value; // value of the term (int) or operator number (OPER)
63 } lwasm_expr_term_t;
64
65 // type for an expression evaluation stack
66 typedef struct lwasm_expr_stack_node_s lwasm_expr_stack_node_t;
67 struct lwasm_expr_stack_node_s
68 {
69 lwasm_expr_term_t *term;
70 lwasm_expr_stack_node_t *prev;
71 lwasm_expr_stack_node_t *next;
72 };
73
74 typedef struct lwasm_expr_stack_s
75 {
76 lwasm_expr_stack_node_t *head;
77 lwasm_expr_stack_node_t *tail;
78 } lwasm_expr_stack_t;
79
80 __expr_E__ void lwasm_expr_term_free(lwasm_expr_term_t *t);
81 __expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_oper(int oper);
82 __expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_sym(char *sym);
83 __expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_int(int val);
84 __expr_E__ lwasm_expr_term_t *lwasm_expr_term_dup(lwasm_expr_term_t *t);
85
86 __expr_E__ void lwasm_expr_stack_free(lwasm_expr_stack_t *s);
87 __expr_E__ lwasm_expr_stack_t *lwasm_expr_stack_create(void);
88
89 __expr_E__ void lwasm_expr_stack_push(lwasm_expr_stack_t *s, lwasm_expr_term_t *t);
90 __expr_E__ lwasm_expr_term_t *lwasm_expr_stack_pop(lwasm_expr_stack_t *s);
41 91
42 #undef __expr_E__ 92 #undef __expr_E__
43 93
44 #endif // __expr_h_seen__ 94 #endif // __expr_h_seen__