49 */ |
49 */ |
50 class visitor_c; // forward declaration |
50 class visitor_c; // forward declaration |
51 |
51 |
52 |
52 |
53 class symbol_c; // forward declaration |
53 class symbol_c; // forward declaration |
54 //extern symbol_c *tree_root; |
|
55 |
54 |
56 |
55 |
57 |
56 |
58 /* The base class of all symbols */ |
57 /* The base class of all symbols */ |
59 class symbol_c { |
58 class symbol_c { |
60 |
59 |
61 public: |
60 public: |
62 /* |
61 /* |
63 * Line number for the purposes of error checking |
62 * Line number for the purposes of error checking |
64 */ |
63 */ |
65 long lineno; |
64 int first_line; |
|
65 int first_column; |
|
66 int last_line; |
|
67 int last_column; |
66 |
68 |
67 public: |
69 public: |
68 /* default constructor */ |
70 /* default constructor */ |
69 symbol_c(void); |
71 symbol_c(void); |
70 symbol_c(long lineno); |
72 symbol_c(int fl /* first_line */, |
|
73 int fc /* first_column */, |
|
74 int ll = 0 /* last_line */, |
|
75 int lc = 0 /* last_column */ |
|
76 ); |
71 |
77 |
72 /* default destructor */ |
78 /* default destructor */ |
73 /* must be virtual so compiler does not complain... */ |
79 /* must be virtual so compiler does not complain... */ |
74 virtual ~symbol_c(void) {return;}; |
80 virtual ~symbol_c(void) {return;}; |
75 |
81 |
81 public: |
87 public: |
82 /* the value of the symbol. */ |
88 /* the value of the symbol. */ |
83 const char *value; |
89 const char *value; |
84 |
90 |
85 public: |
91 public: |
86 token_c(const char *value); |
92 token_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); |
87 }; |
93 }; |
88 |
94 |
89 |
95 |
90 /* a list of symbols... */ |
96 /* a list of symbols... */ |
91 class list_c: public symbol_c { |
97 class list_c: public symbol_c { |
92 public: |
98 public: |
93 int n; |
99 int n; |
94 symbol_c **elements; |
100 symbol_c **elements; |
95 |
101 |
96 public: |
102 public: |
97 list_c(void); |
103 list_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); |
98 list_c(symbol_c *elem); |
104 list_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); |
99 /* insert a new element */ |
105 /* insert a new element */ |
100 virtual void add_element(symbol_c *elem); |
106 virtual void add_element(symbol_c *elem); |
101 }; |
107 }; |
102 |
108 |
103 |
109 |
104 |
110 |
105 |
111 |
106 #define SYM_LIST(class_name_c) \ |
112 #define SYM_LIST(class_name_c) \ |
107 class class_name_c: public list_c { \ |
113 class class_name_c: public list_c { \ |
108 public: \ |
114 public: \ |
109 virtual void *accept(visitor_c &visitor); \ |
115 class_name_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ |
110 }; |
116 class_name_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ |
111 |
117 virtual void *accept(visitor_c &visitor); \ |
112 |
118 }; |
113 #define SYM_TOKEN(class_name_c) \ |
119 |
114 class class_name_c: public token_c { \ |
120 |
115 public: \ |
121 #define SYM_TOKEN(class_name_c) \ |
116 class_name_c(const char *value); \ |
122 class class_name_c: public token_c { \ |
117 virtual void *accept(visitor_c &visitor); \ |
123 public: \ |
|
124 class_name_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ |
|
125 virtual void *accept(visitor_c &visitor); \ |
118 }; |
126 }; |
119 |
127 |
120 |
128 |
121 #define SYM_REF0(class_name_c) \ |
129 #define SYM_REF0(class_name_c) \ |
122 class class_name_c: public symbol_c { \ |
130 class class_name_c: public symbol_c { \ |
123 public: \ |
131 public: \ |
|
132 class_name_c(int fl = 0, int fc = 0, \ |
|
133 int ll = 0, int lc = 0); \ |
124 virtual void *accept(visitor_c &visitor); \ |
134 virtual void *accept(visitor_c &visitor); \ |
125 }; |
135 }; |
126 |
136 |
127 |
137 |
128 #define SYM_REF2(class_name_c, ref1, ref2) \ |
138 #define SYM_REF1(class_name_c, ref1) \ |
129 class class_name_c: public symbol_c { \ |
139 class class_name_c: public symbol_c { \ |
130 public: \ |
140 public: \ |
131 symbol_c *ref1; \ |
141 symbol_c *ref1; \ |
132 symbol_c *ref2; \ |
142 public: \ |
133 public: \ |
143 class_name_c(symbol_c *ref1, \ |
134 class_name_c(symbol_c *ref1, \ |
144 int fl = 0, int fc = 0, \ |
135 symbol_c *ref2 = NULL); \ |
145 int ll = 0, int lc = 0); \ |
136 virtual void *accept(visitor_c &visitor); \ |
146 virtual void *accept(visitor_c &visitor); \ |
|
147 }; |
|
148 |
|
149 |
|
150 #define SYM_REF2(class_name_c, ref1, ref2) \ |
|
151 class class_name_c: public symbol_c { \ |
|
152 public: \ |
|
153 symbol_c *ref1; \ |
|
154 symbol_c *ref2; \ |
|
155 public: \ |
|
156 class_name_c(symbol_c *ref1, \ |
|
157 symbol_c *ref2 = NULL, \ |
|
158 int fl = 0, int fc = 0, \ |
|
159 int ll = 0, int lc = 0); \ |
|
160 virtual void *accept(visitor_c &visitor); \ |
|
161 }; |
|
162 |
|
163 |
|
164 #define SYM_REF3(class_name_c, ref1, ref2, ref3) \ |
|
165 class class_name_c: public symbol_c { \ |
|
166 public: \ |
|
167 symbol_c *ref1; \ |
|
168 symbol_c *ref2; \ |
|
169 symbol_c *ref3; \ |
|
170 public: \ |
|
171 class_name_c(symbol_c *ref1, \ |
|
172 symbol_c *ref2, \ |
|
173 symbol_c *ref3, \ |
|
174 int fl = 0, int fc = 0, \ |
|
175 int ll = 0, int lc = 0); \ |
|
176 virtual void *accept(visitor_c &visitor); \ |
137 }; |
177 }; |
138 |
178 |
139 |
179 |
140 #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4) \ |
180 #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4) \ |
141 class class_name_c: public symbol_c { \ |
181 class class_name_c: public symbol_c { \ |
146 symbol_c *ref4; \ |
186 symbol_c *ref4; \ |
147 public: \ |
187 public: \ |
148 class_name_c(symbol_c *ref1, \ |
188 class_name_c(symbol_c *ref1, \ |
149 symbol_c *ref2, \ |
189 symbol_c *ref2, \ |
150 symbol_c *ref3, \ |
190 symbol_c *ref3, \ |
151 symbol_c *ref4 = NULL); \ |
191 symbol_c *ref4 = NULL, \ |
152 virtual void *accept(visitor_c &visitor); \ |
192 int fl = 0, int fc = 0, \ |
|
193 int ll = 0, int lc = 0); \ |
|
194 virtual void *accept(visitor_c &visitor); \ |
|
195 }; |
|
196 |
|
197 |
|
198 #define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5) \ |
|
199 class class_name_c: public symbol_c { \ |
|
200 public: \ |
|
201 symbol_c *ref1; \ |
|
202 symbol_c *ref2; \ |
|
203 symbol_c *ref3; \ |
|
204 symbol_c *ref4; \ |
|
205 symbol_c *ref5; \ |
|
206 public: \ |
|
207 class_name_c(symbol_c *ref1, \ |
|
208 symbol_c *ref2, \ |
|
209 symbol_c *ref3, \ |
|
210 symbol_c *ref4, \ |
|
211 symbol_c *ref5, \ |
|
212 int fl = 0, int fc = 0, \ |
|
213 int ll = 0, int lc = 0); \ |
|
214 virtual void *accept(visitor_c &visitor); \ |
153 }; |
215 }; |
154 |
216 |
155 |
217 |
156 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6) \ |
218 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6) \ |
157 class class_name_c: public symbol_c { \ |
219 class class_name_c: public symbol_c { \ |