1 %{
2 /*---------------------------------------------------------------------------*
3 Project: TwlSDK - tools - makelcf
4 File: tlcf.y
5
6 Copyright 2003-2009 Nintendo. All rights reserved.
7
8 These coded instructions, statements, and computer programs contain
9 proprietary information of Nintendo of America Inc. and/or Nintendo
10 Company Ltd., and are protected by Federal copyright law. They may
11 not be disclosed to third parties or copied or duplicated in any form,
12 in whole or in part, without the prior written consent of Nintendo.
13
14 $Date:: 2009-11-11#$
15 $Rev: 11140 $
16 $Author: kitase_hirotake $
17 *---------------------------------------------------------------------------*/
18 #include <stdio.h>
19 #include <string.h>
20 #include "makelcf.h"
21 #include "defval.h"
22
23 // IF-ELSE-ENDIF
24 static tCondStack cond_stack[COND_STACK_MAX];
25 static int cond_stack_level = 0;
26 static BOOL cond_valid = TRUE;
27 static tCondBlock cond_block = COND_BLOCK_NOCOND;
28
GetCompResult(const char * id,const char * comp,const char * value,BOOL * pvalid)29 static BOOL GetCompResult(const char* id, const char* comp, const char* value, BOOL* pvalid)
30 {
31 int result;
32 BOOL valid;
33 const char* defval;
34
35 defval = SearchDefValCleaned(id);
36 result = strcmp(defval, value);
37 if ( strcmp( comp, ".EQ." ) == 0 || strcmp( comp, "==" ) == 0 ) valid = ( result == 0 );
38 else if ( strcmp( comp, ".NE." ) == 0 || strcmp( comp, "!=" ) == 0 ) valid = ( result != 0 );
39 else if ( strcmp( comp, ".GT." ) == 0 ) valid = ( result > 0 );
40 else if ( strcmp( comp, ".GE." ) == 0 ) valid = ( result >= 0 );
41 else if ( strcmp( comp, ".LT." ) == 0 ) valid = ( result < 0 );
42 else if ( strcmp( comp, ".LE." ) == 0 ) valid = ( result <= 0 );
43 else
44 {
45 tlcf_yyerror( "Illegal IF-condition" );
46 return FALSE;
47 }
48 debug_printf("id(%s)=[%s] comp=[%s] value=[%s] valid=%d\n", id, defval, comp, value, valid);
49
50 *pvalid = valid;
51 return TRUE;
52 }
53
CondIf(const char * id,const char * comp,const char * value)54 static BOOL CondIf(const char* id, const char* comp, const char* value)
55 {
56 if (cond_stack_level >= COND_STACK_MAX)
57 {
58 tlcf_yyerror( "Too deep if-else-endif block" );
59 return FALSE;
60 }
61 cond_stack[cond_stack_level].block = cond_block;
62 cond_stack[cond_stack_level].valid = cond_valid;
63 cond_stack_level ++;
64 cond_block = COND_BLOCK_IF;
65
66 // Update validation only if previous level validation is TRUE
67 if (cond_stack[cond_stack_level-1].valid)
68 {
69 if (!GetCompResult(id, comp, value, &cond_valid))
70 {
71 tlcf_yyerror( "Unresolved IF condition" );
72 return FALSE;
73 }
74 }
75 return TRUE;
76 }
77
CondElse(void)78 static BOOL CondElse(void)
79 {
80 if (cond_block != COND_BLOCK_IF || cond_stack_level <= 0)
81 {
82 tlcf_yyerror( "IF-ELSE-ENDIF unmatched" );
83 return FALSE;
84 }
85 cond_block = COND_BLOCK_ELSE;
86
87 // Update validation only if previous level validation is TRUE
88 if (cond_stack[cond_stack_level-1].valid)
89 {
90 cond_valid = cond_valid ? FALSE : TRUE; // Flip validation
91 }
92 return TRUE;
93 }
94
CondEndIf(void)95 static BOOL CondEndIf(void)
96 {
97 if ((cond_block != COND_BLOCK_IF && cond_block != COND_BLOCK_ELSE) || cond_stack_level <= 0)
98 {
99 tlcf_yyerror( "IF-ELSE-ENDIF unmatched" );
100 return FALSE;
101 }
102 cond_stack_level --;
103 cond_block = cond_stack[cond_stack_level].block;
104 cond_valid = cond_stack[cond_stack_level].valid;
105 return TRUE;
106 }
107
108
109 // TOKEN HANDLEING
110 tTokenBuffer tokenBuffer[TOKEN_LEN];
111 int tokenBufferEnd = 0;
112 static tLoopStack loop_stack[LOOP_STACK_MAX];
113 static int loop_stack_level = 0;
114
StoreToken(int id,const char * str)115 static BOOL StoreToken( int id, const char *str )
116 {
117 // Validation check for IF-ELSE-ENDIF
118 if ( !cond_valid ) return TRUE;
119
120 if ( tokenBufferEnd >= TOKEN_LEN )
121 {
122 tlcf_yyerror( "Out of token buffer" );
123 return FALSE;
124 }
125 tokenBuffer[tokenBufferEnd].id = id;
126 tokenBuffer[tokenBufferEnd].string = str;
127 tokenBufferEnd ++;
128 return TRUE;
129 }
130
PushLoopStack(int id,const char * sectionName)131 static BOOL PushLoopStack( int id, const char* sectionName )
132 {
133 // Validation check for IF-ELSE-ENDIF
134 if ( !cond_valid ) return TRUE;
135
136 if ( loop_stack_level >= LOOP_STACK_MAX )
137 {
138 tlcf_yyerror( "Out of stack level" );
139 return FALSE;
140 }
141 loop_stack[loop_stack_level].id = id;
142 loop_stack[loop_stack_level].start = tokenBufferEnd;
143 loop_stack_level ++;
144 return StoreToken( id, sectionName );
145 }
146
PopLoopStack(int id)147 static BOOL PopLoopStack( int id )
148 {
149 int start;
150
151 // Validation check for IF-ELSE-ENDIF
152 if ( !cond_valid ) return TRUE;
153
154 loop_stack_level --;
155 if ( loop_stack_level < 0 || id != loop_stack[loop_stack_level].id )
156 {
157 tlcf_yyerror( "Unmatched foreach-end" );
158 return FALSE;
159 }
160 start = loop_stack[loop_stack_level].start;
161 tokenBuffer[start].loop_end = tokenBufferEnd-1;
162
163 // Don't store 'END' token to TokenBuffer
164 return TRUE;
165 }
166
GetLoopStackLevel(void)167 BOOL GetLoopStackLevel( void )
168 {
169 return loop_stack_level;
170 }
171
172 %}
173
174 %union
175 {
176 char *string;
177 };
178
179 %token <string> tSTRING
180
181 %token <string> tFOREACH_STATIC_OBJECTS
182 %token <string> tFOREACH_STATIC_LIBRARIES
183 %token <string> tFOREACH_STATIC_SEARCHSYMBOLS
184 %token <string> tFOREACH_STATIC_FORCES
185 %token tEND_STATIC_OBJECTS
186 %token tEND_STATIC_LIBRARIES
187 %token tEND_STATIC_SEARCHSYMBOLS
188 %token tEND_STATIC_FORCES
189 %token tSTATIC_NAME
190 %token tSTATIC_ADDRESS
191 %token tSTATIC_STACKSIZE
192 %token tSTATIC_IRQSTACKSIZE
193 %token <string> tSTATIC_CRT0_OBJECT
194 %token <string> tSTATIC_OBJECT
195 %token <string> tSTATIC_LIBRARY
196 %token <string> tSTATIC_SEARCHSYMBOL
197 %token <string> tSTATIC_FORCE
198
199 %token <string> tFOREACH_AUTOLOADS
200 %token <string> tFOREACH_AUTOLOAD_OBJECTS
201 %token <string> tFOREACH_AUTOLOAD_LIBRARIES
202 %token <string> tFOREACH_AUTOLOAD_SEARCHSYMBOLS
203 %token <string> tFOREACH_AUTOLOAD_FORCES
204 %token tEND_AUTOLOADS
205 %token tEND_AUTOLOAD_OBJECTS
206 %token tEND_AUTOLOAD_LIBRARIES
207 %token tEND_AUTOLOAD_SEARCHSYMBOLS
208 %token tEND_AUTOLOAD_FORCES
209 %token tNUMBER_AUTOLOADS
210 %token tAUTOLOAD_ID
211 %token tAUTOLOAD_NAME
212 %token tAUTOLOAD_ADDRESS
213 %token <string> tAUTOLOAD_OBJECT
214 %token <string> tAUTOLOAD_LIBRARY
215 %token <string> tAUTOLOAD_SEARCHSYMBOL
216 %token <string> tAUTOLOAD_FORCE
217
218 %token <string> tFOREACH_OVERLAYS
219 %token <string> tFOREACH_OVERLAY_OBJECTS
220 %token <string> tFOREACH_OVERLAY_LIBRARIES
221 %token <string> tFOREACH_OVERLAY_SEARCHSYMBOLS
222 %token <string> tFOREACH_OVERLAY_FORCES
223 %token tEND_OVERLAYS
224 %token tEND_OVERLAY_OBJECTS
225 %token tEND_OVERLAY_LIBRARIES
226 %token tEND_OVERLAY_SEARCHSYMBOLS
227 %token tEND_OVERLAY_FORCES
228 %token tNUMBER_OVERLAYS
229 %token tOVERLAY_ID
230 %token tOVERLAY_NAME
231 %token tOVERLAY_GROUP
232 %token tOVERLAY_ADDRESS
233 %token tOVERLAY_COMPRESS
234 %token <string> tOVERLAY_OBJECT
235 %token <string> tOVERLAY_LIBRARY
236 %token <string> tOVERLAY_SEARCHSYMBOL
237 %token <string> tOVERLAY_FORCE
238
239 %token <string> tFOREACH_LTDAUTOLOADS
240 %token <string> tFOREACH_LTDAUTOLOAD_OBJECTS
241 %token <string> tFOREACH_LTDAUTOLOAD_LIBRARIES
242 %token <string> tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS
243 %token <string> tFOREACH_LTDAUTOLOAD_FORCES
244 %token tEND_LTDAUTOLOADS
245 %token tEND_LTDAUTOLOAD_OBJECTS
246 %token tEND_LTDAUTOLOAD_LIBRARIES
247 %token tEND_LTDAUTOLOAD_SEARCHSYMBOLS
248 %token tEND_LTDAUTOLOAD_FORCES
249 %token tNUMBER_LTDAUTOLOADS
250 %token tLTDAUTOLOAD_ID
251 %token tLTDAUTOLOAD_NAME
252 %token tLTDAUTOLOAD_ADDRESS
253 %token <string> tLTDAUTOLOAD_OBJECT
254 %token <string> tLTDAUTOLOAD_LIBRARY
255 %token <string> tLTDAUTOLOAD_SEARCHSYMBOL
256 %token <string> tLTDAUTOLOAD_FORCE
257
258 %token <string> tFOREACH_LTDOVERLAYS
259 %token <string> tFOREACH_LTDOVERLAY_OBJECTS
260 %token <string> tFOREACH_LTDOVERLAY_LIBRARIES
261 %token <string> tFOREACH_LTDOVERLAY_SEARCHSYMBOLS
262 %token <string> tFOREACH_LTDOVERLAY_FORCES
263 %token tEND_LTDOVERLAYS
264 %token tEND_LTDOVERLAY_OBJECTS
265 %token tEND_LTDOVERLAY_LIBRARIES
266 %token tEND_LTDOVERLAY_SEARCHSYMBOLS
267 %token tEND_LTDOVERLAY_FORCES
268 %token tNUMBER_LTDOVERLAYS
269 %token tLTDOVERLAY_ID
270 %token tLTDOVERLAY_NAME
271 %token tLTDOVERLAY_GROUP
272 %token tLTDOVERLAY_ADDRESS
273 %token tLTDOVERLAY_COMPRESS
274 %token <string> tLTDOVERLAY_OBJECT
275 %token <string> tLTDOVERLAY_LIBRARY
276 %token <string> tLTDOVERLAY_SEARCHSYMBOL
277 %token <string> tLTDOVERLAY_FORCE
278
279 %token tPROPERTY_OVERLAYDEFS
280 %token tPROPERTY_OVERLAYTABLE
281 %token tPROPERTY_LTDOVERLAYDEFS
282 %token tPROPERTY_LTDOVERLAYTABLE
283 %token tPROPERTY_SUFFIX
284 %token tPROPERTY_FLXSUFFIX
285 %token tPROPERTY_LTDSUFFIX
286
287 %token tIF_OPEN
288 %token tIF_CLOSE
289 %token <string> tIF_ID
290 %token <string> tIF_COMP
291 %token <string> tIF_VALUE
292 %token tIF_ELSE
293 %token tIF_ENDIF
294 %%
295
296 /*=========================================================================*
297 ConfigFile
298 *=========================================================================*/
299
300 tlcfFile : tokens
301 ;
302
303 tokens : /*NULL*/
304 | tokens token
305 ;
306
307 token : tSTRING { if (!StoreToken( tSTRING, $1 )) YYABORT; }
308 | tSTATIC_CRT0_OBJECT { if (!StoreToken( tSTATIC_CRT0_OBJECT, $1 )) YYABORT; }
309 | tSTATIC_NAME { if (!StoreToken( tSTATIC_NAME, NULL )) YYABORT; }
310 | tSTATIC_ADDRESS { if (!StoreToken( tSTATIC_ADDRESS, NULL )) YYABORT; }
311 | tSTATIC_OBJECT { if (!StoreToken( tSTATIC_OBJECT, $1 )) YYABORT; }
312 | tSTATIC_LIBRARY { if (!StoreToken( tSTATIC_LIBRARY, $1 )) YYABORT; }
313 | tSTATIC_SEARCHSYMBOL { if (!StoreToken( tSTATIC_SEARCHSYMBOL, $1 )) YYABORT; }
314 | tSTATIC_FORCE { if (!StoreToken( tSTATIC_FORCE, $1 )) YYABORT; }
315 | tSTATIC_STACKSIZE { if (!StoreToken( tSTATIC_STACKSIZE, NULL )) YYABORT; }
316 | tSTATIC_IRQSTACKSIZE { if (!StoreToken( tSTATIC_IRQSTACKSIZE, NULL )) YYABORT; }
317 | tFOREACH_STATIC_OBJECTS { if (!PushLoopStack( tFOREACH_STATIC_OBJECTS, $1 )) YYABORT; }
318 | tEND_STATIC_OBJECTS { if (!PopLoopStack ( tFOREACH_STATIC_OBJECTS )) YYABORT; }
319 | tFOREACH_STATIC_LIBRARIES { if (!PushLoopStack( tFOREACH_STATIC_LIBRARIES, $1 )) YYABORT; }
320 | tEND_STATIC_LIBRARIES { if (!PopLoopStack ( tFOREACH_STATIC_LIBRARIES )) YYABORT; }
321 | tFOREACH_STATIC_SEARCHSYMBOLS { if (!PushLoopStack( tFOREACH_STATIC_SEARCHSYMBOLS, $1 )) YYABORT; }
322 | tEND_STATIC_SEARCHSYMBOLS { if (!PopLoopStack ( tFOREACH_STATIC_SEARCHSYMBOLS )) YYABORT; }
323 | tFOREACH_STATIC_FORCES { if (!PushLoopStack( tFOREACH_STATIC_FORCES, $1 )) YYABORT; }
324 | tEND_STATIC_FORCES { if (!PopLoopStack ( tFOREACH_STATIC_FORCES )) YYABORT; }
325 | tAUTOLOAD_ID { if (!StoreToken( tAUTOLOAD_ID, NULL )) YYABORT; }
326 | tAUTOLOAD_NAME { if (!StoreToken( tAUTOLOAD_NAME, NULL )) YYABORT; }
327 | tAUTOLOAD_ADDRESS { if (!StoreToken( tAUTOLOAD_ADDRESS, NULL )) YYABORT; }
328 | tAUTOLOAD_OBJECT { if (!StoreToken( tAUTOLOAD_OBJECT, $1 )) YYABORT; }
329 | tAUTOLOAD_LIBRARY { if (!StoreToken( tAUTOLOAD_LIBRARY, $1 )) YYABORT; }
330 | tAUTOLOAD_SEARCHSYMBOL { if (!StoreToken( tAUTOLOAD_SEARCHSYMBOL, $1 )) YYABORT; }
331 | tAUTOLOAD_FORCE { if (!StoreToken( tAUTOLOAD_FORCE, $1 )) YYABORT; }
332 | tNUMBER_AUTOLOADS { if (!StoreToken( tNUMBER_AUTOLOADS, NULL )) YYABORT; }
333 | tFOREACH_AUTOLOADS { if (!PushLoopStack( tFOREACH_AUTOLOADS, $1 )) YYABORT; }
334 | tEND_AUTOLOADS { if (!PopLoopStack ( tFOREACH_AUTOLOADS )) YYABORT; }
335 | tFOREACH_AUTOLOAD_OBJECTS { if (!PushLoopStack( tFOREACH_AUTOLOAD_OBJECTS, $1 )) YYABORT; }
336 | tEND_AUTOLOAD_OBJECTS { if (!PopLoopStack ( tFOREACH_AUTOLOAD_OBJECTS )) YYABORT; }
337 | tFOREACH_AUTOLOAD_LIBRARIES { if (!PushLoopStack( tFOREACH_AUTOLOAD_LIBRARIES, $1 )) YYABORT; }
338 | tEND_AUTOLOAD_LIBRARIES { if (!PopLoopStack ( tFOREACH_AUTOLOAD_LIBRARIES )) YYABORT; }
339 | tFOREACH_AUTOLOAD_SEARCHSYMBOLS{ if (!PushLoopStack( tFOREACH_AUTOLOAD_SEARCHSYMBOLS, $1 )) YYABORT; }
340 | tEND_AUTOLOAD_SEARCHSYMBOLS { if (!PopLoopStack ( tFOREACH_AUTOLOAD_SEARCHSYMBOLS )) YYABORT; }
341 | tFOREACH_AUTOLOAD_FORCES { if (!PushLoopStack( tFOREACH_AUTOLOAD_FORCES, $1 )) YYABORT; }
342 | tEND_AUTOLOAD_FORCES { if (!PopLoopStack ( tFOREACH_AUTOLOAD_FORCES )) YYABORT; }
343 | tOVERLAY_ID { if (!StoreToken( tOVERLAY_ID, NULL )) YYABORT; }
344 | tOVERLAY_NAME { if (!StoreToken( tOVERLAY_NAME, NULL )) YYABORT; }
345 | tOVERLAY_GROUP { if (!StoreToken( tOVERLAY_GROUP, NULL )) YYABORT; }
346 | tOVERLAY_ADDRESS { if (!StoreToken( tOVERLAY_ADDRESS, NULL )) YYABORT; }
347 | tOVERLAY_COMPRESS { if (!StoreToken( tOVERLAY_COMPRESS, NULL )) YYABORT; }
348 | tOVERLAY_OBJECT { if (!StoreToken( tOVERLAY_OBJECT, $1 )) YYABORT; }
349 | tOVERLAY_LIBRARY { if (!StoreToken( tOVERLAY_LIBRARY, $1 )) YYABORT; }
350 | tOVERLAY_SEARCHSYMBOL { if (!StoreToken( tOVERLAY_SEARCHSYMBOL, $1 )) YYABORT; }
351 | tOVERLAY_FORCE { if (!StoreToken( tOVERLAY_FORCE, $1 )) YYABORT; }
352 | tNUMBER_OVERLAYS { if (!StoreToken( tNUMBER_OVERLAYS, NULL )) YYABORT; }
353 | tFOREACH_OVERLAYS { if (!PushLoopStack( tFOREACH_OVERLAYS, $1 )) YYABORT; }
354 | tEND_OVERLAYS { if (!PopLoopStack ( tFOREACH_OVERLAYS )) YYABORT; }
355 | tFOREACH_OVERLAY_OBJECTS { if (!PushLoopStack( tFOREACH_OVERLAY_OBJECTS, $1 )) YYABORT; }
356 | tEND_OVERLAY_OBJECTS { if (!PopLoopStack ( tFOREACH_OVERLAY_OBJECTS )) YYABORT; }
357 | tFOREACH_OVERLAY_LIBRARIES { if (!PushLoopStack( tFOREACH_OVERLAY_LIBRARIES, $1 )) YYABORT; }
358 | tEND_OVERLAY_LIBRARIES { if (!PopLoopStack ( tFOREACH_OVERLAY_LIBRARIES )) YYABORT; }
359 | tFOREACH_OVERLAY_SEARCHSYMBOLS{ if (!PushLoopStack( tFOREACH_OVERLAY_SEARCHSYMBOLS, $1 )) YYABORT; }
360 | tEND_OVERLAY_SEARCHSYMBOLS { if (!PopLoopStack ( tFOREACH_OVERLAY_SEARCHSYMBOLS )) YYABORT; }
361 | tFOREACH_OVERLAY_FORCES { if (!PushLoopStack( tFOREACH_OVERLAY_FORCES, $1 )) YYABORT; }
362 | tEND_OVERLAY_FORCES { if (!PopLoopStack ( tFOREACH_OVERLAY_FORCES )) YYABORT; }
363 | tLTDAUTOLOAD_ID { if (!StoreToken( tLTDAUTOLOAD_ID, NULL )) YYABORT; }
364 | tLTDAUTOLOAD_NAME { if (!StoreToken( tLTDAUTOLOAD_NAME, NULL )) YYABORT; }
365 | tLTDAUTOLOAD_ADDRESS { if (!StoreToken( tLTDAUTOLOAD_ADDRESS, NULL )) YYABORT; }
366 | tLTDAUTOLOAD_OBJECT { if (!StoreToken( tLTDAUTOLOAD_OBJECT, $1 )) YYABORT; }
367 | tLTDAUTOLOAD_LIBRARY { if (!StoreToken( tLTDAUTOLOAD_LIBRARY, $1 )) YYABORT; }
368 | tLTDAUTOLOAD_SEARCHSYMBOL { if (!StoreToken( tLTDAUTOLOAD_SEARCHSYMBOL, $1 )) YYABORT; }
369 | tLTDAUTOLOAD_FORCE { if (!StoreToken( tLTDAUTOLOAD_FORCE, $1 )) YYABORT; }
370 | tNUMBER_LTDAUTOLOADS { if (!StoreToken( tNUMBER_LTDAUTOLOADS, NULL )) YYABORT; }
371 | tFOREACH_LTDAUTOLOADS { if (!PushLoopStack( tFOREACH_LTDAUTOLOADS, $1 )) YYABORT; }
372 | tEND_LTDAUTOLOADS { if (!PopLoopStack ( tFOREACH_LTDAUTOLOADS )) YYABORT; }
373 | tFOREACH_LTDAUTOLOAD_OBJECTS { if (!PushLoopStack( tFOREACH_LTDAUTOLOAD_OBJECTS, $1 )) YYABORT; }
374 | tEND_LTDAUTOLOAD_OBJECTS { if (!PopLoopStack ( tFOREACH_LTDAUTOLOAD_OBJECTS )) YYABORT; }
375 | tFOREACH_LTDAUTOLOAD_LIBRARIES { if (!PushLoopStack( tFOREACH_LTDAUTOLOAD_LIBRARIES, $1 )) YYABORT; }
376 | tEND_LTDAUTOLOAD_LIBRARIES { if (!PopLoopStack ( tFOREACH_LTDAUTOLOAD_LIBRARIES )) YYABORT; }
377 | tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS{ if (!PushLoopStack( tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS, $1 )) YYABORT; }
378 | tEND_LTDAUTOLOAD_SEARCHSYMBOLS { if (!PopLoopStack ( tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS )) YYABORT; }
379 | tFOREACH_LTDAUTOLOAD_FORCES { if (!PushLoopStack( tFOREACH_LTDAUTOLOAD_FORCES, $1 )) YYABORT; }
380 | tEND_LTDAUTOLOAD_FORCES { if (!PopLoopStack ( tFOREACH_LTDAUTOLOAD_FORCES )) YYABORT; }
381 | tLTDOVERLAY_ID { if (!StoreToken( tLTDOVERLAY_ID, NULL )) YYABORT; }
382 | tLTDOVERLAY_NAME { if (!StoreToken( tLTDOVERLAY_NAME, NULL )) YYABORT; }
383 | tLTDOVERLAY_GROUP { if (!StoreToken( tLTDOVERLAY_GROUP, NULL )) YYABORT; }
384 | tLTDOVERLAY_ADDRESS { if (!StoreToken( tLTDOVERLAY_ADDRESS, NULL )) YYABORT; }
385 | tLTDOVERLAY_COMPRESS { if (!StoreToken( tLTDOVERLAY_COMPRESS, NULL )) YYABORT; }
386 | tLTDOVERLAY_OBJECT { if (!StoreToken( tLTDOVERLAY_OBJECT, $1 )) YYABORT; }
387 | tLTDOVERLAY_LIBRARY { if (!StoreToken( tLTDOVERLAY_LIBRARY, $1 )) YYABORT; }
388 | tLTDOVERLAY_SEARCHSYMBOL { if (!StoreToken( tLTDOVERLAY_SEARCHSYMBOL, $1 )) YYABORT; }
389 | tLTDOVERLAY_FORCE { if (!StoreToken( tLTDOVERLAY_FORCE, $1 )) YYABORT; }
390 | tNUMBER_LTDOVERLAYS { if (!StoreToken( tNUMBER_LTDOVERLAYS, NULL )) YYABORT; }
391 | tFOREACH_LTDOVERLAYS { if (!PushLoopStack( tFOREACH_LTDOVERLAYS, $1 )) YYABORT; }
392 | tEND_LTDOVERLAYS { if (!PopLoopStack ( tFOREACH_LTDOVERLAYS )) YYABORT; }
393 | tFOREACH_LTDOVERLAY_OBJECTS { if (!PushLoopStack( tFOREACH_LTDOVERLAY_OBJECTS, $1 )) YYABORT; }
394 | tEND_LTDOVERLAY_OBJECTS { if (!PopLoopStack ( tFOREACH_LTDOVERLAY_OBJECTS )) YYABORT; }
395 | tFOREACH_LTDOVERLAY_LIBRARIES { if (!PushLoopStack( tFOREACH_LTDOVERLAY_LIBRARIES, $1 )) YYABORT; }
396 | tEND_LTDOVERLAY_LIBRARIES { if (!PopLoopStack ( tFOREACH_LTDOVERLAY_LIBRARIES )) YYABORT; }
397 | tFOREACH_LTDOVERLAY_SEARCHSYMBOLS{ if (!PushLoopStack( tFOREACH_LTDOVERLAY_SEARCHSYMBOLS, $1 )) YYABORT; }
398 | tEND_LTDOVERLAY_SEARCHSYMBOLS { if (!PopLoopStack ( tFOREACH_LTDOVERLAY_SEARCHSYMBOLS )) YYABORT; }
399 | tFOREACH_LTDOVERLAY_FORCES { if (!PushLoopStack( tFOREACH_LTDOVERLAY_FORCES, $1 )) YYABORT; }
400 | tEND_LTDOVERLAY_FORCES { if (!PopLoopStack ( tFOREACH_LTDOVERLAY_FORCES )) YYABORT; }
401 | tPROPERTY_OVERLAYDEFS { if (!StoreToken( tPROPERTY_OVERLAYDEFS, NULL )) YYABORT; }
402 | tPROPERTY_OVERLAYTABLE { if (!StoreToken( tPROPERTY_OVERLAYTABLE, NULL )) YYABORT; }
403 | tPROPERTY_LTDOVERLAYDEFS { if (!StoreToken( tPROPERTY_LTDOVERLAYDEFS, NULL )) YYABORT; }
404 | tPROPERTY_LTDOVERLAYTABLE { if (!StoreToken( tPROPERTY_LTDOVERLAYTABLE, NULL )) YYABORT; }
405 | tPROPERTY_SUFFIX { if (!StoreToken( tPROPERTY_SUFFIX, NULL )) YYABORT; }
406 | tPROPERTY_FLXSUFFIX { if (!StoreToken( tPROPERTY_FLXSUFFIX, NULL )) YYABORT; }
407 | tPROPERTY_LTDSUFFIX { if (!StoreToken( tPROPERTY_LTDSUFFIX, NULL )) YYABORT; }
408 | cond_if | cond_else | cond_endif
409 ;
410
411 cond_if : tIF_OPEN tIF_ID tIF_COMP tIF_VALUE tIF_CLOSE { if (!CondIf( $2, $3, $4 )) YYABORT; }
412 | tIF_OPEN tIF_ID tIF_COMP tIF_CLOSE { if (!CondIf( $2, $3, "" )) YYABORT; }
413 ;
414
415 cond_else : tIF_ELSE { if (!CondElse()) YYABORT; }
416 ;
417
418 cond_endif : tIF_ENDIF { if (!CondEndIf()) YYABORT; }
419 ;
420
421 %%
422