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__