no longer hidden
[henge/webcc.git] / org / data / fb / 24c302-4743-4a45-845a-4249d2b1a378 / parser.y
diff --git a/org/data/fb/24c302-4743-4a45-845a-4249d2b1a378/parser.y b/org/data/fb/24c302-4743-4a45-845a-4249d2b1a378/parser.y
new file mode 100644 (file)
index 0000000..e6d145c
--- /dev/null
@@ -0,0 +1,206 @@
+/* Asset Package Compiler */
+%code requires{
+  #include <stdint.h>
+}
+%{
+  #include <stdio.h>
+  #include <string.h>
+  #include <dirent.h>
+  #include <png.h>
+  #include <apc/ir.h>
+
+  extern int lexer_init();
+  extern int lexer();
+  #define yylex lexer
+
+
+  void yyerror();
+%}
+%define parse.error verbose
+%define lr.type ielr
+
+%union {
+  uint64_t ref;
+  int val;
+  char *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         HB        // #
+//nonterminal types
+%type <ref> olink
+%type <ref> ele_svlink
+%type <ref> set_svlink
+//terminals
+%token <val> NUM
+%token <str> STR
+%token <val> SS
+%token <str> NAME
+%token <ref> REF
+%token <val> SSD
+%token <voidp> FPTR
+%token <voidp> QPTR
+// 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
+//precedence
+%precedence LP
+%precedence MP
+%precedence HP
+
+ /* Syntax Directed Translation Scheme of the APC grammar */
+
+/* Rules */
+%%
+cdat_buf:
+class_list
+;
+
+class_list:
+class_list class
+| class
+;
+
+class:
+ CLOPEN NAME {push_cdat($2);} class_block CLCLOSE              {pop_cdat();};
+;
+
+class_block:
+class_list
+| class_list set_list
+| set_list
+;
+
+set_list:
+set_list set
+| set
+;
+
+root:
+RT NUM NUM NUM                                      {insert_root($2, $3, $4);};
+;
+
+quad_file:
+QOPEN QPTR  QCLOSE                                  {insert_quad($2);};
+
+hitbox:
+HB NUM                                              {insert_hitbox($2);}
+;
+
+set_map_data:
+quad_file
+| quad_file hitbox
+| quad_file hitbox root
+| hitbox root
+| hitbox
+| root
+;
+
+set:
+SOPEN set_label set_map_data element_list {alloc_vdat();} 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 {alloc_vdat();} 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);};
+;
+
+
+set_label:
+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);};
+;
+
+olink:
+REF
+;
+
+//parent_id is the set_index of the subclass_index.
+element_list:
+element_list element MP
+| element LP
+;
+
+ele_label:
+HP NAME REF                                          {insert_ele_label($2, $3);};
+| LP NAME                                            {insert_ele_label($2, -1);};
+;
+
+ele_vlink:
+REF NAME                                             {insert_ele_vlink($1, $2);};
+;
+
+ele_svlink:
+REF
+;
+
+element:
+EOPEN ele_label hitbox root {alloc_vdat();} vdat ECLOSE                        {insert_ele(); insert_ele_vdatid();};
+| 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 {alloc_vdat();} vdat ECLOSE                             {insert_ele(); insert_ele_vdatid();};
+| 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:
+VOPEN model_list VCLOSE
+;
+
+model_list:
+model_list model
+|  model
+ ;
+
+model:
+spritesheet LP
+;
+
+spritesheet:
+spritesheet HP framesheet
+| framesheet
+;
+
+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);};
+;
+
+%%
+
+void
+yyerror (char const *s)
+{ fprintf(stderr, "%s\n", s);
+}