Olaf Seibert 21e9410571 Add evaluation of %+unary expressions.
This is a first step towards expressions like <%1>+1 and even later R1+1.
2021-11-15 18:31:15 +01:00

83 lines
1.8 KiB
C

#ifndef EXTREE__H
#define EXTREE__H
#include "symbols.h"
typedef struct ex_tree {
enum ex_type {
EX_LIT = 1,
/* Expression is a literal value */
EX_SYM = 2,
/* Expression has a symbol reference
* (symbol from symbol table, so not freed) */
EX_UNDEFINED_SYM = 3,
/* Expression is undefined sym reference */
EX_TEMP_SYM = 4,
/* Expression is temp sym reference */
EX_COM = 5,
/* One's complement */
EX_NEG = 6,
/* Negate */
EX_REG = 7,
/* register value (%) */
EX_ERR = 8,
/* Expression with an error */
EX_ADD = 9,
/* Add */
EX_SUB = 10,
/* Subtract */
EX_MUL = 11,
/* Multiply */
EX_DIV = 12,
/* Divide */
EX_AND = 13,
/* bitwise and */
EX_OR = 14,
/* bitwise or */
EX_LSH = 15,
/* left shift */
} type;
char *cp; /* points to end of parsed expression */
union {
struct {
struct ex_tree *left,
*right; /* Left, right children */
} child;
unsigned lit; /* Literal value */
SYMBOL *symbol; /* Symbol reference */
} data;
} EX_TREE;
EX_TREE *new_ex_tree(
int type);
void free_tree(
EX_TREE *tp);
EX_TREE *new_ex_lit(
unsigned value);
EX_TREE *ex_err(
EX_TREE *tp,
char *cp);
EX_TREE *new_ex_bin(
int type,
EX_TREE *left,
EX_TREE *right);
EX_TREE *new_ex_una(
int type,
EX_TREE *left);
int num_subtrees(
EX_TREE *tp);
EX_TREE *evaluate(
EX_TREE *tp,
int flags);
#define EVALUATE_DEFINEDNESS 1
#endif