/* union of values expression can have */
union
{
value *val; /* value if type = EX_VALUE */
sym_link *lnk; /* sym_link * if type= EX_LINK */
struct operand *oprnd; /* used only for side effecting function calls */
/* union of values expression can have */
union
{
value *val; /* value if type = EX_VALUE */
sym_link *lnk; /* sym_link * if type= EX_LINK */
struct operand *oprnd; /* used only for side effecting function calls */
#define IS_CALLOP(x) (IS_AST_OP(x) && x->opval.op == CALL)
#define IS_BITOR(x) (IS_AST_OP(x) && x->opval.op == '|')
#define IS_BITAND(x) (IS_AST_OP(x) && x->opval.op == '&' && \
#define IS_CALLOP(x) (IS_AST_OP(x) && x->opval.op == CALL)
#define IS_BITOR(x) (IS_AST_OP(x) && x->opval.op == '|')
#define IS_BITAND(x) (IS_AST_OP(x) && x->opval.op == '&' && \
#define IS_FOR_STMT(x) (IS_AST_OP(x) && x->opval.op == FOR)
#define IS_LEFT_OP(x) (IS_AST_OP(x) && x->opval.op == LEFT_OP)
#define IS_RIGHT_OP(x) (IS_AST_OP(x) && x->opval.op == RIGHT_OP)
#define IS_FOR_STMT(x) (IS_AST_OP(x) && x->opval.op == FOR)
#define IS_LEFT_OP(x) (IS_AST_OP(x) && x->opval.op == LEFT_OP)
#define IS_RIGHT_OP(x) (IS_AST_OP(x) && x->opval.op == RIGHT_OP)
#define IS_AST_LINK(x) (x->type == EX_LINK)
#define IS_AST_NOT_OPER(x) (x && IS_AST_OP(x) && x->opval.op == '!')
#define IS_ARRAY_OP(x) (IS_AST_OP(x) && x->opval.op == '[')
#define IS_AST_LINK(x) (x->type == EX_LINK)
#define IS_AST_NOT_OPER(x) (x && IS_AST_OP(x) && x->opval.op == '!')
#define IS_ARRAY_OP(x) (IS_AST_OP(x) && x->opval.op == '[')
#define IS_TERNARY_OP(x) (IS_AST_OP(x) && x->opval.op == '?')
#define IS_COLON_OP(x) (IS_AST_OP(x) && x->opval.op == ':')
#define IS_ADDRESS_OF_OP(x) (IS_AST_OP(x) && \
x->opval.op == '&' && \
x->right == NULL )
#define IS_AST_LIT_VALUE(x) (IS_AST_VALUE(x) && \
#define IS_TERNARY_OP(x) (IS_AST_OP(x) && x->opval.op == '?')
#define IS_COLON_OP(x) (IS_AST_OP(x) && x->opval.op == ':')
#define IS_ADDRESS_OF_OP(x) (IS_AST_OP(x) && \
x->opval.op == '&' && \
x->right == NULL )
#define IS_AST_LIT_VALUE(x) (IS_AST_VALUE(x) && \
#define IS_AST_SYM_VALUE(x) (IS_AST_VALUE(x) && x->opval.val->sym)
#define AST_LIT_VALUE(x) (floatFromVal(x->opval.val))
#define AST_SYMBOL(x) (x->opval.val->sym)
#define IS_AST_SYM_VALUE(x) (IS_AST_VALUE(x) && x->opval.val->sym)
#define AST_LIT_VALUE(x) (floatFromVal(x->opval.val))
#define AST_SYMBOL(x) (x->opval.val->sym)
ast *newAst_VALUE (value * val);
ast *newAst_OP (unsigned op);
ast *newAst_LINK (sym_link * val);
ast *newAst_VALUE (value * val);
ast *newAst_OP (unsigned op);
ast *newAst_LINK (sym_link * val);
void initAst ();
ast *newNode (long, ast *, ast *);
ast *copyAst (ast *);
ast *removeIncDecOps (ast *);
void initAst ();
ast *newNode (long, ast *, ast *);
ast *copyAst (ast *);
ast *removeIncDecOps (ast *);
value *sizeofOp (sym_link *);
value *evalStmnt (ast *);
ast *createFunction (symbol *, ast *);
ast *createBlock (symbol *, ast *);
ast *createLabel (symbol *, ast *);
ast *createCase (ast *, ast *, ast *);
value *sizeofOp (sym_link *);
value *evalStmnt (ast *);
ast *createFunction (symbol *, ast *);
ast *createBlock (symbol *, ast *);
ast *createLabel (symbol *, ast *);
ast *createCase (ast *, ast *, ast *);
ast *createWhile (symbol *, symbol *, symbol *, ast *, ast *);
ast *createIf (ast *, ast *, ast *);
ast *createDo (symbol *, symbol *, symbol *, ast *, ast *);
ast *createWhile (symbol *, symbol *, symbol *, ast *, ast *);
ast *createIf (ast *, ast *, ast *);
ast *createDo (symbol *, symbol *, symbol *, ast *, ast *);
ast *initAggregates (symbol *, initList *, ast *);
bool hasSEFcalls (ast *);
void addSymToBlock (symbol *, ast *);
ast *initAggregates (symbol *, initList *, ast *);
bool hasSEFcalls (ast *);
void addSymToBlock (symbol *, ast *);