]> git.sur5r.net Git - cc65/blob - src/common/exprdefs.h
165c60fda6a419ba9d22c59ad9a1630b9593e2e3
[cc65] / src / common / exprdefs.h
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                exprdefs.h                                 */
4 /*                                                                           */
5 /*                        Expression tree definitions                        */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 1998-2007 Ullrich von Bassewitz                                       */
10 /*               Roemerstrasse 52                                            */
11 /*               D-70794 Filderstadt                                         */
12 /* EMail:        uz@cc65.org                                                 */
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_SECTION            (EXPR_LEAFNODE | 0x03)
60 #define EXPR_SEGMENT            (EXPR_LEAFNODE | 0x04)  /* Linker only */
61 #define EXPR_MEMAREA            (EXPR_LEAFNODE | 0x05)  /* Linker only */
62 #define EXPR_ULABEL             (EXPR_LEAFNODE | 0x06)  /* Assembler only */
63
64 /* Binary operations, left and right hand sides are valid */
65 #define EXPR_PLUS               (EXPR_BINARYNODE | 0x01)
66 #define EXPR_MINUS              (EXPR_BINARYNODE | 0x02)
67 #define EXPR_MUL                (EXPR_BINARYNODE | 0x03)
68 #define EXPR_DIV                (EXPR_BINARYNODE | 0x04)
69 #define EXPR_MOD                (EXPR_BINARYNODE | 0x05)
70 #define EXPR_OR                 (EXPR_BINARYNODE | 0x06)
71 #define EXPR_XOR                (EXPR_BINARYNODE | 0x07)
72 #define EXPR_AND                (EXPR_BINARYNODE | 0x08)
73 #define EXPR_SHL                (EXPR_BINARYNODE | 0x09)
74 #define EXPR_SHR                (EXPR_BINARYNODE | 0x0A)
75 #define EXPR_EQ                 (EXPR_BINARYNODE | 0x0B)
76 #define EXPR_NE                 (EXPR_BINARYNODE | 0x0C)
77 #define EXPR_LT                 (EXPR_BINARYNODE | 0x0D)
78 #define EXPR_GT                 (EXPR_BINARYNODE | 0x0E)
79 #define EXPR_LE                 (EXPR_BINARYNODE | 0x0F)
80 #define EXPR_GE                 (EXPR_BINARYNODE | 0x10)
81 #define EXPR_BOOLAND            (EXPR_BINARYNODE | 0x11)
82 #define EXPR_BOOLOR             (EXPR_BINARYNODE | 0x12)
83 #define EXPR_BOOLXOR            (EXPR_BINARYNODE | 0x13)
84
85 /* Unary operations, right hand side is empty */
86 #define EXPR_UNARY_MINUS        (EXPR_UNARYNODE | 0x01)
87 #define EXPR_NOT                (EXPR_UNARYNODE | 0x02)
88 #define EXPR_SWAP               (EXPR_UNARYNODE | 0x03)
89 #define EXPR_BOOLNOT            (EXPR_UNARYNODE | 0x04)
90
91 #define EXPR_BYTE0              (EXPR_UNARYNODE | 0x08)
92 #define EXPR_BYTE1              (EXPR_UNARYNODE | 0x09)
93 #define EXPR_BYTE2              (EXPR_UNARYNODE | 0x0A)
94 #define EXPR_BYTE3              (EXPR_UNARYNODE | 0x0B)
95 #define EXPR_WORD0              (EXPR_UNARYNODE | 0x0C)
96 #define EXPR_WORD1              (EXPR_UNARYNODE | 0x0D)
97
98
99
100 /* The expression node itself */
101 typedef struct ExprNode ExprNode;
102 struct ExprNode {
103     unsigned char           Op;         /* Operand/Type */
104     ExprNode*               Left;       /* Left leaf */
105     ExprNode*               Right;      /* Right leaf */
106     struct ObjData*         Obj;        /* Object file reference (linker) */
107     union {
108         long                IVal;       /* If this is a int value */
109         struct SymEntry*    Sym;        /* If this is a symbol */
110         unsigned            SegNum;     /* If this is a segment */
111         unsigned            ImpNum;     /* If this is an import */
112         struct Memory*      Mem;        /* If this is a memory area */
113         struct Segment*     Seg;        /* If this is a segment */
114         struct Section*     Sec;        /* If section and Obj is NULL */
115     } V;
116 };
117
118
119
120 /* Macros to determine the expression type */
121 #define EXPR_IS_LEAF(Op)        (((Op) & EXPR_TYPEMASK) == EXPR_LEAFNODE)
122 #define EXPR_IS_UNARY(Op)       (((Op) & EXPR_TYPEMASK) == EXPR_UNARYNODE)
123 #define EXPR_IS_BINARY(OP)      (((Op) & EXPR_TYPEMASK) == EXPR_BINARYNODE)
124
125
126
127 /*****************************************************************************/
128 /*                                   Code                                    */
129 /*****************************************************************************/
130
131
132
133 void DumpExpr (const ExprNode* Expr, const ExprNode* (*ResolveSym) (const struct SymEntry*));
134 /* Dump an expression tree to stdout */
135
136
137
138 /* End of exprdefs.h */
139
140 #endif
141
142
143