%{
#include <stdio.h>
#include <string.h>
+ #include <stdint.h>
#include <dirent.h>
#include <png.h>
#include <apc/ir.h>
%define parse.error verbose
%define lr.type ielr
%define api.value.type union
-%token <char*> WORD
//operators
%token CLOPEN // /
%token CLCLOSE // \
+%token SOPEN
+%token SCLOSE
+%token EOPEN
+%token ECLOSE
+%token VOPEN
+%token VCLOSE
+
%token RLS //!
%token RLE //#
%token RT //*
%token HB
%token MOD
+%token SET
+%token FS
+%token ELE
//nonterminal types
-%type <int> element
-%type <int> vdat
-%type <str> elem_label
-%type <str> label
-
+%type <uint64_t> olink
+%type <uint64_t> ele_svlink
+%type <uint64_t> set_svlink
//terminals
%token <int> NUM
-%token <int> fd
-%token <str> STR
-%token <int> VAR
+%token <char*> STR
%token <int> SS
-%token <str> FNAME
+%token <char*> NAME
+%token <uint64_t> REF
+%token <int> SSD
+%token <void*> FPTR
+%token <int> WIDTH
+%token <int> HEIGHT
+%token <int> NUM_PTRS
//precedence
%precedence LOW
%precedence MED
/* Syntax Directed Translation Scheme of the APC grammar */
-
/* Rules */
%%
-output:
-class_list {condense();} //Seperate file?
+cdat_buf:
+class_list
;
class_list:
-class_list class {inc_cbi()};
+class_list class
| class
;
class:
-label CLOPEN class_closure CLCLOSE {set_class_label($1);};
+NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
;
-class_closure:
-subclass_list
-| subclass_list set_list
+class_block:
+class_list
+| class_list set_list
| set_list
;
-subclass_list:
-subclass_list class {inc_subclass_idx();};
-| class
-;
-
set_list:
-set_list set {inc_set_index();};
+set_list set
| set
;
+root:
+RT NUM NUM NUM {insert_root($2, $3, $4);};
+;
+quad_list:
+RLS quads RLE
+;
-//set needs a label, vdat_id.
-set:
-set_map_data element_list HIGH {insert_set();};
-| element_list LOW
+quads:
+quads quad
+| quad
;
+quad:
+NUM NUM NUM REF {insert_quad($1, $2, $3, $4);};
+
+hitbox:
+HB NUM {insert_hitbox($2);}
+;
-//TODO: Figure out what to do with hitbox and root.
set_map_data:
-ref_list {};
-| ref_list hitbox
-| ref_list hitbox root
+quad_list
+| quad_list hitbox
+| quad_list hitbox root
| hitbox root
| hitbox
| root
;
-ref_list:
-RLS quads RLE
+set:
+SOPEN set_label element_list set_map_data vdat SCLOSE {insert_set(); insert_vdat();};
+| SOPEN set_label element_list set_map_data set_vlink SCLOSE {insert_set();};
+| SOPEN set_label element_list set_map_data set_svlink SCLOSE {insert_set_svlink($5); insert_set(); };
+| SOPEN set_label element_list vdat SCLOSE {insert_set(); insert_vdat();};
+| SOPEN set_label element_list set_vlink SCLOSE {insert_set(); }
+| SOPEN set_label element_list set_svlink SCLOSE {insert_set_svlink($4); insert_set();};
+| SOPEN olink SCLOSE {insert_set_olink($2);};
;
-quads:
-quads quad {inc_ref();};
-| quad
+
+set_label:
+HIGH NAME REF {insert_set_label($2,$3);};
+| LOW NAME {insert_set_label($2, -1);};
;
-quad:
-NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);};
+set_svlink:
+REF
;
-hitbox:
-HB NUM
+set_vlink:
+REF NAME {insert_set_vlink($1, $2);};
;
-root:
-RT NUM NUM NUM
+olink:
+REF
;
//parent_id is the set_index of the subclass_index.
element_list:
-element_list element HIGH {inc_ele();};
+element_list element MED
| element LOW
;
-element:
-set_label elem_label vdat LOW {insert_ele($2,$3); };
+ele_label:
+HIGH NAME REF {insert_ele_label($2, $3);};
+| LOW NAME {insert_ele_label($2, -1);};
;
-set_label:
- STR
+ele_vlink:
+REF NAME {insert_ele_vlink($1, $2);};
;
-elem_label:
- STR
+ele_svlink:
+REF
+;
+
+element:
+EOPEN ele_label hitbox root vdat ECLOSE {insert_ele(); insert_vdat();};
+| EOPEN ele_label hitbox root ele_vlink ECLOSE {insert_ele(); };
+| EOPEN ele_label hitbox root ele_svlink ECLOSE {insert_ele_svlink($5);insert_ele(); };
+| EOPEN ele_label root vdat ECLOSE {insert_ele(); insert_vdat();};
+| EOPEN ele_label root ele_vlink ECLOSE {insert_ele(); };
+| EOPEN ele_label root ele_svlink ECLOSE {insert_ele_svlink($4); insert_ele(); };
+| EOPEN olink ECLOSE {insert_ele_olink($2);};
;
vdat:
-vdat model {inc_models();};
-| model
+VOPEN model_list VCLOSE
+;
+model_list:
+model_list model
+| model
;
model:
-MOD model fdat
-| fdat
+spritesheet LOW
;
-fdat:
-label SS FNAME {insert_fdat($1, $2, $3);};
+spritesheet:
+spritesheet HIGH framesheet
+| framesheet
;
-label:
-STR REF
-| REF
+framesheet:
+SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LOW {insert_framesheet($1, $2, $3, $4, $5, $6);};
;
+frame_pointers:
+frame_pointers SSD HIGH FPTR {insert_frame_pointer($2, $4);};
+| SSD FPTR {insert_frame_pointer($1, $2);};
+;
%%
-int
-main (argc, argv)
-{
- lexer_init();
- yyparse();
- return 0;
-}
void
yyerror (char const *s)