106 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
/* $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
 | 
						|
 | 
						|
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;
 | 
						|
};
 | 
						|
 | 
						|
struct string	{
 | 
						|
	char *sg_value;		/* row of bytes repr. the constant */
 | 
						|
	int sg_len;		/* length of the row */
 | 
						|
	label sg_datlab;	/* global data-label			*/
 | 
						|
};
 | 
						|
 | 
						|
#ifndef NOFLOAT
 | 
						|
struct floating	{
 | 
						|
	char *fl_value;		/* pointer to string repr. the fp const. */
 | 
						|
	label fl_datlab;	/* global data_label	*/
 | 
						|
};
 | 
						|
#endif NOFLOAT
 | 
						|
 | 
						|
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
 | 
						|
#define	Float	2		/* it is a floating point constant	*/
 | 
						|
#endif NOFLOAT
 | 
						|
#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
 | 
						|
		struct floating ex_float;
 | 
						|
#endif NOFLOAT
 | 
						|
		struct oper ex_oper;
 | 
						|
	} ex_object;
 | 
						|
};
 | 
						|
 | 
						|
/* some abbreviated selections	*/
 | 
						|
#define VL_CLASS	ex_object.ex_value.vl_class
 | 
						|
#define	VL_VALUE	ex_object.ex_value.vl_value
 | 
						|
#define	VL_IDF		ex_object.ex_value.vl_data.vl_idf
 | 
						|
#define	VL_LBL		ex_object.ex_value.vl_data.vl_lbl
 | 
						|
#define	SG_VALUE	ex_object.ex_string.sg_value
 | 
						|
#define SG_LEN		ex_object.ex_string.sg_len
 | 
						|
#define	SG_DATLAB	ex_object.ex_string.sg_datlab
 | 
						|
#ifndef NOFLOAT
 | 
						|
#define	FL_VALUE	ex_object.ex_float.fl_value
 | 
						|
#define	FL_DATLAB	ex_object.ex_float.fl_datlab
 | 
						|
#endif NOFLOAT
 | 
						|
#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 */
 | 
						|
 | 
						|
#define	NILEXPR		((struct expr *)0)
 | 
						|
 | 
						|
extern struct expr *intexpr(), *new_oper();
 | 
						|
 | 
						|
/* ALLOCDEF "expr" 50 */
 | 
						|
 | 
						|
#define	ISCOMMA(e) ((e)->ex_class == Oper && (e)->OP_OPER == INITCOMMA)
 |