ack/lang/cem/cemcom/expr.str

112 lines
3.2 KiB
Plaintext
Raw Normal View History

1987-03-25 23:14:43 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1986-03-10 13:07:55 +00:00
/* $Header$ */
/* EXPRESSION DESCRIPTOR */
/* What we want to define is the struct expr, but since it contains
a union of various goodies, we define them first; so be patient.
*/
#include "nofloat.h"
/* classes of value */
#define Const 1
#define Name 2
#define Label 3
1986-03-10 13:07:55 +00:00
struct value {
int vl_class; /* Const, Name or Label */
arith vl_value; /* constant value or offset */
union {
struct idf *vl_idf; /* external name */
label vl_lbl; /* compiler-generated label */
} vl_data;
1986-03-10 13:07:55 +00:00
};
struct string {
char *sg_value; /* row of bytes repr. the constant */
int sg_len; /* length of the row */
1986-03-10 13:07:55 +00:00
label sg_datlab; /* global data-label */
};
#ifndef NOFLOAT
1986-03-10 13:07:55 +00:00
struct floating {
char *fl_value; /* pointer to string repr. the fp const. */
label fl_datlab; /* global data_label */
};
#endif NOFLOAT
1986-03-10 13:07:55 +00:00
struct oper {
struct type *op_type; /* resulting type of the operation */
struct expr *op_left;
int op_oper; /* the symbol of the operator */
struct expr *op_right;
};
/* The following constants indicate the class of the expression: */
#define Value 0 /* it is a value known at load time */
#define String 1 /* it is a string constant */
#ifndef NOFLOAT
1986-03-10 13:07:55 +00:00
#define Float 2 /* it is a floating point constant */
#endif NOFLOAT
1986-03-10 13:07:55 +00:00
#define Oper 3 /* it is a run-time expression */
#define Type 4 /* only its type is relevant */
struct expr {
struct expr *next;
char *ex_file; /* the file it (probably) comes from */
unsigned int ex_line; /* the line it (probably) comes from */
struct type *ex_type;
char ex_lvalue;
char ex_flags;
int ex_class;
int ex_depth;
union {
struct value ex_value;
struct string ex_string;
#ifndef NOFLOAT
1986-03-10 13:07:55 +00:00
struct floating ex_float;
#endif NOFLOAT
1986-03-10 13:07:55 +00:00
struct oper ex_oper;
} ex_object;
};
/* some abbreviated selections */
1988-08-19 13:55:22 +00:00
#define EX_VALUE ex_object.ex_value
#define VL_CLASS EX_VALUE.vl_class
#define VL_VALUE EX_VALUE.vl_value
#define VL_IDF EX_VALUE.vl_data.vl_idf
#define VL_LBL EX_VALUE.vl_data.vl_lbl
1986-03-10 13:07:55 +00:00
#define SG_VALUE ex_object.ex_string.sg_value
#define SG_LEN ex_object.ex_string.sg_len
1986-03-10 13:07:55 +00:00
#define SG_DATLAB ex_object.ex_string.sg_datlab
#ifndef NOFLOAT
1986-03-10 13:07:55 +00:00
#define FL_VALUE ex_object.ex_float.fl_value
#define FL_DATLAB ex_object.ex_float.fl_datlab
#endif NOFLOAT
1986-03-10 13:07:55 +00:00
#define OP_TYPE ex_object.ex_oper.op_type
#define OP_LEFT ex_object.ex_oper.op_left
#define OP_OPER ex_object.ex_oper.op_oper
#define OP_RIGHT ex_object.ex_oper.op_right
/* some bits for the ex_flag field, to keep track of various
interesting properties of an expression.
*/
#define EX_SIZEOF 0001 /* contains sizeof operator */
#define EX_CAST 0002 /* contains cast */
#define EX_LOGICAL 0004 /* contains logical operator */
#define EX_COMMA 0010 /* contains expression comma */
#define EX_PARENS 0020 /* the top level is parenthesized */
#define EX_SIDEEFFECTS 0040 /* expression has side effects */
#define EX_ERROR 0200 /* the expression is wrong */
1986-03-10 13:07:55 +00:00
#define NILEXPR ((struct expr *)0)
extern struct expr *intexpr(), *new_oper();
1987-03-25 23:14:43 +00:00
/* ALLOCDEF "expr" 20 */
1986-03-10 13:07:55 +00:00
#define ISCOMMA(e) ((e)->ex_class == Oper && (e)->OP_OPER == INITCOMMA)