/* Asset Package Compiler */
+%code requires{
+ #include <stdint.h>
+ #include <unitypes.h>
+}
%{
#include <stdio.h>
#include <string.h>
#include <dirent.h>
- #include "sprite.h"
- #include "symbol.h"
#include <png.h>
- #include "ir.h"
+ #include <apc/ir.h>
extern int lexer_init();
extern int lexer();
%}
%define parse.error verbose
%define lr.type ielr
-%define api.value.type union
-%token <char*> WORD
-//operators
-%token CLOPEN // /
-%token CLCLOSE // \
-%token RLS //!
-%token RLE //#
-%token RT //*
+
+%union {
+ int ref;
+ int val;
+ uint8_t *str;
+ void *voidp;
+}
+
+ //operators
+%token CLOPEN // (
+%token CLCLOSE // )
+%token SOPEN // {
+%token SCLOSE // }
+%token EOPEN // [
+%token ECLOSE // ]
+%token VOPEN // /
+%token VCLOSE // '\'
+%token MOPEN // {
+%token MCLOSE
%token HB
-//nonterminal types
-%type <int> element
-%type <int> vdat
-%type <str> elem_label
+%token ROOT
+
+%token QOPEN // !
+%token QCLOSE // @
+
+ //nonterminal types
+%type <ref> olink
+%type <ref> ele_svlink
+%type <ref> set_svlink
//terminals
-%token <int> NUM
-%token <int> fd
+%token <val> NUM
%token <str> STR
-%token <int> VAR
-%token <int> SS
+%token <val> SS
+%token <str> NAME
+%token <str> FNAME
+%token <ref> REF
+%token <val> SSD
+// Change width, height, num_ptrs to NUM because
+// when scanning, we can't determine which NUM
+// is which.
+%token <val> WIDTH
+%token <val> HEIGHT
+%token <val> NUM_PTRS
+%token <voidp> FPTR
//precedence
-%right LOW HIGH
-
-/* Syntax Directed Translation Scheme of the APC grammar */
-
+%precedence LP
+%precedence MP
+%precedence HP
+ /* Syntax Directed Translation Scheme of the APC grammar */
/* Rules */
%%
-output:
-class_list {condense();} //Seperate file?
+cdat_buf:
+class_list
+;
+
+class:
+ NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
;
class_list:
-class_list class {cbi++;};
+class_list class
| class
;
-class_label:
-STR
+class_block:
+class_list
+| class_list set_list
+| set_list
;
-class:
-class_label CLOPEN class_closure CLCLOSE {CB[cbi].label = $1;};
+set_list:
+set_list set
+| set
;
-class_closure:
-subclass_list
-| subclass_list set_list
-| set_list
+map_list:
+map_list map MP
+| map LP
;
-subclass_list:
-subclass_list class {CB[cbi].subclass_index++;};
-| class
+map:
+MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);};
+| MOPEN NAME NAME {insert_map($2, 0, 0, $3);};
;
-set_list:
-set_list set {CB[cbi].set_index++;};
-| set
+set_map_data:
+map_list MP
;
-
-//set needs a label, vdat_id.
set:
-set_map_data element_list {insert_set();};
-| element_list
+set_label vdat set_map_data element_list HP {insert_set(); insert_set_vdatid();};
+| set_label set_vlink set_map_data element_list MP {insert_set();};
+| set_label set_svlink set_map_data element_list LP {insert_set_svlink($2); insert_set(); };
+| set_label set_map_data element_list MP {insert_set(); };
+| set_label set_map_data LP {insert_set(); };
+| set_label vdat element_list MP {insert_set(); insert_set_vdatid();};
+| set_label set_vlink element_list LP {insert_set(); };
+| set_label set_svlink element_list MP {insert_set_svlink($2); insert_set();};
+| set_label element_list MP
+| set_label vdat LP
+| olink {insert_set_olink($1);};
;
-//TODO: Figure out what to do with hitbox and root.
-set_map_data:
-ref_list {};
-| ref_list hitbox
-| ref_list hitbox root
-| hitbox root
-| hitbox
-| root
+
+set_label:
+NAME REF MP {insert_set_label($1,$2);};
+| NAME LP {insert_set_label($1, -1);};
;
-ref_list:
-RLS quads RLE
+set_svlink:
+REF MP
;
-quads:
-quads quad {OB[obi].ref_index++;OB[obi].num_ref++;};
-| quad
+set_vlink:
+REF NAME HP {insert_set_vlink($1, $2);};
;
-quad:
-NUM NUM NUM NUM {insert_ref($1, $2, $3, $4);};
+olink:
+REF LP
;
-hitbox:
-HB NUM
+//parent_id is the set_index of the subclass_index.
+element_list:
+element_list element HP
+| element LP
;
-root:
-RT NUM NUM NUM
+ele_label:
+NAME REF MP {insert_ele_label($1, $2);};
+| NAME LP {insert_ele_label($1, -1);};
;
-//parent_id is the set_index of the subclass_index.
-element_list:
-element_list element {CB[cbi].set_stack[stack_index].num_ele++;};
-| element
+ele_vlink:
+REF NAME HP {insert_ele_vlink($1, $2);};
;
-element:
-set_label elem_label vdat {insert_ele($2,$3); vbi++;};
+ele_svlink:
+REF MP
;
-set_label:
- STR
+ele_map_data:
+map MP
+| map_list HP
;
-elem_label:
- STR
+element:
+ ele_label vdat ele_map_data {insert_ele(); insert_ele_vdatid();};
+| ele_label ele_vlink ele_map_data {insert_ele(); };
+| ele_label ele_svlink ele_map_data {insert_ele_svlink($2);insert_ele(); };
+| ele_label ele_map_data {insert_ele();};
+| ele_label vdat {insert_ele(); insert_ele_vdatid();};
+| ele_label ele_vlink {insert_ele(); };
+| ele_label ele_svlink {insert_ele_svlink($2); insert_ele(); ;};
+| MOPEN olink {insert_ele_olink($2);};
;
vdat:
-vdat model {VB[vbi].num_models++;};
-| model
+model_list LP
+| NAME NUM NUM NAME MP {insert_vdat($1, $2, $3, $4);};
+| NAME NAME {insert_vdat($1, 0, 0, $2);};
;
-model:
-model fdat
-| fdat
-;
+model_list:
+model_list model
+| model
+ ;
-fdat:
-label SS FNAME {insert_fdat($1, $2, $3);};
+model:
+spritesheet LP
;
-label:
-STR
+spritesheet:
+spritesheet HP framesheet
+| framesheet
;
-ref:
-NUM
+framesheet:
+SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);};
;
-FNAME:
-STR
+frame_pointers:
+frame_pointers SSD HP 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)