]> git.sur5r.net Git - cc65/blob - src/common/exprdefs.h
This commit was generated by cvs2svn to compensate for changes in r2,
[cc65] / src / common / exprdefs.h
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                exprdefs.h                                 */
4 /*                                                                           */
5 /*                        Expression tree definitions                        */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 1998     Ullrich von Bassewitz                                        */
10 /*              Wacholderweg 14                                              */
11 /*              D-70597 Stuttgart                                            */
12 /* EMail:       uz@musoftware.de                                             */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #ifndef EXPRDEFS_H
37 #define EXPRDEFS_H
38
39
40
41 /*****************************************************************************/
42 /*                                   Data                                    */
43 /*****************************************************************************/
44
45
46
47 /* Expression type masks */
48 #define EXPR_TYPEMASK           0xC0
49 #define EXPR_BINARYNODE         0x00
50 #define EXPR_UNARYNODE          0x40
51 #define EXPR_LEAFNODE           0x80
52
53 /* Type of expression nodes */
54 #define EXPR_NULL               0x00    /* Internal error or NULL node */
55
56 /* Leaf node codes */
57 #define EXPR_LITERAL            (EXPR_LEAFNODE | 0x01)
58 #define EXPR_SYMBOL             (EXPR_LEAFNODE | 0x02)
59 #define EXPR_SEGMENT            (EXPR_LEAFNODE | 0x03)
60 #define EXPR_MEMAREA            (EXPR_LEAFNODE | 0x04)  /* Linker only */
61 #define EXPR_ULABEL             (EXPR_LEAFNODE | 0x05)  /* Assembler only */
62
63 /* Binary operations, left and right hand sides are valid */
64 #define EXPR_PLUS               (EXPR_BINARYNODE | 0x01)
65 #define EXPR_MINUS              (EXPR_BINARYNODE | 0x02)
66 #define EXPR_MUL                (EXPR_BINARYNODE | 0x03)
67 #define EXPR_DIV                (EXPR_BINARYNODE | 0x04)
68 #define EXPR_MOD                (EXPR_BINARYNODE | 0x05)
69 #define EXPR_OR                 (EXPR_BINARYNODE | 0x06)
70 #define EXPR_XOR                (EXPR_BINARYNODE | 0x07)
71 #define EXPR_AND                (EXPR_BINARYNODE | 0x08)
72 #define EXPR_SHL                (EXPR_BINARYNODE | 0x09)
73 #define EXPR_SHR                (EXPR_BINARYNODE | 0x0A)
74 #define EXPR_EQ                 (EXPR_BINARYNODE | 0x0B)
75 #define EXPR_NE                 (EXPR_BINARYNODE | 0x0C)
76 #define EXPR_LT                 (EXPR_BINARYNODE | 0x0D)
77 #define EXPR_GT                 (EXPR_BINARYNODE | 0x0E)
78 #define EXPR_LE                 (EXPR_BINARYNODE | 0x0F)
79 #define EXPR_GE                 (EXPR_BINARYNODE | 0x10)
80 #define EXPR_BAND               (EXPR_BINARYNODE | 0x11)
81 #define EXPR_BOR                (EXPR_BINARYNODE | 0x12)
82 #define EXPR_BXOR               (EXPR_BINARYNODE | 0x13)
83
84 /* Unary operations, right hand side is empty */
85 #define EXPR_UNARY_MINUS        (EXPR_UNARYNODE | 0x01)
86 #define EXPR_NOT                (EXPR_UNARYNODE | 0x02)
87 #define EXPR_LOBYTE             (EXPR_UNARYNODE | 0x03)
88 #define EXPR_HIBYTE             (EXPR_UNARYNODE | 0x04)
89 #define EXPR_SWAP               (EXPR_UNARYNODE | 0x05)
90 #define EXPR_BNOT               (EXPR_UNARYNODE | 0x06)
91
92
93
94 /* The expression node itself */
95 typedef struct ExprNode_ ExprNode;
96 struct ExprNode_ {
97     unsigned char           Op;         /* Operand/Type */
98     ExprNode*               Left;       /* Left leaf */
99     ExprNode*               Right;      /* Right leaf */
100     struct ObjData_*        Obj;        /* Object file reference (linker) */
101     union {
102         long                Val;        /* If this is a value */
103         struct SymEntry_*   Sym;        /* If this is a symbol */
104         unsigned            SegNum;     /* If this is a segment */
105         unsigned            ImpNum;     /* If this is an import */
106         struct Memory_*     MemArea;    /* If this is a memory area */
107     } V;
108 };
109
110
111
112 /* Macros to determine the expression type */
113 #define EXPR_IS_LEAF(Op)        (((Op) & EXPR_TYPEMASK) == EXPR_LEAFNODE)
114 #define EXPR_IS_UNARY(Op)       (((Op) & EXPR_TYPEMASK) == EXPR_UNARYNODE)
115 #define EXPR_IS_BINARY(OP)      (((Op) & EXPR_TYPEMASK) == EXPR_BINARYNODE)
116
117
118
119 /* End of exprdefs.h */
120
121 #endif
122
123
124