uint8_t for chars, lexfilename needs work
[henge/webcc.git] / src / apc / parser.y
index f42ea7b..9190bc4 100644 (file)
@@ -1,10 +1,14 @@
 /* Asset Package Compiler */
+%code requires{
+  #include <stdint.h>
+  #include <unitypes.h>
+}
 %{
   #include <stdio.h>
   #include <string.h>
   #include <dirent.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
-%token         MOD
-//nonterminal types
-%type <int> element
-%type <int> vdat
-%type <str> elem_label
-%type <str> 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
-%precedence LOW
-%precedence MED
-%precedence HIGH
+%precedence LP
+%precedence MP
+%precedence HP
 
  /* Syntax Directed Translation Scheme of the APC grammar */
 
-
 /* Rules */
 %%
-output:
-class_list                   {condense();} //Seperate file?
-;
-
-class_list:
-class_list class             {inc_cbi()};
-| class
+cdat_buf:
+class_list
 ;
 
 class:
-label CLOPEN class_closure CLCLOSE {set_class_label($1);};
+ CLOPEN NAME {push_cdat($2);} class_block CLCLOSE              {pop_cdat();};
 ;
 
-class_closure:
-subclass_list
-| subclass_list set_list
-| set_list
+class_list:
+class_list class
+| class
 ;
 
-subclass_list:
-subclass_list class           {inc_subclass_idx();};
-| class
+class_block:
+class_list
+| class_list set_list
+| set_list
 ;
 
 set_list:
-set_list set                  {inc_set_index();};
+set_list set
 | set
 ;
 
+variant_list:
+variant_list variant
+| variant                                           
+;
 
-//set needs a label, vdat_id.
-set:
-set_map_data element_list HIGH     {insert_set();};
-| element_list LOW
+hitbox:
+HB NUM
+;
+
+root:
+ROOT NUM NUM NUM
 ;
 
+variant:
+MOPEN NAME NUM NUM NAME                                 {insert_variant($2, $3, $4, $5);};
+;
 
-//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
+variant_list
+| variant_list HP hitbox root
+| variant_list MP root
 ;
 
-ref_list:
-RLS quads RLE
+set:
+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);};
 ;
 
-quads:
-quads quad                    {inc_ref();};
-| quad
+
+set_label:
+HP NAME REF                                          {insert_set_label($2,$3);};
+| LP 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 LOW
+element_list element MP
+| element LP
 ;
 
-element:
-set_label elem_label vdat LOW   {insert_ele($2,$3); };
+ele_label:
+HP NAME REF                                          {insert_ele_label($2, $3);};
+| LP NAME                                            {insert_ele_label($2, -1);};
 ;
 
-set_label:
-  STR
+ele_vlink:
+REF NAME                                             {insert_ele_vlink($1, $2);};
 ;
 
-elem_label:
-  STR
+ele_svlink:
+REF
 ;
 
-vdat:
-vdat model               {inc_models();};
-| model
+ele_map_data:
+variant_list
+
+element:
+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 
+| VOPEN NAME NUM NUM NAME                                                 {insert_vdat($2, $3, $4, $5);};
 ;
 
+model_list:
+model_list model
+|  model
+ ;
+
 model:
-MOD model fdat
-| fdat
+spritesheet LP
 ;
 
-fdat:
-label SS FNAME                {insert_fdat($1, $2, $3);};
+spritesheet:
+spritesheet HP framesheet
+| framesheet
 ;
 
-label:
-STR REF
-| REF
+framesheet:
+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);};
+;
 
 %%
-int
-main (argc, argv)
-{
-  lexer_init();
-  yyparse();
-  return 0;
-}
 
 void
 yyerror (char const *s)