Mercurial > hg-old > index.cgi
diff 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 |
line wrap: on
line diff
--- a/src/expr.h Thu Oct 23 03:39:29 2008 +0000 +++ b/src/expr.h Thu Jan 01 02:26:26 2009 +0000 @@ -25,19 +25,69 @@ #ifndef __expr_h_seen__ #define __expr_h_seen__ -#include "lwval.h" - #ifndef __expr_c_seen__ #define __expr_E__ extern #else #define __expr_E__ #endif -// parse an expression -__expr_E__ LWVAL *lwasm_parse_expr(char **ptr); +// term types +#define LWASM_TERM_NONE 0 +#define LWASM_TERM_OPER 1 // an operator +#define LWASM_TERM_INT 2 // 32 bit signed integer +#define LWASM_TERM_SYM 3 // symbol reference + +// operator types +#define LWASM_OPER_NONE 0 +#define LWASM_OPER_PLUS 1 // + +#define LWASM_OPER_MINUS 2 // - +#define LWASM_OPER_TIMES 3 // * +#define LWASM_OPER_DIVIDE 4 // / +#define LWASM_OPER_MOD 5 // % +#define LWASM_OPER_INTDIV 6 // \ +#define LWASM_OPER_BWAND 7 // bitwise AND +#define LWASM_OPER_BWOR 8 // bitwise OR +#define LWASM_OPER_BWXOR 9 // bitwise XOR +#define LWASM_OPER_AND 10 // boolean AND +#define LWASM_OPER_OR 11 // boolean OR +#define LWASM_OPER_NEG 12 // unary negation (2's complement) +#define LWASM_OPER_COM 13 // unary 1's complement + -// attempt to evaluate/simplify expression -__expr_E__ int lwasm_eval_expr(LWVAL *expr); +// term structure +typedef struct lwasm_expr_term_s +{ + int term_type; // type of term (see above) + char *symbol; // name of a symbol + int value; // value of the term (int) or operator number (OPER) +} lwasm_expr_term_t; + +// type for an expression evaluation stack +typedef struct lwasm_expr_stack_node_s lwasm_expr_stack_node_t; +struct lwasm_expr_stack_node_s +{ + lwasm_expr_term_t *term; + lwasm_expr_stack_node_t *prev; + lwasm_expr_stack_node_t *next; +}; + +typedef struct lwasm_expr_stack_s +{ + lwasm_expr_stack_node_t *head; + lwasm_expr_stack_node_t *tail; +} lwasm_expr_stack_t; + +__expr_E__ void lwasm_expr_term_free(lwasm_expr_term_t *t); +__expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_oper(int oper); +__expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_sym(char *sym); +__expr_E__ lwasm_expr_term_t *lwasm_expr_term_create_int(int val); +__expr_E__ lwasm_expr_term_t *lwasm_expr_term_dup(lwasm_expr_term_t *t); + +__expr_E__ void lwasm_expr_stack_free(lwasm_expr_stack_t *s); +__expr_E__ lwasm_expr_stack_t *lwasm_expr_stack_create(void); + +__expr_E__ void lwasm_expr_stack_push(lwasm_expr_stack_t *s, lwasm_expr_term_t *t); +__expr_E__ lwasm_expr_term_t *lwasm_expr_stack_pop(lwasm_expr_stack_t *s); #undef __expr_E__