don't assert if a struct-type symbol hasn't been defined
[xorcyst.git] / RCS / parser.y,v
blob4d32a95e2fe7e1e0a0c936dbdc0f0440249fcb8b
1 head    1.14;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
8 1.14
9 date    2007.11.11.22.35.51;    author khansen; state Exp;
10 branches;
11 next    1.13;
13 1.13
14 date    2007.08.19.11.19.47;    author khansen; state Exp;
15 branches;
16 next    1.12;
18 1.12
19 date    2007.08.12.18.59.00;    author khansen; state Exp;
20 branches;
21 next    1.11;
23 1.11
24 date    2007.08.11.01.25.50;    author khansen; state Exp;
25 branches;
26 next    1.10;
28 1.10
29 date    2007.07.22.13.34.38;    author khansen; state Exp;
30 branches;
31 next    1.9;
33 1.9
34 date    2005.01.05.02.28.40;    author kenth;   state Exp;
35 branches;
36 next    1.8;
38 1.8
39 date    2004.12.29.21.45.26;    author kenth;   state Exp;
40 branches;
41 next    1.7;
43 1.7
44 date    2004.12.19.19.59.14;    author kenth;   state Exp;
45 branches;
46 next    1.6;
48 1.6
49 date    2004.12.16.13.22.27;    author kenth;   state Exp;
50 branches;
51 next    1.5;
53 1.5
54 date    2004.12.14.01.50.42;    author kenth;   state Exp;
55 branches;
56 next    1.4;
58 1.4
59 date    2004.12.11.02.12.41;    author kenth;   state Exp;
60 branches;
61 next    1.3;
63 1.3
64 date    2004.12.09.11.17.15;    author kenth;   state Exp;
65 branches;
66 next    1.2;
68 1.2
69 date    2004.12.06.05.06.21;    author kenth;   state Exp;
70 branches;
71 next    1.1;
73 1.1
74 date    2004.06.30.07.57.03;    author kenth;   state Exp;
75 branches;
76 next    ;
79 desc
83 1.14
84 log
85 @compile on mac
87 text
88 @%{
90  * $Id: parser.y,v 1.13 2007/08/19 11:19:47 khansen Exp khansen $
91  * $Log: parser.y,v $
92  * Revision 1.13  2007/08/19 11:19:47  khansen
93  * --case-insensitive option
94  *
95  * Revision 1.12  2007/08/12 18:59:00  khansen
96  * ability to generate pure 6502 binary
97  *
98  * Revision 1.11  2007/08/11 01:25:50  khansen
99  * includepaths support (-I option)
101  * Revision 1.10  2007/07/22 13:34:38  khansen
102  * convert tabs to whitespaces
104  * Revision 1.9  2005/01/05 02:28:40  kenth
105  * anonymous union parsing
107  * Revision 1.8  2004/12/29 21:45:26  kenth
108  * xorcyst 1.4.2
109  * static indexing
111  * Revision 1.7  2004/12/19 19:59:14  kenth
112  * xorcyst 1.4.0
114  * Revision 1.6  2004/12/16 13:22:27  kenth
115  * xorcyst 1.3.5
117  * Revision 1.5  2004/12/14 01:50:42  kenth
118  * xorcyst 1.3.0
120  * Revision 1.4  2004/12/11 02:12:41  kenth
121  * xorcyst 1.2.0
123  * Revision 1.3  2004/12/09 11:17:15  kenth
124  * added: warning_statement, error_statement
126  * Revision 1.2  2004/12/06 05:06:21  kenth
127  * xorcyst 1.1.0
129  * Revision 1.1  2004/06/30 07:57:03  kenth
130  * Initial revision
132  */
133 #include <stdlib.h>
134 #include <stdio.h>
135 #include <string.h>
136 #include "symtab.h"
137 #include "loc.h"
138 #include "xasm.h"
139 //#define YYDEBUG 1
140 int yyparse(void);
141 void yyerror(const char *);   /* In lexer */
142 int yylex(void);    /* In lexer */
143 int yypushandrestart(const char *);   /* In lexer */
144 void __yy_memcpy(char *, char *, int);
145 extern char *yytext;    /* In lexer */
146 extern YYLTYPE yylloc;  /* In lexer */
147 extern astnode *root_node;  /* Root of the generated parse tree */
148 void handle_incsrc(astnode *);  /* See below */
149 void handle_incbin(astnode *);  /* See below */
152 %union {
153     long integer;
154     int mnemonic;
155     const char *string;
156     const char *label;
157     const char *ident;
158     astnode *node;
161 %error-verbose
163 %token <integer> INTEGER_LITERAL
164 %token <string> STRING_LITERAL
165 %token <string> FILE_PATH
166 %token <ident> IDENTIFIER
167 %token <ident> LOCAL_ID
168 %token <ident> FORWARD_BRANCH
169 %token <ident> BACKWARD_BRANCH
170 %token <label> LABEL
171 %token <label> LOCAL_LABEL
172 %token <mnemonic> MNEMONIC
174 %type <node> identifier identifier_opt local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression extended_expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement define_statement align_statement org_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg label_addr_part_opt label_type_part_opt from_part_opt indexed_identifier
176 %token _LABEL_ BYTE CHAR WORD DWORD DSB DSW DSD DATASEG CODESEG IF IFDEF IFNDEF ELSE ELIF ENDIF INCSRC INCBIN MACRO REPT WHILE ENDM ALIGN EQU DEFINE END PUBLIC EXTRN CHARMAP STRUC UNION ENDS RECORD ENUM ENDE PROC ENDP SIZEOF MASK TAG MESSAGE WARNING ERROR ZEROPAGE ORG
178 %token '\n'
179 %token ':'
180 %token '@@'
181 %token SCOPE_OP
182 %token 'A' 'X' 'Y'
183 %token '='
184 %token '$'
185 %token '{' '}'
186 %token '[' ']'
187 %left ','
188 %token '.'
189 %right '#'
190 %right LO_OP HI_OP
191 %left '|'
192 %left '^'
193 %left '&'
194 %left EQ_OP NE_OP
195 %left LE_OP GE_OP '>' '<'
196 %left SHL_OP SHR_OP
197 %left '+' '-'
198 %right UMINUS
199 %left '*' '/' '%'
200 %right '!' '~'
201 %left '('
202 %right ')'
203 %start assembly_unit
205 assembly_unit:
206     statement_list end_opt { root_node = astnode_create_list($1); }
207     ;
209 end_opt:
210     END line_tail { ; }
211     | /* empty */
212     ;
214 statement_list:
215     labelable_statement { $$ = $1; }
216     | statement_list labelable_statement {
217          if ($1 != NULL) { $$ = $1; astnode_add_sibling($$, $2); }
218          else { $$ = $2; }
219         }
220     ;
222 labelable_statement:
223     label_decl statement { $$ = $1; astnode_add_sibling($$, $2); }
224     | statement { $$ = $1; }
225     ;
227 statement:
228     if_statement { $$ = $1; }
229     | ifdef_statement { $$ = $1; }
230     | ifndef_statement { $$ = $1; }
231     | macro_decl_statement { $$ = $1; }
232     | macro_statement { $$ = $1; }
233     | incsrc_statement { $$ = $1; }
234     | incbin_statement { $$ = $1; }
235     | equ_statement { $$ = $1; }
236     | assign_statement { $$ = $1; }
237     | public_statement { $$ = $1; }
238     | extrn_statement { $$ = $1; }
239     | instruction_statement { $$ = $1; }
240     | data_statement { $$ = $1; }
241     | storage_statement { $$ = $1; }
242     | dataseg_statement { $$ = $1; }
243     | codeseg_statement { $$ = $1; }
244     | charmap_statement { $$ = $1; }
245     | struc_decl_statement { $$ = $1; }
246     | union_decl_statement { $$ = $1; }
247     | enum_decl_statement { $$ = $1; }
248     | record_decl_statement { $$ = $1; }
249     | proc_statement { $$ = $1; }
250     | rept_statement { $$ = $1; }
251     | while_statement { $$ = $1; }
252     | label_statement { $$ = $1; }
253     | message_statement { $$ = $1; }
254     | warning_statement { $$ = $1; }
255     | error_statement { $$ = $1; }
256     | define_statement { $$ = $1; }
257     | align_statement { $$ = $1; }
258     | org_statement { $$ = $1; }
259     | null_statement { $$ = $1; }
260     | error line_tail { $$ = NULL; }
261     ;
263 org_statement:
264     ORG expression line_tail { $$ = astnode_create_org($2, @@$); }
265     ;
267 align_statement:
268     ALIGN identifier_list expression line_tail { $$ = astnode_create_align($2, $3, @@$); }
269     ;
271 warning_statement:
272     WARNING expression line_tail { $$ = astnode_create_warning($2, @@$); }
273     ;
275 error_statement:
276     ERROR expression line_tail { $$ = astnode_create_error($2, @@$); }
277     ;
279 message_statement:
280     MESSAGE expression line_tail { $$ = astnode_create_message($2, @@$); }
281     ;
283 label_statement:
284     _LABEL_ identifier label_addr_part_opt label_type_part_opt line_tail { $$ = astnode_create_label($2->label, $3, $4, @@$); }
285     ;
287 label_addr_part_opt:
288     '=' expression { $$ = $2; }
289     | { $$ = NULL; }
290     ;
292 label_type_part_opt:
293     ':' symbol_type { $$ = $2; }
294     | { $$ = NULL; }
295     ;
297 while_statement:
298     WHILE expression line_tail statement_list ENDM line_tail { $$ = astnode_create_while($2, $4, @@$); }
299     ;
301 rept_statement:
302     REPT expression line_tail statement_list ENDM line_tail { $$ = astnode_create_rept($2, $4, @@$); }
303     ;
305 proc_statement:
306     PROC identifier line_tail statement_list ENDP line_tail { $$ = astnode_create_proc($2, $4, @@$); }
307     ;
309 struc_decl_statement:
310     STRUC identifier line_tail statement_list ENDS line_tail { $$ = astnode_create_struc_decl($2, $4, @@$); }
311     ;
313 union_decl_statement:
314     UNION identifier_opt line_tail statement_list ENDS line_tail { $$ = astnode_create_union_decl($2, $4, @@$); }
315     ;
317 enum_decl_statement:
318     ENUM identifier line_tail enum_item_list ENDE line_tail { $$ = astnode_create_enum_decl($2, $4, @@$); }
319     ;
321 enum_item_list:
322     enum_item { $$ = $1; }
323     | enum_item_list enum_item { $$ = $1; astnode_add_sibling($$, $2); }
324     ;
326 enum_item:
327     assign_statement { $$ = $1; }
328     | identifier line_tail { $$ = $1; }
329     ;
331 record_decl_statement:
332     RECORD identifier record_field_list line_tail { $$ = astnode_create_record_decl($2, $3, @@$); }
333     ;
335 record_field_list:
336     record_field { $$ = $1; }
337     | record_field_list ',' record_field { $$ = $1; astnode_add_sibling($$, $3); }
338     ;
340 record_field:
341     identifier ':' expression { $$ = astnode_create_bitfield_decl($1, $3, @@$); }
342     ;
344 charmap_statement:
345     CHARMAP file_specifier line_tail { $$ = astnode_create_charmap($2, @@$); }
346     ;
348 dataseg_statement:
349     DATASEG line_tail { $$ = astnode_create_dataseg(0, @@$); }
350     | DATASEG ZEROPAGE line_tail { $$ = astnode_create_dataseg(ZEROPAGE_FLAG, @@$); }
352 codeseg_statement:
353     CODESEG line_tail { $$ = astnode_create_codeseg(@@$); }
354     ;
356 null_statement:
357     line_tail { $$ = NULL; }
358     ;
360 label_decl:
361     label { $$ = $1; }
362     ;
364 line_tail:
365     newline { ; }
366     | ':' { ; }
367     ;
369 newline:
370     '\n' { ; }
371     ;
373 instruction_statement:
374     instruction line_tail { $$ = $1; }
375     ;
377 instruction:
378     MNEMONIC { $$ = astnode_create_instruction($1, IMPLIED_MODE, NULL, @@$); }
379     | MNEMONIC 'A' { $$ = astnode_create_instruction($1, ACCUMULATOR_MODE, NULL, @@$); }
380     | MNEMONIC '#' expression { $$ = astnode_create_instruction($1, IMMEDIATE_MODE, $3, @@$); }
381     | MNEMONIC expression { $$ = astnode_create_instruction($1, ABSOLUTE_MODE, $2, @@$); }
382     | MNEMONIC expression ',' 'X' { $$ = astnode_create_instruction($1, ABSOLUTE_X_MODE, $2, @@$); }
383     | MNEMONIC expression ',' 'Y' { $$ = astnode_create_instruction($1, ABSOLUTE_Y_MODE, $2, @@$); }
384     | MNEMONIC '[' expression ',' 'X' ']' { $$ = astnode_create_instruction($1, PREINDEXED_INDIRECT_MODE, $3, @@$); }
385     | MNEMONIC '[' expression ']' ',' 'Y' { $$ = astnode_create_instruction($1, POSTINDEXED_INDIRECT_MODE, $3, @@$); }
386     | MNEMONIC '[' expression ']' { $$ = astnode_create_instruction($1, INDIRECT_MODE, $3, @@$); }
387     ;
389 expression:
390     indexed_identifier { $$ = $1; }
391     | SIZEOF sizeof_arg { $$ = astnode_create_sizeof($2, @@$); }
392     | scope_access { $$ = $1; }
393     | struc_access { $$ = $1; }
394     | local_id { $$ = $1; }
395     | literal { $$ = $1; }
396     | '$' { $$ = astnode_create_pc(@@$); }
397     | arithmetic_expression { $$ = $1; }
398     | comparison_expression { $$ = $1; }
399     | '(' expression ')' { $$ = $2; }
400     | '+' { $$ = astnode_create_forward_branch("+", @@$); }
401     | '-' { $$ = astnode_create_backward_branch("-", @@$); }
402     | FORWARD_BRANCH { $$ = astnode_create_forward_branch($1, @@$); }
403     | BACKWARD_BRANCH { $$ = astnode_create_backward_branch($1, @@$); }
404     | MASK scope_access { $$ = astnode_create_mask($2, @@$); }
405     ;
407 indexed_identifier:
408     identifier { $$ = $1; }
409     | identifier '[' expression ']' { $$ = astnode_create_index($1, $3, @@$); }
410     | identifier '(' expression ')' { $$ = astnode_create_index($1, $3, @@$); }
411     ;
413 extended_expression:
414     expression { $$ = $1; }
415     | struc_initializer { $$ = $1; }
416     ;
418 sizeof_arg:
419     identifier { $$ = $1; }
420     | datatype { $$ = $1; }
421     ;
423 expression_opt:
424     expression { $$ = $1; }
425     | { $$ = NULL; }
426     ;
428 scope_access:
429     identifier SCOPE_OP identifier { $$ = astnode_create_scope($1, $3, @@$); }
430     ;
432 struc_access:
433     indexed_identifier '.' struc_access { $$ = astnode_create_dot($1, $3, @@$); }
434     | indexed_identifier '.' indexed_identifier { $$ = astnode_create_dot($1, $3, @@$); }
435     ;
437 struc_initializer:
438     '{' field_initializer_list_opt '}' { $$ = astnode_create_struc($2, @@$); }
439     ;
441 field_initializer_list_opt:
442     field_initializer_list { $$ = $1; }
443     | { $$ = NULL; }
444     ;
446 field_initializer_list:
447     field_initializer { $$ = $1; }
448     | field_initializer_list ',' field_initializer { $$ = $1; astnode_add_sibling($$, $3); }
449     ;
451 field_initializer:
452     extended_expression { $$ = $1; }
453     | { $$ = astnode_create_null(@@$); }
454     ;
456 local_id:
457     LOCAL_ID { $$ = astnode_create_local_id($1, @@$); }
458     ;
460 arithmetic_expression:
461     expression '+' expression { $$ = astnode_create_arithmetic(PLUS_OPERATOR, $1, $3, @@$); }
462     | expression '-' expression { $$ = astnode_create_arithmetic(MINUS_OPERATOR, $1, $3, @@$); }
463     | expression '*' expression { $$ = astnode_create_arithmetic(MUL_OPERATOR, $1, $3, @@$); }
464     | expression '/' expression { $$ = astnode_create_arithmetic(DIV_OPERATOR, $1, $3, @@$); }
465     | expression '%' expression { $$ = astnode_create_arithmetic(MOD_OPERATOR, $1, $3, @@$); }
466     | expression '&' expression { $$ = astnode_create_arithmetic(AND_OPERATOR, $1, $3, @@$); }
467     | expression '|' expression { $$ = astnode_create_arithmetic(OR_OPERATOR, $1, $3, @@$); }
468     | expression '^' expression { $$ = astnode_create_arithmetic(XOR_OPERATOR, $1, $3, @@$); }
469     | expression SHL_OP expression { $$ = astnode_create_arithmetic(SHL_OPERATOR, $1, $3, @@$); }
470     | expression SHR_OP expression { $$ = astnode_create_arithmetic(SHR_OPERATOR, $1, $3, @@$); }
471     | '~' expression { $$ = astnode_create_arithmetic(NEG_OPERATOR, $2, NULL, @@$); }
472     | '!' expression { $$ = astnode_create_arithmetic(NOT_OPERATOR, $2, NULL, @@$); }
473     | '^' identifier { $$ = astnode_create_arithmetic(BANK_OPERATOR, $2, NULL, @@$); }
474     | '<' expression %prec LO_OP { $$ = astnode_create_arithmetic(LO_OPERATOR, $2, NULL, @@$); }
475     | '>' expression %prec HI_OP { $$ = astnode_create_arithmetic(HI_OPERATOR, $2, NULL, @@$); }
476     | '-' expression %prec UMINUS { $$ = astnode_create_arithmetic(UMINUS_OPERATOR, $2, NULL, @@$); }
477     ;
479 comparison_expression:
480     expression EQ_OP expression { $$ = astnode_create_arithmetic(EQ_OPERATOR, $1, $3, @@$); }
481     | expression NE_OP expression { $$ = astnode_create_arithmetic(NE_OPERATOR, $1, $3, @@$); }
482     | expression '>' expression { $$ = astnode_create_arithmetic(GT_OPERATOR, $1, $3, @@$); }
483     | expression '<' expression { $$ = astnode_create_arithmetic(LT_OPERATOR, $1, $3, @@$); }
484     | expression GE_OP expression { $$ = astnode_create_arithmetic(GE_OPERATOR, $1, $3, @@$); }
485     | expression LE_OP expression { $$ = astnode_create_arithmetic(LE_OPERATOR, $1, $3, @@$); }
486     ;
488 label:
489     LABEL { $$ = astnode_create_label($1, NULL, NULL, @@$); }
490     | LOCAL_LABEL { $$ = astnode_create_local_label($1, @@$); }
491     | '+' { $$ = astnode_create_forward_branch_decl("+", @@$); }
492     | '-' { $$ = astnode_create_backward_branch_decl("-", @@$); }
493     | FORWARD_BRANCH { $$ = astnode_create_forward_branch_decl($1, @@$); }
494     | BACKWARD_BRANCH { $$ = astnode_create_backward_branch_decl($1, @@$); }
495     ;
497 identifier:
498     IDENTIFIER { $$ = astnode_create_identifier($1, @@$); }
499     ;
501 identifier_opt:
502     identifier { $$ = $1; }
503     | { $$ = astnode_create_null(@@$); }
504     ;
506 literal:
507     INTEGER_LITERAL { $$ = astnode_create_integer($1, @@$); }
508     | STRING_LITERAL { $$ = astnode_create_string($1, @@$); }
509     ;
511 if_statement:
512     IF expression line_tail statement_list elif_statement_list_opt else_part_opt ENDIF line_tail { $$ = astnode_create_if($2, $4, $5, $6, @@$); }
513     ;
515 elif_statement_list_opt:
516     elif_statement_list { $$ = $1; }
517     | { $$ = NULL; }
518     ;
520 elif_statement_list:
521     elif_statement { $$ = $1; }
522     | elif_statement_list elif_statement { $$ = $1; astnode_add_sibling($$, $2); }
523     ;
525 elif_statement:
526     ELIF expression line_tail statement_list { $$ = astnode_create_case($2, $4, @@$); }
527     ;
529 else_part_opt:
530     ELSE line_tail statement_list { $$ = $3; }
531     | { $$ = NULL; }
532     ;
534 ifdef_statement:
535     IFDEF identifier line_tail statement_list else_part_opt ENDIF line_tail { $$ = astnode_create_ifdef($2, $4, $5, @@$); }
536     ;
538 ifndef_statement:
539     IFNDEF identifier line_tail statement_list else_part_opt ENDIF line_tail { $$ = astnode_create_ifndef($2, $4, $5, @@$); }
540     ;
542 data_statement:
543     named_data_statement line_tail { $$ = $1; }
544     | unnamed_data_statement line_tail { $$ = $1; }
545     ;
547 named_data_statement:
548     identifier unnamed_data_statement { $$ = astnode_create_var_decl(0, $1, $2, @@$); }
549     | ZEROPAGE identifier unnamed_data_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG, $2, $3, @@$); }
550     | PUBLIC identifier unnamed_data_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG, $2, $3, @@$); }
551     | ZEROPAGE PUBLIC identifier unnamed_data_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG | PUBLIC_FLAG, $3, $4, @@$); }
552     | PUBLIC ZEROPAGE identifier unnamed_data_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG | ZEROPAGE_FLAG, $3, $4, @@$); }
553     ;
555 unnamed_data_statement:
556     datatype expression_list { $$ = astnode_create_data($1, $2, @@$); }
557     | datatype { $$ = astnode_create_storage($1, NULL, @@$); }
558     | datatype '[' expression ']' { $$ = astnode_create_storage($1, $3, @@$); }
559     ;
561 datatype:
562     BYTE { $$ = astnode_create_datatype(BYTE_DATATYPE, NULL, @@$); }
563     | CHAR { $$ = astnode_create_datatype(CHAR_DATATYPE, NULL, @@$); }
564     | WORD { $$ = astnode_create_datatype(WORD_DATATYPE, NULL, @@$); }
565     | DWORD { $$ = astnode_create_datatype(DWORD_DATATYPE, NULL, @@$); }
566     | TAG identifier { $$ = astnode_create_datatype(USER_DATATYPE, $2, @@$); }
567     | '.' identifier { $$ = astnode_create_datatype(USER_DATATYPE, $2, @@$); }
568     ;
570 expression_list:
571     extended_expression { $$ = $1; }
572     | expression_list ',' extended_expression { $$ = $1; astnode_add_sibling($$, $3); }
573     ;
575 incsrc_statement:
576     INCSRC file_specifier line_tail { $$ = astnode_create_incsrc($2, @@$); handle_incsrc($$); }
577     ;
579 incbin_statement:
580     INCBIN file_specifier line_tail { $$ = astnode_create_incbin($2, @@$); handle_incbin($$); }
581     ;
583 file_specifier:
584     STRING_LITERAL { $$ = astnode_create_string($1, @@$); }
585     | FILE_PATH { $$ = astnode_create_file_path($1, @@$); }
586     ;
588 macro_decl_statement:
589     MACRO identifier param_list_opt line_tail statement_list ENDM line_tail { $$ = astnode_create_macro_decl($2, $3, $5, @@$); }
590     ;
592 param_list_opt:
593     identifier_list { $$ = $1; }
594     | { $$ = NULL; }
595     ;
597 macro_statement:
598     identifier arg_list_opt line_tail { $$ = astnode_create_macro($1, $2, @@$); }
599     ;
601 arg_list_opt:
602     expression_list { $$ = $1; }
603     | { $$ = NULL; }
604     ;
606 identifier_list:
607     identifier { $$ = $1; }
608     | identifier_list ',' identifier { $$ = $1; astnode_add_sibling($$, $3); }
609     ;
611 equ_statement:
612     identifier EQU extended_expression line_tail { $$ = astnode_create_equ($1, $3, @@$); }
613     ;
615 assign_statement:
616     identifier '=' extended_expression line_tail { $$ = astnode_create_assign($1, $3, @@$); }
617     ;
619 define_statement:
620     DEFINE identifier line_tail { $$ = astnode_create_equ($2, astnode_create_integer(0, @@$), @@$); }
621     | DEFINE identifier extended_expression line_tail { $$ = astnode_create_equ($2, $3, @@$); }
622     ;
624 public_statement:
625     PUBLIC identifier_list line_tail { $$ = astnode_create_public($2, @@$); }
626     ;
628 extrn_statement:
629     EXTRN identifier_list ':' symbol_type from_part_opt line_tail { $$ = astnode_create_extrn($2, $4, $5, @@$); }
630     ;
632 from_part_opt:
633     '@@' identifier { $$ = $2; }
634     | { $$ = NULL; }
635     ;
637 symbol_type:
638     datatype { $$ = $1; }
639     | identifier { $$ = astnode_create_datatype(USER_DATATYPE, $1, @@$); }
640     | PROC { $$ = astnode_create_integer(PROC_SYMBOL, @@$); }
641     | _LABEL_ { $$ = astnode_create_integer(LABEL_SYMBOL, @@$); }
642     ;
644 storage_statement:
645     named_storage_statement { $$ = $1; }
646     | unnamed_storage_statement { $$ = $1; }
647     ;
649 named_storage_statement:
650     identifier unnamed_storage_statement { $$ = astnode_create_var_decl(0, $1, $2, @@$); }
651     | ZEROPAGE identifier unnamed_storage_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG, $2, $3, @@$); }
652     | PUBLIC identifier unnamed_storage_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG, $2, $3, @@$); }
653     | ZEROPAGE PUBLIC identifier unnamed_storage_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG | PUBLIC_FLAG, $3, $4, @@$); }
654     | PUBLIC ZEROPAGE identifier unnamed_storage_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG | ZEROPAGE_FLAG, $3, $4, @@$); }
655     ;
657 unnamed_storage_statement:
658     storage expression_opt line_tail { $$ = astnode_create_storage($1, $2, @@$); }
659     ;
661 storage:
662     DSB { $$ = astnode_create_datatype(BYTE_DATATYPE, NULL, @@$); }
663     | DSW { $$ = astnode_create_datatype(WORD_DATATYPE, NULL, @@$); }
664     | DSD { $$ = astnode_create_datatype(DWORD_DATATYPE, NULL, @@$); }
665     ;
668  * Takes care of switching to a new scanner input stream when a "incsrc" statement
669  * has been encountered.
670  * The current stream is pushed on a stack, and will be popped when EOF is reached
671  * in the new stream.
672  * @@param n A node of type INCSRC_NODE
673  */
674 void handle_incsrc(astnode *n)
676     char errs[512];
677     /* Get the node which describes the file to include */
678     astnode *file = astnode_get_child(n, 0);
680     switch (astnode_get_type(file)) {
681         case STRING_NODE:
682         /* TODO: add path searching */
683         case FILE_PATH_NODE:
684         switch (yypushandrestart(file->string)) {
685             case 0:
686             /* Success */
687             break;
688             case 1:
689             /* Failed to open file */
690             sprintf(errs, "could not open '%s' for reading", file->string);
691             yyerror(errs);
692             break;
693             case 2:
694             /* Stack overflow */
695             yyerror("Maximum include nesting level reached");
696             break;
697         }
698         break;
700         default: break;
701     }
704 // TODO: This shouldn't be done here but rather in astproc module.
707  * Takes care of including the binary contents of the file specified by a parsed
708  * "incbin" statement.
709  * Calls yyerror() if the file can't be included for some reason.
710  * @@param n A node of type INCBIN_NODE
711  */
712 void handle_incbin(astnode *n)
714     FILE *fp;
715     unsigned char *data;
716     int size;
717     char errs[512];
718     /* Get the node which describes the file to include */
719     astnode *file = astnode_get_child(n, 0);
720     const char *filename = file->string;
722     switch (astnode_get_type(file)) {
723         case STRING_NODE:
724         /* TODO: add path searching */
725         case FILE_PATH_NODE:
726         /* Attempt to open file */
727         fp = fopen(filename, "rb");
728         if (!fp && (filename[0] != '/')) {
729             /* Try search paths */
730             /* ### copied from scanner.l -- generalize */
731             int i;
732             for (i = 0; i < xasm_args.include_path_count; ++i) {
733                 const char *include_path = xasm_args.include_paths[i];
734                 char *path = (char *)malloc(
735                     strlen(include_path) + strlen("/") + strlen(filename) + 1);
736                 strcpy(path, include_path);
737                 strcat(path, "/");
738                 strcat(path, filename);
739                 fp = fopen(path, "rb");
740                 free(path);
741                 if (fp)
742                     break;
743             }
744         }
745         if (fp) {
746             /* Get filesize */
747             fseek(fp, 0, SEEK_END);
748             size = ftell(fp);
749             rewind(fp);
750             if (size > 0) {
751                 /* Allocate buffer to hold file contents */
752                 data = (unsigned char *)malloc(size);
753                 /* Read file contents into buffer */
754                 fread(data, 1, size, fp);
755                 /* Insert binary node */
756                 astnode_add_sibling(n, astnode_create_binary(data, size, n->loc) );
757             }
758             /* Close file */
759             fclose(fp);
760         }
761         else {
762             /* Couldn't open file */
763             sprintf(errs, "could not open '%s' for reading", file->string);
764             yyerror(errs);
765         }
766         break;
768         default: break;
769     }
774 1.13
776 @--case-insensitive option
778 text
779 @d3 1
780 a3 1
781  * $Id: parser.y,v 1.12 2007/08/12 18:59:00 khansen Exp khansen $
782 d5 3
783 d46 1
784 a46 1
785 #include <malloc.h>
789 1.12
791 @ability to generate pure 6502 binary
793 text
794 @d3 1
795 a3 1
796  * $Id: parser.y,v 1.11 2007/08/11 01:25:50 khansen Exp khansen $
797 d5 3
798 d51 1
799 a51 1
800 void yyerror(char *);   /* In lexer */
801 d53 1
802 a53 1
803 int yypushandrestart(char *);   /* In lexer */
804 d65 3
805 a67 3
806     char *string;
807     char *label;
808     char *ident;
812 1.11
814 @includepaths support (-I option)
816 text
817 @d3 1
818 a3 1
819  * $Id: parser.y,v 1.10 2007/07/22 13:34:38 khansen Exp khansen $
820 d5 3
821 d81 1
822 a81 1
823 %type <node> identifier identifier_opt local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression extended_expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement define_statement align_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg label_addr_part_opt label_type_part_opt from_part_opt indexed_identifier
824 d83 1
825 a83 1
826 %token _LABEL_ BYTE CHAR WORD DWORD DSB DSW DSD DATASEG CODESEG IF IFDEF IFNDEF ELSE ELIF ENDIF INCSRC INCBIN MACRO REPT WHILE ENDM ALIGN EQU DEFINE END PUBLIC EXTRN CHARMAP STRUC UNION ENDS RECORD ENUM ENDE PROC ENDP SIZEOF MASK TAG MESSAGE WARNING ERROR ZEROPAGE
827 d165 1
828 d170 4
829 d195 1
830 a195 1
831     '=' INTEGER_LITERAL { $$ = astnode_create_integer($2, @@$); }
835 1.10
837 @convert tabs to whitespaces
839 text
840 @d3 1
841 a3 1
842  * $Id: parser.y,v 1.9 2005/01/05 02:28:40 kenth Exp khansen $
843 d5 3
844 d42 1
845 d619 1
846 d626 18
847 a643 1
848         fp = fopen(file->string, "rb");
854 @anonymous union parsing
856 text
857 @d3 1
858 a3 1
859  * $Id: parser.y,v 1.8 2004/12/29 21:45:26 kenth Exp kenth $
860 d5 3
861 d41 3
862 a43 3
863 void yyerror(char *);   /* In lexer */
864 int yylex(void);        /* In lexer */
865 int yypushandrestart(char *);   /* In lexer */
866 d45 5
867 a49 5
868 extern char *yytext;    /* In lexer */
869 extern YYLTYPE yylloc;  /* In lexer */
870 extern astnode *root_node;      /* Root of the generated parse tree */
871 void handle_incsrc(astnode *);  /* See below */
872 void handle_incbin(astnode *);  /* See below */
873 d106 2
874 a107 2
875         statement_list end_opt { root_node = astnode_create_list($1); }
876         ;
877 d110 3
878 a112 3
879         END line_tail { ; }
880         | /* empty */
881         ;
882 d115 6
883 a120 6
884         labelable_statement { $$ = $1; }
885         | statement_list labelable_statement {
886                  if ($1 != NULL) { $$ = $1; astnode_add_sibling($$, $2); }
887                  else { $$ = $2; }
888                 }
889         ;
890 d123 3
891 a125 3
892         label_decl statement { $$ = $1; astnode_add_sibling($$, $2); }
893         | statement { $$ = $1; }
894         ;
895 d128 33
896 a160 33
897         if_statement { $$ = $1; }
898         | ifdef_statement { $$ = $1; }
899         | ifndef_statement { $$ = $1; }
900         | macro_decl_statement { $$ = $1; }
901         | macro_statement { $$ = $1; }
902         | incsrc_statement { $$ = $1; }
903         | incbin_statement { $$ = $1; }
904         | equ_statement { $$ = $1; }
905         | assign_statement { $$ = $1; }
906         | public_statement { $$ = $1; }
907         | extrn_statement { $$ = $1; }
908         | instruction_statement { $$ = $1; }
909         | data_statement { $$ = $1; }
910         | storage_statement { $$ = $1; }
911         | dataseg_statement { $$ = $1; }
912         | codeseg_statement { $$ = $1; }
913         | charmap_statement { $$ = $1; }
914         | struc_decl_statement { $$ = $1; }
915         | union_decl_statement { $$ = $1; }
916         | enum_decl_statement { $$ = $1; }
917         | record_decl_statement { $$ = $1; }
918         | proc_statement { $$ = $1; }
919         | rept_statement { $$ = $1; }
920         | while_statement { $$ = $1; }
921         | label_statement { $$ = $1; }
922         | message_statement { $$ = $1; }
923         | warning_statement { $$ = $1; }
924         | error_statement { $$ = $1; }
925         | define_statement { $$ = $1; }
926         | align_statement { $$ = $1; }
927         | null_statement { $$ = $1; }
928         | error line_tail { $$ = NULL; }
929         ;
930 d163 2
931 a164 2
932         ALIGN identifier_list expression line_tail { $$ = astnode_create_align($2, $3, @@$); }
933         ;
934 d167 2
935 a168 2
936         WARNING expression line_tail { $$ = astnode_create_warning($2, @@$); }
937         ;
938 d171 2
939 a172 2
940         ERROR expression line_tail { $$ = astnode_create_error($2, @@$); }
941         ;
942 d175 2
943 a176 2
944         MESSAGE expression line_tail { $$ = astnode_create_message($2, @@$); }
945         ;
946 d179 2
947 a180 2
948         _LABEL_ identifier label_addr_part_opt label_type_part_opt line_tail { $$ = astnode_create_label($2->label, $3, $4, @@$); }
949         ;
950 d183 3
951 a185 3
952         '=' INTEGER_LITERAL { $$ = astnode_create_integer($2, @@$); }
953         | { $$ = NULL; }
954         ;
955 d188 3
956 a190 3
957         ':' symbol_type { $$ = $2; }
958         | { $$ = NULL; }
959         ;
960 d193 2
961 a194 2
962         WHILE expression line_tail statement_list ENDM line_tail { $$ = astnode_create_while($2, $4, @@$); }
963         ;
964 d197 2
965 a198 2
966         REPT expression line_tail statement_list ENDM line_tail { $$ = astnode_create_rept($2, $4, @@$); }
967         ;
968 d201 2
969 a202 2
970         PROC identifier line_tail statement_list ENDP line_tail { $$ = astnode_create_proc($2, $4, @@$); }
971         ;
972 d205 2
973 a206 2
974         STRUC identifier line_tail statement_list ENDS line_tail { $$ = astnode_create_struc_decl($2, $4, @@$); }
975         ;
976 d209 2
977 a210 2
978         UNION identifier_opt line_tail statement_list ENDS line_tail { $$ = astnode_create_union_decl($2, $4, @@$); }
979         ;
980 d213 2
981 a214 2
982         ENUM identifier line_tail enum_item_list ENDE line_tail { $$ = astnode_create_enum_decl($2, $4, @@$); }
983         ;
984 d217 3
985 a219 3
986         enum_item { $$ = $1; }
987         | enum_item_list enum_item { $$ = $1; astnode_add_sibling($$, $2); }
988         ;
989 d222 3
990 a224 3
991         assign_statement { $$ = $1; }
992         | identifier line_tail { $$ = $1; }
993         ;
994 d227 2
995 a228 2
996         RECORD identifier record_field_list line_tail { $$ = astnode_create_record_decl($2, $3, @@$); }
997         ;
998 d231 3
999 a233 3
1000         record_field { $$ = $1; }
1001         | record_field_list ',' record_field { $$ = $1; astnode_add_sibling($$, $3); }
1002         ;
1003 d236 2
1004 a237 2
1005         identifier ':' expression { $$ = astnode_create_bitfield_decl($1, $3, @@$); }
1006         ;
1007 d240 2
1008 a241 2
1009         CHARMAP file_specifier line_tail { $$ = astnode_create_charmap($2, @@$); }
1010         ;
1011 d244 2
1012 a245 2
1013         DATASEG line_tail { $$ = astnode_create_dataseg(0, @@$); }
1014         | DATASEG ZEROPAGE line_tail { $$ = astnode_create_dataseg(ZEROPAGE_FLAG, @@$); }
1015 d248 2
1016 a249 2
1017         CODESEG line_tail { $$ = astnode_create_codeseg(@@$); }
1018         ;
1019 d252 2
1020 a253 2
1021         line_tail { $$ = NULL; }
1022         ;
1023 d256 2
1024 a257 2
1025         label { $$ = $1; }
1026         ;
1027 d260 3
1028 a262 3
1029         newline { ; }
1030         | ':' { ; }
1031         ;
1032 d265 2
1033 a266 2
1034         '\n' { ; }
1035         ;
1036 d269 2
1037 a270 2
1038         instruction line_tail { $$ = $1; }
1039         ;
1040 d273 10
1041 a282 10
1042         MNEMONIC { $$ = astnode_create_instruction($1, IMPLIED_MODE, NULL, @@$); }
1043         | MNEMONIC 'A' { $$ = astnode_create_instruction($1, ACCUMULATOR_MODE, NULL, @@$); }
1044         | MNEMONIC '#' expression { $$ = astnode_create_instruction($1, IMMEDIATE_MODE, $3, @@$); }
1045         | MNEMONIC expression { $$ = astnode_create_instruction($1, ABSOLUTE_MODE, $2, @@$); }
1046         | MNEMONIC expression ',' 'X' { $$ = astnode_create_instruction($1, ABSOLUTE_X_MODE, $2, @@$); }
1047         | MNEMONIC expression ',' 'Y' { $$ = astnode_create_instruction($1, ABSOLUTE_Y_MODE, $2, @@$); }
1048         | MNEMONIC '[' expression ',' 'X' ']' { $$ = astnode_create_instruction($1, PREINDEXED_INDIRECT_MODE, $3, @@$); }
1049         | MNEMONIC '[' expression ']' ',' 'Y' { $$ = astnode_create_instruction($1, POSTINDEXED_INDIRECT_MODE, $3, @@$); }
1050         | MNEMONIC '[' expression ']' { $$ = astnode_create_instruction($1, INDIRECT_MODE, $3, @@$); }
1051         ;
1052 d285 16
1053 a300 16
1054         indexed_identifier { $$ = $1; }
1055         | SIZEOF sizeof_arg { $$ = astnode_create_sizeof($2, @@$); }
1056         | scope_access { $$ = $1; }
1057         | struc_access { $$ = $1; }
1058         | local_id { $$ = $1; }
1059         | literal { $$ = $1; }
1060         | '$' { $$ = astnode_create_pc(@@$); }
1061         | arithmetic_expression { $$ = $1; }
1062         | comparison_expression { $$ = $1; }
1063         | '(' expression ')' { $$ = $2; }
1064         | '+' { $$ = astnode_create_forward_branch("+", @@$); }
1065         | '-' { $$ = astnode_create_backward_branch("-", @@$); }
1066         | FORWARD_BRANCH { $$ = astnode_create_forward_branch($1, @@$); }
1067         | BACKWARD_BRANCH { $$ = astnode_create_backward_branch($1, @@$); }
1068         | MASK scope_access { $$ = astnode_create_mask($2, @@$); }
1069         ;
1070 d303 4
1071 a306 4
1072         identifier { $$ = $1; }
1073         | identifier '[' expression ']' { $$ = astnode_create_index($1, $3, @@$); }
1074         | identifier '(' expression ')' { $$ = astnode_create_index($1, $3, @@$); }
1075         ;
1076 d309 3
1077 a311 3
1078         expression { $$ = $1; }
1079         | struc_initializer { $$ = $1; }
1080         ;
1081 d314 3
1082 a316 3
1083         identifier { $$ = $1; }
1084         | datatype { $$ = $1; }
1085         ;
1086 d319 3
1087 a321 3
1088         expression { $$ = $1; }
1089         | { $$ = NULL; }
1090         ;
1091 d324 2
1092 a325 2
1093         identifier SCOPE_OP identifier { $$ = astnode_create_scope($1, $3, @@$); }
1094         ;
1095 d328 3
1096 a330 3
1097         indexed_identifier '.' struc_access { $$ = astnode_create_dot($1, $3, @@$); }
1098         | indexed_identifier '.' indexed_identifier { $$ = astnode_create_dot($1, $3, @@$); }
1099         ;
1100 d333 2
1101 a334 2
1102         '{' field_initializer_list_opt '}' { $$ = astnode_create_struc($2, @@$); }
1103         ;
1104 d337 3
1105 a339 3
1106         field_initializer_list { $$ = $1; }
1107         | { $$ = NULL; }
1108         ;
1109 d342 3
1110 a344 3
1111         field_initializer { $$ = $1; }
1112         | field_initializer_list ',' field_initializer { $$ = $1; astnode_add_sibling($$, $3); }
1113         ;
1114 d347 3
1115 a349 3
1116         extended_expression { $$ = $1; }
1117         | { $$ = astnode_create_null(@@$); }
1118         ;
1119 d352 2
1120 a353 2
1121         LOCAL_ID { $$ = astnode_create_local_id($1, @@$); }
1122         ;
1123 d356 17
1124 a372 17
1125         expression '+' expression { $$ = astnode_create_arithmetic(PLUS_OPERATOR, $1, $3, @@$); }
1126         | expression '-' expression { $$ = astnode_create_arithmetic(MINUS_OPERATOR, $1, $3, @@$); }
1127         | expression '*' expression { $$ = astnode_create_arithmetic(MUL_OPERATOR, $1, $3, @@$); }
1128         | expression '/' expression { $$ = astnode_create_arithmetic(DIV_OPERATOR, $1, $3, @@$); }
1129         | expression '%' expression { $$ = astnode_create_arithmetic(MOD_OPERATOR, $1, $3, @@$); }
1130         | expression '&' expression { $$ = astnode_create_arithmetic(AND_OPERATOR, $1, $3, @@$); }
1131         | expression '|' expression { $$ = astnode_create_arithmetic(OR_OPERATOR, $1, $3, @@$); }
1132         | expression '^' expression { $$ = astnode_create_arithmetic(XOR_OPERATOR, $1, $3, @@$); }
1133         | expression SHL_OP expression { $$ = astnode_create_arithmetic(SHL_OPERATOR, $1, $3, @@$); }
1134         | expression SHR_OP expression { $$ = astnode_create_arithmetic(SHR_OPERATOR, $1, $3, @@$); }
1135         | '~' expression { $$ = astnode_create_arithmetic(NEG_OPERATOR, $2, NULL, @@$); }
1136         | '!' expression { $$ = astnode_create_arithmetic(NOT_OPERATOR, $2, NULL, @@$); }
1137         | '^' identifier { $$ = astnode_create_arithmetic(BANK_OPERATOR, $2, NULL, @@$); }
1138         | '<' expression %prec LO_OP { $$ = astnode_create_arithmetic(LO_OPERATOR, $2, NULL, @@$); }
1139         | '>' expression %prec HI_OP { $$ = astnode_create_arithmetic(HI_OPERATOR, $2, NULL, @@$); }
1140         | '-' expression %prec UMINUS { $$ = astnode_create_arithmetic(UMINUS_OPERATOR, $2, NULL, @@$); }
1141         ;
1142 d375 7
1143 a381 7
1144         expression EQ_OP expression { $$ = astnode_create_arithmetic(EQ_OPERATOR, $1, $3, @@$); }
1145         | expression NE_OP expression { $$ = astnode_create_arithmetic(NE_OPERATOR, $1, $3, @@$); }
1146         | expression '>' expression { $$ = astnode_create_arithmetic(GT_OPERATOR, $1, $3, @@$); }
1147         | expression '<' expression { $$ = astnode_create_arithmetic(LT_OPERATOR, $1, $3, @@$); }
1148         | expression GE_OP expression { $$ = astnode_create_arithmetic(GE_OPERATOR, $1, $3, @@$); }
1149         | expression LE_OP expression { $$ = astnode_create_arithmetic(LE_OPERATOR, $1, $3, @@$); }
1150         ;
1151 d384 7
1152 a390 7
1153         LABEL { $$ = astnode_create_label($1, NULL, NULL, @@$); }
1154         | LOCAL_LABEL { $$ = astnode_create_local_label($1, @@$); }
1155         | '+' { $$ = astnode_create_forward_branch_decl("+", @@$); }
1156         | '-' { $$ = astnode_create_backward_branch_decl("-", @@$); }
1157         | FORWARD_BRANCH { $$ = astnode_create_forward_branch_decl($1, @@$); }
1158         | BACKWARD_BRANCH { $$ = astnode_create_backward_branch_decl($1, @@$); }
1159         ;
1160 d393 2
1161 a394 2
1162         IDENTIFIER { $$ = astnode_create_identifier($1, @@$); }
1163         ;
1164 d397 3
1165 a399 3
1166         identifier { $$ = $1; }
1167         | { $$ = astnode_create_null(@@$); }
1168         ;
1169 d402 3
1170 a404 3
1171         INTEGER_LITERAL { $$ = astnode_create_integer($1, @@$); }
1172         | STRING_LITERAL { $$ = astnode_create_string($1, @@$); }
1173         ;
1174 d407 2
1175 a408 2
1176         IF expression line_tail statement_list elif_statement_list_opt else_part_opt ENDIF line_tail { $$ = astnode_create_if($2, $4, $5, $6, @@$); }
1177         ;
1178 d411 3
1179 a413 3
1180         elif_statement_list { $$ = $1; }
1181         | { $$ = NULL; }
1182         ;
1183 d416 3
1184 a418 3
1185         elif_statement { $$ = $1; }
1186         | elif_statement_list elif_statement { $$ = $1; astnode_add_sibling($$, $2); }
1187         ;
1188 d421 2
1189 a422 2
1190         ELIF expression line_tail statement_list { $$ = astnode_create_case($2, $4, @@$); }
1191         ;
1192 d425 3
1193 a427 3
1194         ELSE line_tail statement_list { $$ = $3; }
1195         | { $$ = NULL; }
1196         ;
1197 d430 2
1198 a431 2
1199         IFDEF identifier line_tail statement_list else_part_opt ENDIF line_tail { $$ = astnode_create_ifdef($2, $4, $5, @@$); }
1200         ;
1201 d434 2
1202 a435 2
1203         IFNDEF identifier line_tail statement_list else_part_opt ENDIF line_tail { $$ = astnode_create_ifndef($2, $4, $5, @@$); }
1204         ;
1205 d438 3
1206 a440 3
1207         named_data_statement line_tail { $$ = $1; }
1208         | unnamed_data_statement line_tail { $$ = $1; }
1209         ;
1210 d443 6
1211 a448 6
1212         identifier unnamed_data_statement { $$ = astnode_create_var_decl(0, $1, $2, @@$); }
1213         | ZEROPAGE identifier unnamed_data_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG, $2, $3, @@$); }
1214         | PUBLIC identifier unnamed_data_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG, $2, $3, @@$); }
1215         | ZEROPAGE PUBLIC identifier unnamed_data_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG | PUBLIC_FLAG, $3, $4, @@$); }
1216         | PUBLIC ZEROPAGE identifier unnamed_data_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG | ZEROPAGE_FLAG, $3, $4, @@$); }
1217         ;
1218 d451 4
1219 a454 4
1220         datatype expression_list { $$ = astnode_create_data($1, $2, @@$); }
1221         | datatype { $$ = astnode_create_storage($1, NULL, @@$); }
1222         | datatype '[' expression ']' { $$ = astnode_create_storage($1, $3, @@$); }
1223         ;
1224 d457 7
1225 a463 7
1226         BYTE { $$ = astnode_create_datatype(BYTE_DATATYPE, NULL, @@$); }
1227         | CHAR { $$ = astnode_create_datatype(CHAR_DATATYPE, NULL, @@$); }
1228         | WORD { $$ = astnode_create_datatype(WORD_DATATYPE, NULL, @@$); }
1229         | DWORD { $$ = astnode_create_datatype(DWORD_DATATYPE, NULL, @@$); }
1230         | TAG identifier { $$ = astnode_create_datatype(USER_DATATYPE, $2, @@$); }
1231         | '.' identifier { $$ = astnode_create_datatype(USER_DATATYPE, $2, @@$); }
1232         ;
1233 d466 3
1234 a468 3
1235         extended_expression { $$ = $1; }
1236         | expression_list ',' extended_expression { $$ = $1; astnode_add_sibling($$, $3); }
1237         ;
1238 d471 2
1239 a472 2
1240         INCSRC file_specifier line_tail { $$ = astnode_create_incsrc($2, @@$); handle_incsrc($$); }
1241         ;
1242 d475 2
1243 a476 2
1244         INCBIN file_specifier line_tail { $$ = astnode_create_incbin($2, @@$); handle_incbin($$); }
1245         ;
1246 d479 3
1247 a481 3
1248         STRING_LITERAL { $$ = astnode_create_string($1, @@$); }
1249         | FILE_PATH { $$ = astnode_create_file_path($1, @@$); }
1250         ;
1251 d484 2
1252 a485 2
1253         MACRO identifier param_list_opt line_tail statement_list ENDM line_tail { $$ = astnode_create_macro_decl($2, $3, $5, @@$); }
1254         ;
1255 d488 3
1256 a490 3
1257         identifier_list { $$ = $1; }
1258         | { $$ = NULL; }
1259         ;
1260 d493 2
1261 a494 2
1262         identifier arg_list_opt line_tail { $$ = astnode_create_macro($1, $2, @@$); }
1263         ;
1264 d497 3
1265 a499 3
1266         expression_list { $$ = $1; }
1267         | { $$ = NULL; }
1268         ;
1269 d502 3
1270 a504 3
1271         identifier { $$ = $1; }
1272         | identifier_list ',' identifier { $$ = $1; astnode_add_sibling($$, $3); }
1273         ;
1274 d507 2
1275 a508 2
1276         identifier EQU extended_expression line_tail { $$ = astnode_create_equ($1, $3, @@$); }
1277         ;
1278 d511 2
1279 a512 2
1280         identifier '=' extended_expression line_tail { $$ = astnode_create_assign($1, $3, @@$); }
1281         ;
1282 d515 3
1283 a517 3
1284         DEFINE identifier line_tail { $$ = astnode_create_equ($2, astnode_create_integer(0, @@$), @@$); }
1285         | DEFINE identifier extended_expression line_tail { $$ = astnode_create_equ($2, $3, @@$); }
1286         ;
1287 d520 2
1288 a521 2
1289         PUBLIC identifier_list line_tail { $$ = astnode_create_public($2, @@$); }
1290         ;
1291 d524 2
1292 a525 2
1293         EXTRN identifier_list ':' symbol_type from_part_opt line_tail { $$ = astnode_create_extrn($2, $4, $5, @@$); }
1294         ;
1295 d528 3
1296 a530 3
1297         '@@' identifier { $$ = $2; }
1298         | { $$ = NULL; }
1299         ;
1300 d533 5
1301 a537 5
1302         datatype { $$ = $1; }
1303         | identifier { $$ = astnode_create_datatype(USER_DATATYPE, $1, @@$); }
1304         | PROC { $$ = astnode_create_integer(PROC_SYMBOL, @@$); }
1305         | _LABEL_ { $$ = astnode_create_integer(LABEL_SYMBOL, @@$); }
1306         ;
1307 d540 3
1308 a542 3
1309         named_storage_statement { $$ = $1; }
1310         | unnamed_storage_statement { $$ = $1; }
1311         ;
1312 d545 6
1313 a550 6
1314         identifier unnamed_storage_statement { $$ = astnode_create_var_decl(0, $1, $2, @@$); }
1315         | ZEROPAGE identifier unnamed_storage_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG, $2, $3, @@$); }
1316         | PUBLIC identifier unnamed_storage_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG, $2, $3, @@$); }
1317         | ZEROPAGE PUBLIC identifier unnamed_storage_statement { $$ = astnode_create_var_decl(ZEROPAGE_FLAG | PUBLIC_FLAG, $3, $4, @@$); }
1318         | PUBLIC ZEROPAGE identifier unnamed_storage_statement { $$ = astnode_create_var_decl(PUBLIC_FLAG | ZEROPAGE_FLAG, $3, $4, @@$); }
1319         ;
1320 d553 2
1321 a554 2
1322         storage expression_opt line_tail { $$ = astnode_create_storage($1, $2, @@$); }
1323         ;
1324 d557 4
1325 a560 4
1326         DSB { $$ = astnode_create_datatype(BYTE_DATATYPE, NULL, @@$); }
1327         | DSW { $$ = astnode_create_datatype(WORD_DATATYPE, NULL, @@$); }
1328         | DSD { $$ = astnode_create_datatype(DWORD_DATATYPE, NULL, @@$); }
1329         ;
1330 d571 23
1331 a593 23
1332         char errs[512];
1333         /* Get the node which describes the file to include */
1334         astnode *file = astnode_get_child(n, 0);
1336         switch (astnode_get_type(file)) {
1337                 case STRING_NODE:
1338                 /* TODO: add path searching */
1339                 case FILE_PATH_NODE:
1340                 switch (yypushandrestart(file->string)) {
1341                         case 0:
1342                         /* Success */
1343                         break;
1344                         case 1:
1345                         /* Failed to open file */
1346                         sprintf(errs, "could not open '%s' for reading", file->string);
1347                         yyerror(errs);
1348                         break;
1349                         case 2:
1350                         /* Stack overflow */
1351                         yyerror("Maximum include nesting level reached");
1352                         break;
1353                 }
1354                 break;
1355 d595 2
1356 a596 2
1357                 default: break;
1358         }
1359 d609 35
1360 a643 35
1361         FILE *fp;
1362         unsigned char *data;
1363         int size;
1364         char errs[512];
1365         /* Get the node which describes the file to include */
1366         astnode *file = astnode_get_child(n, 0);
1368         switch (astnode_get_type(file)) {
1369                 case STRING_NODE:
1370                 /* TODO: add path searching */
1371                 case FILE_PATH_NODE:
1372                 /* Attempt to open file */
1373                 fp = fopen(file->string, "rb");
1374                 if (fp) {
1375                         /* Get filesize */
1376                         fseek(fp, 0, SEEK_END);
1377                         size = ftell(fp);
1378                         rewind(fp);
1379                         if (size > 0) {
1380                                 /* Allocate buffer to hold file contents */
1381                                 data = (unsigned char *)malloc(size);
1382                                 /* Read file contents into buffer */
1383                                 fread(data, 1, size, fp);
1384                                 /* Insert binary node */
1385                                 astnode_add_sibling(n, astnode_create_binary(data, size, n->loc) );
1386                         }
1387                         /* Close file */
1388                         fclose(fp);
1389                 }
1390                 else {
1391                         /* Couldn't open file */
1392                         sprintf(errs, "could not open '%s' for reading", file->string);
1393                         yyerror(errs);
1394                 }
1395                 break;
1396 d645 2
1397 a646 2
1398                 default: break;
1399         }
1405 @xorcyst 1.4.2
1406 static indexing
1408 text
1409 @d3 1
1410 a3 1
1411  * $Id: parser.y,v 1.7 2004/12/19 19:59:14 kenth Exp kenth $
1412 d5 4
1413 d71 1
1414 a71 1
1415 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression extended_expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement define_statement align_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg label_addr_part_opt label_type_part_opt from_part_opt indexed_identifier
1416 d206 1
1417 a206 1
1418         UNION identifier line_tail statement_list ENDS line_tail { $$ = astnode_create_union_decl($2, $4, @@$); }
1419 d393 5
1425 @xorcyst 1.4.0
1427 text
1428 @d3 1
1429 a3 1
1430  * $Id: parser.y,v 1.6 2004/12/16 13:22:27 kenth Exp kenth $
1431 d5 3
1432 d67 1
1433 a67 1
1434 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression extended_expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement define_statement align_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg label_addr_part_opt label_type_part_opt from_part_opt
1435 d278 1
1436 a278 1
1437         identifier { $$ = $1; }
1438 d295 6
1439 d321 2
1440 a322 2
1441         identifier '.' struc_access { $$ = astnode_create_dot($1, $3, @@$); }
1442         | identifier '.' identifier { $$ = astnode_create_dot($1, $3, @@$); }
1448 @xorcyst 1.3.5
1450 text
1451 @d3 1
1452 a3 1
1453  * $Id: parser.y,v 1.5 2004/12/14 01:50:42 kenth Exp kenth $
1454 d5 3
1455 d64 1
1456 a64 1
1457 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression extended_expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement define_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg label_type_part_opt
1458 d66 1
1459 a66 1
1460 %token _LABEL_ BYTE CHAR WORD DWORD DSB DSW DSD DATASEG CODESEG IF IFDEF IFNDEF ELSE ELIF ENDIF INCSRC INCBIN MACRO REPT WHILE ENDM ALIGN EQU DEFINE END PUBLIC EXTRN CHARMAP STRUC UNION ENDS RECORD ENUM ENDE PROC ENDP SIZEOF MASK TAG MESSAGE WARNING ERROR
1461 d70 1
1462 d147 1
1463 d152 4
1464 d169 6
1465 a174 1
1466         _LABEL_ identifier label_type_part_opt line_tail { $$ = astnode_create_label($2->label, $3, @@$); }
1467 d234 2
1468 a235 2
1469         DATASEG line_tail { $$ = astnode_create_dataseg(@@$); }
1470         ;
1471 d368 1
1472 a368 1
1473         LABEL { $$ = astnode_create_label($1, NULL, @@$); }
1474 d422 5
1475 a426 1
1476         identifier unnamed_data_statement { $$ = astnode_create_var_decl($1, $2, @@$); }
1477 d503 6
1478 a508 1
1479         EXTRN identifier_list ':' symbol_type line_tail { $$ = astnode_create_extrn($2, $4, @@$); }
1480 d524 5
1481 a528 1
1482         identifier unnamed_storage_statement { $$ = astnode_create_var_decl($1, $2, @@$); }
1488 @xorcyst 1.3.0
1490 text
1491 @d3 1
1492 a3 1
1493  * $Id: parser.y,v 1.4 2004/12/11 02:12:41 kenth Exp kenth $
1494 d5 3
1495 d61 3
1496 a63 1
1497 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement elif_statement elif_statement_list elif_statement_list_opt ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement record_decl_statement instruction expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement while_statement symbol_type enum_item_list enum_item record_field_list record_field sizeof_arg
1498 d65 2
1499 a67 1
1500 %token ':'
1501 a88 20
1502 %token _LABEL_
1503 %token BYTE CHAR WORD DWORD
1504 %token DSB DSW DSD
1505 %token DATASEG CODESEG
1506 %token IF IFDEF IFNDEF ELSE ELIF ENDIF
1507 %token INCSRC INCBIN
1508 %token MACRO REPT WHILE ENDM
1509 %token ALIGN
1510 %token EQU
1511 %token END
1512 %token PUBLIC EXTRN
1513 %token CHARMAP
1514 %token STRUC UNION ENDS
1515 %token RECORD
1516 %token ENUM ENDE
1517 %token PROC ENDP
1518 %right SIZEOF
1519 %right MASK
1520 %token TAG
1521 %token MESSAGE WARNING ERROR
1522 d142 1
1523 d160 6
1524 a165 1
1525         _LABEL_ identifier line_tail { $$ = astnode_create_label($2->label, @@$); }
1526 a264 1
1527         | struc_initializer { $$ = $1; }
1528 d278 5
1529 d317 1
1530 a317 1
1531         expression { $$ = $1; }
1532 d338 1
1533 a338 1
1534         | '^' expression { $$ = astnode_create_arithmetic(BANK_OPERATOR, $2, NULL, @@$); }
1535 d354 1
1536 a354 1
1537         LABEL { $$ = astnode_create_label($1, @@$); }
1538 d414 1
1539 d427 2
1540 a428 2
1541         expression { $$ = $1; }
1542         | expression_list ',' expression { $$ = $1; astnode_add_sibling($$, $3); }
1543 d468 1
1544 a468 1
1545         identifier EQU expression line_tail { $$ = astnode_create_equ($1, $3, @@$); }
1546 d472 6
1547 a477 1
1548         identifier '=' expression line_tail { $$ = astnode_create_assign($1, $3, @@$); }
1554 @xorcyst 1.2.0
1556 text
1557 @d3 1
1558 a3 1
1559  * $Id: parser.y,v 1.3 2004/12/09 11:17:15 kenth Exp kenth $
1560 d5 3
1561 d58 1
1562 a58 1
1563 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement instruction expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement warning_statement error_statement symbol_type enum_item_list enum_item sizeof_arg
1564 d89 1
1565 a89 1
1566 %token MACRO REPT ENDM
1567 d99 2
1568 a100 1
1569 %token SIZEOF
1570 d148 1
1571 d151 1
1572 d176 4
1573 d210 13
1574 d284 1
1575 d376 15
1576 a390 1
1577         IF expression line_tail statement_list else_part_opt ENDIF line_tail { $$ = astnode_create_if($2, $4, $5, NULL, @@$); }
1578 d394 1
1579 a394 1
1580         ELSE statement_list { $$ = $2; }
1581 d426 1
1587 @added: warning_statement, error_statement
1589 text
1590 @d3 1
1591 a3 1
1592  * $Id: parser.y,v 1.2 2004/12/06 05:06:21 kenth Exp kenth $
1593 d5 3
1594 d49 2
1595 d257 4
1596 d336 4
1602 @xorcyst 1.1.0
1604 text
1605 @d3 1
1606 a3 1
1607  * $Id: parser.y,v 1.1 2004/06/30 07:57:03 kenth Exp kenth $
1608 d5 3
1609 d50 1
1610 a50 1
1611 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement struc_decl_statement union_decl_statement enum_decl_statement instruction expression expression_opt arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt scope_access struc_access struc_initializer field_initializer_list field_initializer_list_opt field_initializer datatype storage named_data_statement unnamed_data_statement named_storage_statement unnamed_storage_statement proc_statement rept_statement label_statement message_statement symbol_type enum_item_list enum_item sizeof_arg
1612 d93 1
1613 a93 1
1614 %token MESSAGE
1615 d143 2
1616 d149 8
1622 @Initial revision
1624 text
1625 @d3 5
1626 a7 2
1627  * $Id$
1628  * $Log$
1629 d12 1
1630 a12 1
1631 #include "astnode.h"
1632 d26 1
1633 a29 1
1634     int datatype;
1635 d35 1
1636 d37 1
1637 d46 4
1638 a49 3
1639 %token <datatype> DATATYPE
1640 %token <datatype> STORAGE
1641 %type <node> identifier local_id assembly_unit statement labelable_statement statement_list if_statement ifdef_statement ifndef_statement macro_decl_statement macro_statement instruction_statement data_statement storage_statement null_statement incsrc_statement incbin_statement equ_statement assign_statement public_statement extrn_statement dataseg_statement codeseg_statement charmap_statement instruction expression arithmetic_expression comparison_expression literal label label_decl identifier_list expression_list file_specifier param_list_opt arg_list_opt else_part_opt
1642 d54 1
1643 d69 1
1644 a69 1
1645 %right '!' '~' '?'
1646 d72 3
1647 d78 1
1648 a78 1
1649 %token MACRO ENDM
1650 d84 7
1651 d96 1
1652 d101 1
1653 d109 1
1654 d114 1
1655 d133 7
1656 d143 39
1657 d185 1
1658 d189 1
1659 d193 1
1660 d197 1
1661 d201 1
1662 d206 1
1663 d210 1
1664 d214 1
1665 d226 1
1666 d229 4
1667 d240 39
1668 d282 1
1669 d296 1
1670 a296 1
1671         | '?' expression { $$ = astnode_create_arithmetic(BANK_OPERATOR, $2, NULL, @@$); }
1672 d301 1
1673 d310 1
1674 d315 1
1675 d319 1
1676 d324 1
1677 d326 1
1678 a326 1
1679         IF expression line_tail statement_list else_part_opt ENDIF line_tail { astnode_create_if($2, $4, $5, NULL, @@$); }
1680 d328 1
1681 d333 1
1682 d337 1
1683 d341 1
1684 d343 6
1685 a348 1
1686         DATATYPE expression_list line_tail { $$ = astnode_create_data($1, $2, @@$); }
1687 d350 12
1688 a361 2
1689 pragma_prefix:
1690         '.'
1691 d363 1
1692 d366 1
1693 a366 4
1694         | expression_list ',' expression {
1695                 if ($1 != NULL) { $$ = $1; astnode_add_sibling($$, $3); }
1696                 else { $$ = $3; }
1697                 }
1698 d368 1
1699 d372 1
1700 d376 1
1701 d381 1
1702 d385 1
1703 d390 1
1704 d392 1
1705 a392 1
1706         pragma_prefix identifier arg_list_opt line_tail { $$ = astnode_create_macro($2, $3, @@$); }
1707 d394 1
1708 d399 1
1709 d402 1
1710 a402 4
1711         | identifier_list ',' identifier {
1712                  if ($1 != NULL) { $$ = $1; astnode_add_sibling($$, $3); }
1713                  else { $$ = $3; }
1714                 }
1715 d404 1
1716 d408 1
1717 d412 1
1718 d416 1
1719 d418 1
1720 a418 1
1721         EXTRN identifier_list line_tail { $$ = astnode_create_extrn($2, @@$); }
1722 d420 8
1723 d429 16
1724 a444 1
1725         STORAGE expression line_tail { $$ = astnode_create_storage($1, $2, @@$); }