uint8_t for chars, lexfilename needs work
[henge/webcc.git] / src / apc / parser.y
index 07bc28b..9190bc4 100644 (file)
@@ -1,6 +1,7 @@
 /* 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
@@ -73,15 +76,15 @@ cdat_buf:
 class_list
 ;
 
+class:
+ CLOPEN NAME {push_cdat($2);} 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
@@ -93,36 +96,34 @@ set_list set
 | set
 ;
 
-root:
-RT NUM NUM NUM                                                {insert_root($2, $3, $4);};
+variant_list:
+variant_list variant
+| variant                                           
 ;
 
-quad_list:
-quad_list quad
-| quad
+hitbox:
+HB NUM
 ;
 
-quad:
-QOPEN NUM NUM NUM REF QCLOSE                                  {insert_quad($2, $3, $4, $5);};
+root:
+ROOT NUM NUM NUM
+;
 
-hitbox:
-HB NUM                                                        {insert_hitbox($2);}
+variant:
+MOPEN NAME NUM NUM NAME                                 {insert_variant($2, $3, $4, $5);};
 ;
 
 set_map_data:
-quad_list
-| quad_list hitbox
-| quad_list hitbox root
-| hitbox root
-| hitbox
-| root
+variant_list
+| variant_list HP hitbox root
+| variant_list MP root
 ;
 
 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 set_map_data element_list vdat SCLOSE           {insert_set(); insert_set_vdatid();};
+| SOPEN set_label set_map_data element_list set_vlink SCLOSE                    {insert_set();};
+| SOPEN set_label set_map_data element_list set_svlink SCLOSE                   {insert_set_svlink($5); insert_set(); };
+| SOPEN set_label element_list vdat SCLOSE                      {insert_set(); insert_set_vdatid();};
 | 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);};
@@ -130,16 +131,17 @@ SOPEN set_label element_list set_map_data vdat SCLOSE
 
 
 set_label:
-HP NAME REF                                                 {insert_set_label($2,$3);};
-| LP NAME                                                    {insert_set_label($2, -1);};
+HP NAME REF                                          {insert_set_label($2,$3);};
+| LP NAME                                            {insert_set_label($2, -1);};
 ;
 
 set_svlink:
 REF
+
 ;
 
 set_vlink:
-REF NAME                                                       {insert_set_vlink($1, $2);};
+REF NAME                                             {insert_set_vlink($1, $2);};
 ;
 
 olink:
@@ -153,36 +155,40 @@ element_list element MP
 ;
 
 ele_label:
-HP NAME REF                                                                  {insert_ele_label($2, $3);};
-| LP NAME                                                                     {insert_ele_label($2, -1);};
+HP NAME REF                                          {insert_ele_label($2, $3);};
+| LP NAME                                            {insert_ele_label($2, -1);};
 ;
 
 ele_vlink:
-REF NAME                                                                       {insert_ele_vlink($1, $2);};
+REF NAME                                             {insert_ele_vlink($1, $2);};
 ;
 
 ele_svlink:
 REF
 ;
 
+ele_map_data:
+variant_list
+
 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 ele_label ele_map_data vdat ECLOSE                        {insert_ele(); insert_ele_vdatid();};
+| EOPEN ele_label ele_map_data ele_vlink ECLOSE                                 {insert_ele(); };
+| EOPEN ele_label ele_map_data ele_svlink ECLOSE                                {insert_ele_svlink($4);insert_ele(); };
+| EOPEN ele_label vdat ECLOSE                             {insert_ele(); insert_ele_vdatid();};
+| EOPEN ele_label ele_vlink ECLOSE                                        {insert_ele(); };
+| EOPEN ele_label ele_svlink ECLOSE                                       {insert_ele_svlink($3); insert_ele(); ;}
 | EOPEN olink ECLOSE                                                           {insert_ele_olink($2);};
 ;
 
 vdat:
-VOPEN model_list VCLOSE
+VOPEN model_list 
+| VOPEN NAME NUM NUM NAME                                                 {insert_vdat($2, $3, $4, $5);};
 ;
 
 model_list:
 model_list model
-| model
-;
+|  model
+ ;
 
 model:
 spritesheet LP
@@ -194,12 +200,12 @@ spritesheet HP framesheet
 ;
 
 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);};
 ;
 
 %%