/* Asset Package Compiler */
%code requires{
#include <stdint.h>
+ #include <unitypes.h>
}
%{
#include <stdio.h>
%define lr.type ielr
%union {
- uint64_t ref;
- int NUM;
- char *str;
+ 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 QOPEN //!
-%token QCLOSE //#
-%token RT //*
+%token CLOPEN // (
+%token CLCLOSE // )
+%token SOPEN // {
+%token SCLOSE // }
+%token EOPEN // [
+%token ECLOSE // ]
+%token VOPEN // /
+%token VCLOSE // '\'
+%token MOPEN // {
+%token MCLOSE
%token HB
-%token MOD
-%token SET
-%token FS
-%token ELE
-//nonterminal types
+%token ROOT
+
+%token QOPEN // !
+%token QCLOSE // @
+
+ //nonterminal types
%type <ref> olink
%type <ref> ele_svlink
%type <ref> set_svlink
//terminals
-%token <NUM> NUM
+%token <val> NUM
%token <str> STR
-%token <NUM> SS
+%token <val> SS
%token <str> NAME
+%token <str> FNAME
%token <ref> REF
-%token <NUM> SSD
+%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
-%token <NUM> WIDTH
-%token <NUM> HEIGHT
-%token <NUM> NUM_PTRS
//precedence
%precedence LP
%precedence MP
%precedence HP
-
/* Syntax Directed Translation Scheme of the APC grammar */
/* Rules */
class_list
;
+class:
+ NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
+;
+
class_list:
class_list class
| class
;
-class:
-NAME CLOPEN {push_cdat($1);} class_block CLCLOSE {pop_cdat();};
-;
-
class_block:
class_list
| class_list set_list
| set
;
-root:
-RT NUM NUM NUM {insert_root($2, $3, $4);};
-;
-
-quad_list:
-quad_list quad
-| quad
+map_list:
+map_list map MP
+| map LP
;
-quad:
-QOPEN NUM NUM NUM REF QCLOSE {insert_quad($2, $3, $4, $5);};
-
-hitbox:
-HB NUM {insert_hitbox($2);}
+map:
+MOPEN NAME NUM NUM NAME {insert_map($2, $3, $4, $5);};
+| MOPEN NAME NAME {insert_map($2, 0, 0, $3);};
;
set_map_data:
-quad_list
-| quad_list hitbox
-| quad_list hitbox root
-| hitbox root
-| hitbox
-| root
+map_list MP
;
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);};
+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);};
;
+
set_label:
-HP NAME REF {insert_set_label($2,$3);};
-| LP NAME {insert_set_label($2, -1);};
+NAME REF MP {insert_set_label($1,$2);};
+| NAME LP {insert_set_label($1, -1);};
;
set_svlink:
-REF
+REF MP
;
set_vlink:
-REF NAME {insert_set_vlink($1, $2);};
+REF NAME HP {insert_set_vlink($1, $2);};
;
olink:
-REF
+REF LP
;
//parent_id is the set_index of the subclass_index.
element_list:
-element_list element MP
+element_list element HP
| element LP
;
ele_label:
-HP NAME REF {insert_ele_label($2, $3);};
-| LP NAME {insert_ele_label($2, -1);};
+NAME REF MP {insert_ele_label($1, $2);};
+| NAME LP {insert_ele_label($1, -1);};
;
ele_vlink:
-REF NAME {insert_ele_vlink($1, $2);};
+REF NAME HP {insert_ele_vlink($1, $2);};
;
ele_svlink:
-REF
+REF MP
+;
+
+ele_map_data:
+map MP
+| map_list HP
;
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);};
+ 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:
-VOPEN model_list VCLOSE
+model_list LP
+| NAME NUM NUM NAME MP {insert_vdat($1, $2, $3, $4);};
+| NAME NAME {insert_vdat($1, 0, 0, $2);};
;
model_list:
model_list model
-| model
-;
+| model
+ ;
model:
spritesheet LP
;
framesheet:
-SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP {insert_framesheet($1, $2, $3, $4, $5, $6);};
+SSD NAME REF HEIGHT WIDTH NUM_PTRS frame_pointers LP //{insert_framesheet($1, $2, $3, $4, $5, $6);};
;
frame_pointers:
-frame_pointers SSD HP FPTR {insert_frame_pointer($2, $4);};
-| SSD FPTR {insert_frame_pointer($1, $2);};
+frame_pointers SSD HP FPTR //{insert_frame_pointer($2, $4);};
+| SSD FPTR //{insert_frame_pointer($1, $2);};
;
%%